Skip to content

Latest commit

ย 

History

History
817 lines (585 loc) ยท 39 KB

File metadata and controls

817 lines (585 loc) ยท 39 KB
description ๊ณ ์ˆ˜์ค€ ์–ธ์–ด์™€ ์ €์ˆ˜์ค€ ์–ธ์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ๋น„๊ต

๐Ÿ”Ÿ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ vs ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ๋™๋ฌผ ํ€ด์ฆˆ๋กœ ์•Œ์•„๋ณด๊ธฐ

1) ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” '๊ณ ๊ธ‰ ์ปดํ“จํ„ฐ'๋‹ค?

์šฐ๋ฆฌ๋Š” ์ง€๋‚œ ์žฅ๊นŒ์ง€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋งˆ์น˜ ๊ณ ์ฐจ์›์˜ ๊ฐ€์ƒ ์ปดํ“จํ„ฐ์ฒ˜๋Ÿผ ๋ฐ”๋ผ๋ดค์–ด์š”.

{% hint style="success" %} ์ฆ‰, ๋ธŒ๋ผ์šฐ์ €๋Š” HTML, CSS, JavaScript ๋“ฑ '๋ช…๋ น์–ด'๋ฅผ ๋ฐ›์•„์„œ DOM(Document Object Model)์„ ์กฐ์ž‘ํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. {% endhint %}

โ— ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ณ ์ˆ˜์ค€ ์ธํ„ฐํŽ˜์ด์Šค

  • DOM API
  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
  • Ajax / Fetch ๋“ฑ ํ†ต์‹  API

์ด๋Ÿฌํ•œ ๊ณ ์ˆ˜์ค€ API๋Š” ์šด์˜์ฒด์ œ์™€ I/O ์žฅ์น˜์˜ ๋ณต์žก์„ฑ์„ ๊ฐ์ถฐ์ค๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด๋ฒˆ ์žฅ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๋ฉด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅผ์ง€ ์ง์ ‘ ๋น„๊ตํ•ด ๋ด…์‹œ๋‹ค.

2) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ vs ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋น„๊ต

โ— ๊ทธ๋ฆผ 10-1์˜ ๊ตฌ์กฐ ์š”์•ฝ

[์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ ๋น„๊ต]

ํ”„๋กœ๊ทธ๋žจ A (๊ณ ์ˆ˜์ค€)
 โ””โ†’ ์›น ๋ธŒ๋ผ์šฐ์ € (DOM, JS๋กœ ์ œ์–ด)
     โ””โ†’ ์šด์˜์ฒด์ œ
         โ””โ†’ I/O ์žฅ์น˜ (ํ‚ค๋ณด๋“œ, ํ™”๋ฉด ๋“ฑ)

ํ”„๋กœ๊ทธ๋žจ B (์ €์ˆ˜์ค€)
 โ””โ†’ ์ง์ ‘ OS API ํ˜ธ์ถœ (์˜ˆ: C ์–ธ์–ด)
     โ””โ†’ ์šด์˜์ฒด์ œ
         โ””โ†’ I/O ์žฅ์น˜

๐Ÿ‘‰ ์›น ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฃจ๊ธฐ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ‘‰ ์‹œ์Šคํ…œ ์ˆ˜์ค€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(C ์–ธ์–ด ๋“ฑ)์€ ํ•˜๋“œ์›จ์–ด์™€ OS ๋™์ž‘์„ ๋” ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3) ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ: '๋™๋ฌผ ๋งžํžˆ๊ธฐ ๊ฒŒ์ž„'

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ๊ฐํ•œ ๋™๋ฌผ์„ ์ปดํ“จํ„ฐ๊ฐ€ ์งˆ๋ฌธ์„ ํ†ตํ•ด ์ถ”์ธกํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ง€์‹ ๊ธฐ๋ฐ˜ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค.

โ— ์˜ˆ์‹œ ๋Œ€ํ™” ํ๋ฆ„

์ปดํ“จํ„ฐ: ๋™๋ฌผ์„ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”.
์ปดํ“จํ„ฐ: ๋™๋ฌผ์ด ์ง–์Šต๋‹ˆ๊นŒ?
์‚ฌ์šฉ์ž: ์˜ˆ
์ปดํ“จํ„ฐ: ๊ฐœ์ž…๋‹ˆ๊นŒ?
์‚ฌ์šฉ์ž: ์•„๋‹ˆ์š”
์ปดํ“จํ„ฐ: ์กŒ์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ๋™๋ฌผ์ž…๋‹ˆ๊นŒ?
์‚ฌ์šฉ์ž: ์ผ€๋ฅด๋ฒ ๋กœ์Šค
์ปดํ“จํ„ฐ: "๋จธ๋ฆฌ๊ฐ€ 3๊ฐœ์ž…๋‹ˆ๊นŒ?" ๋ผ๋Š” ์งˆ๋ฌธ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

โ— ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  1. ์งˆ๋ฌธ์„ ํ†ตํ•ด ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ ๋‚ด๋ ค๊ฐ
  2. ์žŽ(Leaf) ๋…ธ๋“œ์— ๋„๋‹ฌํ•˜๋ฉด ๋™๋ฌผ์„ ์ถ”์ธก
  3. ์ถ”์ธก ์‹คํŒจ ์‹œ ์ƒˆ๋กœ์šด ๋™๋ฌผ๊ณผ ์งˆ๋ฌธ์„ ๋ฐ›์•„ ํŠธ๋ฆฌ ํ™•์žฅ
  4. ๋‹ค์Œ ๋ผ์šด๋“œ๋ถ€ํ„ฐ๋Š” ๋” ๋˜‘๋˜‘ํ•ด์ง (ํ•™์Šตํ•จ)

4) ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ: ์ˆœ์„œ๋„ ์ดํ•ดํ•˜๊ธฐ

โ— ๊ทธ๋ฆผ 10-2: ๋™๋ฌผ ํ€ด์ฆˆ ํŠธ๋ฆฌ ์ˆœ์„œ๋„ ์š”์•ฝ

๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๋™๋ฌผ์— ๋Œ€ํ•œ ์ง€์‹์œผ๋กœ ์ด๋ค„์ง„ ํŠธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ ๋‚ด๋ ค๊ฐ€๋˜, ์งˆ๋ฌธ์„ ๋˜์ง€๋ฉด์„œ ์–ด๋А ๊ฒฝ๋กœ๋กœ ๋‚ด๋ ค๊ฐˆ์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์ œ๋Œ€๋กœ ๋™๋ฌผ์„ ์ถ”์ธกํ•˜๋ฉด ๊ธฐ๋ปํ•œ๋‹ค.
  • ๋™๋ฌผ์„ ๋งžํžˆ์ง€ ๋ชปํ•˜๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ • ๋‹ต์„ ๋ฌผ์–ด๋ณธ ํ›„ ํ•ด๋‹น ๋™๋ฌผ์„ ๋งˆ์ง€๋ง‰์— ํ™•์ธํ•œ ๋™๋ฌผ๊ณผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์งˆ๋ฌธ์„ ์š”์ฒญํ•ด์„œ, ๊ทธ ์ •๋ณด๋ฅผ ํŠธ๋ฆฌ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.

์ด ํ”„๋กœ๊ทธ๋žจ์€ (์ˆœ์„œ๋„์˜ ์™ผ์ชฝ์—์„œ) ์ง€์‹ ํŠธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ์งˆ๋ฌธ์„ ๋˜์ง€๊ณ  ๋‹ต์„ ์–ป์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅธ์ชฝ์—์„œ ๊ฒฝ๋กœ์˜ ๋์— ๋„๋‹ฌํ•˜๋ฉด ๋‹ต์„ ๋งžํ˜”๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ž˜๋‚œ ์ฒด๋ฅผ ํ•˜๊ฑฐ๋‚˜ ๋™๋ฌผ์— ๋Œ€ํ•œ ์ง€ ์‹์„ ์ง€์‹ ๊ธฐ๋ฐ˜knowledge base์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ˆœ์„œ๋„๋ฅผ ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ๋ฆ„์ด ๋ฉ๋‹ˆ๋‹ค:

if (isLeaf(node)) {
  if (userAnswer === node.answer) {
    alert("๋งž์ท„์Šต๋‹ˆ๋‹ค!");
  } else {
    learnNewAnimal();
  }
} else {
  if (userAnswer === "์˜ˆ") {
    node = node.yes;
  } else {
    node = node.no;
  }
}

5) ์‹œ์Šคํ…œ ์ˆ˜์ค€๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€์˜ ์ฐจ์ด

๊ตฌ๋ถ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€ (JS/์›น) ์‹œ์Šคํ…œ ์ˆ˜์ค€ (C/์ฝ˜์†”)
์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค HTML + CSS + DOM ์กฐ์ž‘ ์ฝ˜์†” ์ถœ๋ ฅ, scanf/printf
๋ฐ์ดํ„ฐ ์ €์žฅ LocalStorage, ์„œ๋ฒ„ ํŒŒ์ผ I/O, ๋ฉ”๋ชจ๋ฆฌ ์ง์ ‘ ์ œ์–ด
์ž…๋ ฅ ์ฒ˜๋ฆฌ prompt, click ์ด๋ฒคํŠธ scanf, getchar() ๋“ฑ
ํ™•์žฅ์„ฑ ๋น ๋ฅด๊ณ  ์ง๊ด€์  ๋ณต์žกํ•˜์ง€๋งŒ ๊ฐ•๋ ฅํ•จ

์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฏธ ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์ถ”์ƒํ™”๋˜์–ด ์žˆ์ง€๋งŒ, ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ฉ”๋ชจ๋ฆฌ, ํŒŒ์ผ, ๋ฒ„ํผ ๋“ฑ ์„ธ์„ธํ•œ ๋ถ€๋ถ„๊นŒ์ง€ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ถ€๊ฐ€์„ค๋ช…: JSON โ†’ DB โ†’ ํ”„๋ก ํŠธ๊นŒ์ง€ ํ๋ฆ„๋„

์•ž์„œ ์š”์ฒญํ•˜์‹  ์˜ˆ์‹œ ํ๋ฆ„๋„๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ด์–ด์ง‘๋‹ˆ๋‹ค.

โ— JSON ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„

graph LR
  A[ํ”„๋ก ํŠธ์—”๋“œ: ์ž…๋ ฅํผ] --> B[JSON ์ƒ์„ฑ]
  B --> C[API๋กœ ์„œ๋ฒ„ ์ „์†ก]
  C --> D[DB์— ์ €์žฅ (์˜ˆ: MongoDB)]
  D --> E[API๋กœ ํด๋ผ์ด์–ธํŠธ์— ์žฌ์ „์†ก]
  E --> F[ํ”„๋ก ํŠธ์—”๋“œ ๋ Œ๋”๋ง (React, Vue)]
Loading

โ†’ ์ด ํ๋ฆ„์€ ํ˜„๋Œ€์ ์ธ SPA ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ CRUD ์ฒ˜๋ฆฌ์˜ ์ „ํ˜•์ ์ธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๊ฐ€ '์ปดํ“จํ„ฐ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ'์ด๋ผ๋Š” ๋น„์œ 

๊ณ ์ˆ˜์ค€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” DOM API๋งŒ ์•Œ๋ฉด ๋˜์ง€๋งŒ,
์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” '๊ทธ ์•„๋ž˜'๊นŒ์ง€ ๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ถ€๊ฐ€์ •๋ฆฌ : ๋™๋ฌผ ํ€ด์ฆˆ ํŠธ๋ฆฌ: JSON ๊ตฌ์กฐ & C ๊ตฌ์กฐ์ฒด ๋ณ€ํ™˜

1) ๋™๋ฌผ ํ€ด์ฆˆ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ž€?

๋™๋ฌผ ๋งžํžˆ๊ธฐ ๊ฒŒ์ž„์€ ์งˆ๋ฌธ์„ ๋˜์ง€๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์˜ˆ/์•„๋‹ˆ์˜ค๋กœ ๊ฐ€์ง€๋ฅผ ๋ป—๋Š” ์ด์ง„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ:

์งˆ๋ฌธ: ๋™๋ฌผ์ด ์ง–์Šต๋‹ˆ๊นŒ?
 โ”œโ”€ ์˜ˆ โ†’ ์งˆ๋ฌธ: ๋จธ๋ฆฌ๊ฐ€ 3๊ฐœ์ž…๋‹ˆ๊นŒ?
 โ”‚    โ”œโ”€ ์˜ˆ โ†’ ์ผ€๋ฅด๋ฒ ๋กœ์Šค
 โ”‚    โ””โ”€ ์•„๋‹ˆ์š” โ†’ ๊ฐœ
 โ””โ”€ ์•„๋‹ˆ์š” โ†’ ๊ณ ์–‘์ด

2) JSON ๊ตฌ์กฐ๋กœ ์ €์žฅํ•˜๊ธฐ

{
  "question": "๋™๋ฌผ์ด ์ง–์Šต๋‹ˆ๊นŒ?",
  "yes": {
    "question": "๋จธ๋ฆฌ๊ฐ€ 3๊ฐœ์ž…๋‹ˆ๊นŒ?",
    "yes": { "animal": "์ผ€๋ฅด๋ฒ ๋กœ์Šค" },
    "no": { "animal": "๊ฐœ" }
  },
  "no": {
    "animal": "๊ณ ์–‘์ด"
  }
}

๐Ÿ“Œ JSON ์ €์žฅ ํฌ์ธํŠธ

  • ์งˆ๋ฌธ ๋…ธ๋“œ๋Š” "question" ํ‚ค๋ฅผ ๊ฐ€์ง
  • ๋™๋ฌผ(์žŽ ๋…ธ๋“œ)์€ "animal" ํ‚ค๋งŒ ์žˆ์Œ
  • "yes", "no"๋กœ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐ

3) C ๊ตฌ์กฐ์ฒด๋กœ ํ‘œํ˜„ํ•˜๊ธฐ

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node {
    int is_question;        // 1์ด๋ฉด ์งˆ๋ฌธ, 0์ด๋ฉด ๋™๋ฌผ
    char text[128];         // ์งˆ๋ฌธ or ๋™๋ฌผ ์ด๋ฆ„
    struct Node* yes;       // ์˜ˆ ๋‹ต๋ณ€
    struct Node* no;        // ์•„๋‹ˆ์š” ๋‹ต๋ณ€
} Node;

๐Ÿ“Œ ์‚ฌ์šฉ๋ฒ• ์˜ˆ์‹œ

Node* create_animal(const char* name) {
    Node* node = malloc(sizeof(Node));
    node->is_question = 0;
    strcpy(node->text, name);
    node->yes = node->no = NULL;
    return node;
}

Node* create_question(const char* question, Node* yes_node, Node* no_node) {
    Node* node = malloc(sizeof(Node));
    node->is_question = 1;
    strcpy(node->text, question);
    node->yes = yes_node;
    node->no = no_node;
    return node;
}

5) JSON โ†” ๊ตฌ์กฐ์ฒด ๋ณ€ํ™˜ ๊ฐœ๋… ์š”์•ฝ

ํ•ญ๋ชฉ JSON ์ €์žฅ C ๊ตฌ์กฐ์ฒด ํ‘œํ˜„
๋…ธ๋“œ ์‹๋ณ„ "question" or "animal" is_question (1/0)
์งˆ๋ฌธ ๋‚ด์šฉ text ํ•„๋“œ์— ์ €์žฅ char text[128]
ํ•˜์œ„ ๋…ธ๋“œ "yes", "no" struct Node* yes, no
์ถ”๊ฐ€ ํ™•์žฅ์„ฑ ๊ตฌ์กฐ์ ์œผ๋กœ ์œ ์—ฐํ•จ ๋ฉ”๋ชจ๋ฆฌ ์ง์ ‘ ํ• ๋‹น ํ•„์š”

๋งˆ๋ฌด๋ฆฌ ์ •๋ฆฌ

JSON ๊ตฌ์กฐ๋Š” ์›น๊ณผ ์„œ๋ฒ„์—์„œ ๋‹ค๋ฃจ๊ธฐ ์ข‹๊ณ ,
C ๊ตฌ์กฐ์ฒด๋Š” ์‹œ์Šคํ…œ ์ˆ˜์ค€์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

3. ์™œ ์šฐ๋ฆฌ๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋– ๋‚˜ C ์ฝ”๋“œ๋กœ ๊ฐ€๋Š”๊ฐ€?

์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ๋งˆ์น˜ ๊ณ ๊ธ‰ ๋ฆฌ์กฐํŠธ์ฒ˜๋Ÿผ ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ–์ถ˜ ๊ณ ์ˆ˜์ค€์˜ ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค. HTML, CSS, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ์œผ๋กœ๋„ ์œ ์ € ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ , onclick, alert, appendChild() ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋งŒ์œผ๋กœ ๋ณต์žกํ•œ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒโ€ฆ

์ด "๋ฆฌ์กฐํŠธ"์˜ ์•„๋ž˜์ธต์—๋Š” ์–ด๋–ค ๋…ธ๋™์ž๋“ค์ด ํ”ผ๋•€ ํ˜๋ฆฌ๋ฉฐ ์‹œ์Šคํ…œ์„ ๊ตด๋ฆฌ๊ณ  ์žˆ์„๊นŒ์š”?

์šฐ๋ฆฌ๋Š” ์ด์ œ ๋ธŒ๋ผ์šฐ์ €๋ผ๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์˜ ์•ˆ๋ฝํ•จ์„ ์ž ์‹œ ๋– ๋‚˜, C ์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•œ ํ„ฐ๋ฏธ๋„ ๊ธฐ๋ฐ˜์˜ ๋™๋ฌผ ์ถ”์ธก ๊ฒŒ์ž„์„ ํ†ตํ•ด, ์ด ๊ณ ๊ธ‰ ๊ตฌ์กฐ์˜ ์•„๋ž˜์—์„œ ์‹ค์ œ๋กœ ์–ด๋–ค ์ผ๋“ค์ด ๋ฒŒ์–ด์ง€๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

1) ๋ธŒ๋ผ์šฐ์ €์˜ ๊ณ ์ˆ˜์ค€ ์ถ”์ƒํ™” ๊ตฌ์กฐ

[HTML/CSS/JS ์ฝ”๋“œ]
   โ†“
[DOM ํŠธ๋ฆฌ๋กœ ๋ณ€ํ™˜]
   โ†“
[์ด๋ฒคํŠธ ๋ฃจํ”„ & ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ธํ„ฐํ”„๋ฆฌํ„ฐ]
   โ†“
[ํ‘œํ˜„ ๊ณ„์ธต (๋ Œ๋”๋ง ์—”์ง„)]
   โ†“
[OS I/O, GPU, ์‚ฌ์šด๋“œ ๋“ฑ ํ•˜๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค]
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ค์šด I/O, ์žฅ์น˜ ์ œ์–ด, ์ž…๋ ฅ ์ฒ˜๋ฆฌ ๋“ฑ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ์š”์†Œ๋“ค์„ ๋ชจ๋‘ ๊ฐ์ถฐ์ค๋‹ˆ๋‹ค.
  • ์ด๋Ÿฐ ๊ตฌ์กฐ ๋•๋ถ„์— ์šฐ๋ฆฌ๋Š” โ€˜๋™๋ฌผ์ด ์ง–์Šต๋‹ˆ๊นŒ?โ€™๋ฅผ ํ™”๋ฉด์— ๋„์šฐ๊ณ  ๋ฒ„ํŠผ๋งŒ ๋งŒ๋“ค์–ด๋„, ๊ฒŒ์ž„์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ด ํŽธ๋ฆฌํ•จ์€ ๋Œ€๊ฐ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ํ†ต์ œํ•˜๊ณ  ์žˆ๋Š”์ง€, ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€๋Š” ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

2) ๊ทธ๋ž˜์„œ, C ๋ฒ„์ „์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ๊ฒƒ์€?

1. ์ง์ ‘ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ์ œ์–ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

  • ๋ธŒ๋ผ์šฐ์ €์—์„  alert() ํ•˜๋ฉด ํŒ์—…์ด ๋œจ์ง€๋งŒ,
  • C์—์„œ๋Š” printf()๋กœ ์ฝ˜์†”์— ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•˜๊ณ , scanf() ๋˜๋Š” fgets()๋กœ ์ž…๋ ฅ์„ ๋ฐ›์•„์•ผ ํ•˜์ฃ .
  • ์ž…๋ ฅ์€ ์ฆ‰๊ฐ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์—”ํ„ฐ๋ฅผ ๋ˆŒ๋Ÿฌ์•ผ ๋ฒ„ํผ์— ์ €์žฅ๋œ ์ž…๋ ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ†’ ์ด๊ฒƒ์ด ๋ฐ”๋กœ Cooked Mode (ํ‘œ์ค€ ์ž…๋ ฅ ๋ชจ๋“œ) ์ž…๋‹ˆ๋‹ค. Raw Mode๋กœ ๋ฐ”๊พธ๋ฉด ์—”ํ„ฐ ์—†์ด ํ•œ ๊ธ€์ž์”ฉ ์ฝ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.

2. ์‹œ์Šคํ…œ ์ฝœ๋กœ OS์— ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

  • C์—์„œ fgets() ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅด๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” read()๋ผ๋Š” ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•ด ์šด์˜์ฒด์ œ์—๊ฒŒ "์ž…๋ ฅ ์ค˜!"๋ผ๊ณ  ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ ์ฝœ์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์•„๋‹™๋‹ˆ๋‹ค. **๋ฌธ๋งฅ ์ „ํ™˜(context switch)**์ด ์ผ์–ด๋‚˜๋Š” ์ค‘์š”ํ•œ ํ–‰์œ„์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฌธ๋งฅ ์ „ํ™˜์ด๋ž€?
์šด์˜์ฒด์ œ๋Š” ํ˜„์žฌ ํ”„๋กœ๊ทธ๋žจ์ด ์š”์ฒญ์„ ๋งˆ์น  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ, ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก CPU๋ฅผ ๋„˜๊น๋‹ˆ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด ํ˜„์žฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ(๋ฌธ๋งฅ)๋ฅผ ์ €์žฅํ•˜๊ณ , ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ๋กœ ๋ ˆ์ง€์Šคํ„ฐ, ์Šคํƒ ๋“ฑ์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

3. ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํ‚ค๋ณด๋“œ/๋””์Šคํ”Œ๋ ˆ์ด์™€ ์—ฐ๊ฒฐ์„ ํ‰๋‚ด ๋ƒ…๋‹ˆ๋‹ค

  • ์˜ˆ์ „์—๋Š” ์ปดํ“จํ„ฐ์™€ ํ‚ค๋ณด๋“œ๋ฅผ ์—ฐ๊ฒฐํ•œ ์ผ€์ด๋ธ”์ด ์žˆ์—ˆ์ฃ . ์ง€๊ธˆ์€ ์ด๋Ÿฐ ์„ ์ด ์†Œํ”„ํŠธ์›จ์–ด์ ์œผ๋กœ ์—๋ฎฌ๋ ˆ์ด์…˜๋ฉ๋‹ˆ๋‹ค.
  • ํ„ฐ๋ฏธ๋„ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„๋Š” ์ž…๋ ฅ์„ ์ž…๋ ฅ ๋ฒ„ํผ์— ์ €์žฅํ•˜๊ณ , ํ™”๋ฉด์—๋Š” ์—์ฝ”(echo) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • ๋“œ๋ผ์ด๋ฒ„๋Š” ENTER ํ‚ค๊ฐ€ ์ž…๋ ฅ๋˜์–ด์•ผ ์ž…๋ ฅ์„ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”„ ์ž…์ถœ๋ ฅ ํ๋ฆ„: ์ „์ฒด ํ๋ฆ„๋„ ์„ค๋ช…

[์‚ฌ์šฉ์ž ํ‚ค ์ž…๋ ฅ]
    โ†“
[ํ„ฐ๋ฏธ๋„ ๋“œ๋ผ์ด๋ฒ„์˜ ์ž…๋ ฅ ๋ฒ„ํผ์— ์ €์žฅ]
    โ†“ (ENTER ์ž…๋ ฅ ์‹œ)
[์šด์˜์ฒด์ œ๊ฐ€ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ ๊นจ์›€]
    โ†“
[์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์€ ๋ฒ„ํผ์—์„œ ๋ฌธ์ž์—ด์„ ์ฝ์Œ]
    โ†“
[์ถ”๋ก  ๋กœ์ง ์ˆ˜ํ–‰ โ†’ ๋‹ค์Œ ์งˆ๋ฌธ ์ถœ๋ ฅ]
    โ†“
[ํ„ฐ๋ฏธ๋„ ์ถœ๋ ฅ ๋ฒ„ํผ โ†’ ๋””์Šคํ”Œ๋ ˆ์ด]

์ด ํ๋ฆ„์ด ๋ฐ”๋กœ ํ‘œ์ค€ I/O (stdio) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„์˜ ํ˜‘์—… ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

๐ŸŽฏ ์™œ ์›ํ˜• ๋ฒ„ํผ๊ฐ€ ํ•„์š”ํ• ๊นŒ?

์ผ๋ฐ˜ ํ์˜ ๋ฌธ์ œ์ 

  • ์ผ๋ฐ˜ FIFO ํ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ผ ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•œ ์นธ์”ฉ ์•ž์œผ๋กœ ๋‹น๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ„์‚ฐ์ด ๋งŽ๊ณ  ๋น„ํšจ์œจ์ ์ด์ฃ .

์›ํ˜• ๋ฒ„ํผ(Circular Buffer)

  • ํ๋ฅผ ์› ๋ชจ์–‘์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • ์•ž์—์„œ ๋นผ๊ณ , ๋’ค์—์„œ ๋„ฃ๊ณ , ์ธ๋ฑ์Šค๋Š” (ํ˜„์žฌ + 1) % ๋ฒ„ํผ ๊ธธ์ด๋กœ ๊ณ„์‚ฐ.
  • ๊ณต๊ฐ„ ์žฌํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ์Šต๋‹ˆ๋‹ค.
g o
r
f
in โ†’ ๋ฒ„ํผ ์ถ”๊ฐ€
out โ†’ ๋ฒ„ํผ ์ฝ๊ธฐ

์ด ๊ตฌ์กฐ๋Š” ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„, ๋„คํŠธ์›Œํฌ ๋ฒ„ํผ, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ๋“ฑ์—์„œ ์•„์ฃผ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“Ž ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (stdio)์˜ ์—ญํ• 

์—ญํ•  ์„ค๋ช…
์ž…๋ ฅ ๋ฒ„ํผ ํ•œ ๋ฒˆ์˜ ์‹œ์Šคํ…œ ์ฝœ๋กœ ๋‹ค๋Ÿ‰ ์ž…๋ ฅ์„ ๋ฐ›์•„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ
์ถœ๋ ฅ ๋ฒ„ํผ ์ถœ๋ ฅ ์š”์ฒญ์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋ฐ์ดํ„ฐ ๋ˆ„์  โ†’ ๋“ฑ ์‹ ํ˜ธ์— ๋งž์ถฐ ํ•œ ๋ฒˆ์— ์ถœ๋ ฅ
์„ฑ๋Šฅ ํ–ฅ์ƒ ์‹œ์Šคํ…œ ์ฝœ ํ˜ธ์ถœ ์ˆ˜๋ฅผ ์ค„์—ฌ ๋ฌธ๋งฅ ์ „ํ™˜ ๋น„์šฉ ์ ˆ๊ฐ
๊ตฌ์กฐ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ง ๋ฒ„ํผ ๊ตฌ์กฐ ํ™œ์šฉ (FIFO์ง€๋งŒ ํ•œ์ชฝ๋งŒ ์›€์ง์ด๋Š” ํ ํ˜•ํƒœ)

๐Ÿงช ์‹ค์ œ ๋™๋ฌผ ์ถ”์ธก ํ”„๋กœ๊ทธ๋žจ ์˜ˆ์‹œ์—์„œ์˜ ํ๋ฆ„ (C ๊ธฐ๋ฐ˜)

  1. ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘
  2. ์‚ฌ์šฉ์ž์—๊ฒŒ ์งˆ๋ฌธ ์ถœ๋ ฅ (printf)
  3. scanf๋กœ ์ž…๋ ฅ ๋Œ€๊ธฐ (ENTER ์ „๊นŒ์ง€๋Š” ์Šฌ๋ฆฝ ์ƒํƒœ)
  4. ๋Œ€๋‹ต์— ๋”ฐ๋ผ ์ง€์‹ ํŠธ๋ฆฌ ํƒ์ƒ‰
  5. ์ถ”์ธก ์‹คํŒจ ์‹œ, ์ƒˆ๋กœ์šด ๋™๋ฌผ/์งˆ๋ฌธ ์ž…๋ ฅ ๋ฐ›์•„ ์ง€์‹ ํŠธ๋ฆฌ ํ™•์žฅ
  6. ๋ฃจํ”„ ๋ฐ˜๋ณต

์ง€์‹ ํŠธ๋ฆฌ๋Š” C์—์„œ๋Š” ๋™์  ๊ตฌ์กฐ์ฒด๋กœ ๊ตฌํ˜„๋˜๋ฉฐ, ๋งํฌ๋“œ ํŠธ๋ฆฌ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ DOM ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹๊ณผ ๊ตฌ์กฐ๋Š” ๋น„์Šทํ•˜์ง€๋งŒ, ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น/ํ•ด์ œ (malloc/free)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ ์•„์ฃผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋˜ "์งˆ๋ฌธ โ†’ ์˜ˆ/์•„๋‹ˆ์š” โ†’ ๋‹ค์Œ ์งˆ๋ฌธ" ํ๋ฆ„์€
C ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚ด๋ ค์˜ค๋ฉด ํ•œ ๋‹จ๊ณ„ ํ•œ ๋‹จ๊ณ„ ๋ชจ๋‘ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์งœ์•ผ ํ•  ๊ตฌ์กฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

  • HTML์˜ <div> ํ•˜๋‚˜๊ฐ€ C์—์„  ๊ตฌ์กฐ์ฒด ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ
  • onclick์ด๋ฒคํŠธ๊ฐ€ C์—์„  ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ์Šคํ…œ ์ฝœ
  • document.appendChild()๊ฐ€ C์—์„  malloc ํ›„ ํฌ์ธํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํŠธ๋ฆฌ ํ™•์žฅ

๐Ÿ“Œ ์ •๋ฆฌํ•˜์ž๋ฉดโ€ฆ

๋น„๊ต ํ•ญ๋ชฉ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ C ํ„ฐ๋ฏธ๋„ ํ™˜๊ฒฝ
UI ๊ตฌ์„ฑ HTML ํƒœ๊ทธ printf ๋ฌธ์ž์—ด ์ถœ๋ ฅ
ํŠธ๋ฆฌ ๊ตฌ์กฐ DOM ํŠธ๋ฆฌ ๊ตฌ์กฐ์ฒด ๊ธฐ๋ฐ˜ ๋งํฌ๋“œ ํŠธ๋ฆฌ
์ž…๋ ฅ ์ฒ˜๋ฆฌ ๋ฒ„ํŠผ + ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ scanf + ์‹œ์Šคํ…œ ์ฝœ (read)
๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ž๋™ ์ˆ˜๋™ (malloc/free)
๋ฒ„ํผ๋ง ์ž๋™, ๊ฑฐ์˜ ์‹ ๊ฒฝ ์•ˆ ์”€ ๋“œ๋ผ์ด๋ฒ„ ๋ฒ„ํผ + stdio ๋ฒ„ํผ ์ง์ ‘ ๊ณ ๋ ค
์‹œ์Šคํ…œ ์ฝœ ์ถ”์ƒํ™”๋จ ์ง์ ‘ ํ˜ธ์ถœํ•ด์•ผ ํ•จ (read, write)
์„ฑ๋Šฅ ๋ฌธ๋งฅ ์ „ํ™˜ ์‹ ๊ฒฝ ์•ˆ ์จ๋„ ๋จ ๋ฌธ๋งฅ ์ „ํ™˜ ๊ณ ๋ ค ํ•„์š” (์Šฌ๋ฆฝ, ์Šค์ผ€์ค„๋ง ๋“ฑ)

4. ๋™๋ฌผ ์ถ”์ธก ๊ฒŒ์ž„: HTML/CSS/JS vs C ์ฝ”๋“œ ๋น„๊ต ๋ถ„์„

1) ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ ๋น„๊ต

ํ•ญ๋ชฉ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ (HTML+JS) ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ (C ํ„ฐ๋ฏธ๋„)
์‹คํ–‰ ํ™˜๊ฒฝ ๋ธŒ๋ผ์šฐ์ € (์›นํŽ˜์ด์ง€) ํ„ฐ๋ฏธ๋„ (CLI)
์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค HTML <button>, <input> ์ฝ˜์†” ์ถœ๋ ฅ printf, ์ž…๋ ฅ scanf
์ง€์‹ ํŠธ๋ฆฌ ๊ตฌ์กฐ HTML <div string="์งˆ๋ฌธ/๋™๋ฌผ"> ํŠธ๋ฆฌ ๊ตฌ์กฐ์ฒด ๊ธฐ๋ฐ˜ ์ด์ง„ ํŠธ๋ฆฌ (๋…ธ๋“œ ๊ตฌ์กฐ์ฒด)
ํŠธ๋ฆฌ ์ €์žฅ ๋ฐฉ์‹ DOM ๋…ธ๋“œ์— ์ˆจ๊ฒจ์„œ ์ €์žฅ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๊ตฌ์กฐ์ฒด + ํฌ์ธํ„ฐ
์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ onclick, $(selector).click() if/else, scanf() ์ž…๋ ฅ ๋ถ„๊ธฐ
์ƒํƒœ ์ „ํ™˜ DOM ํƒ์ƒ‰ ๋ฐ ์ž์‹ ๋…ธ๋“œ ์ด๋™ ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ ์ด๋™ (node = node->yes)
์ดˆ๊ธฐํ™” restart() ํ•จ์ˆ˜ ๋ฃจํŠธ ํฌ์ธํ„ฐ ์ดˆ๊ธฐํ™”
๋ฐ˜๋ณต ๊ตฌ์กฐ ์‚ฌ์šฉ์ž ํด๋ฆญ ์ด๋ฒคํŠธ ์ค‘์‹ฌ ๋ฌดํ•œ ๋ฃจํ”„ (while(1))
๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ž๋™ (DOM ํŠธ๋ฆฌ ์กฐ์ž‘) ์ˆ˜๋™ (malloc / free)
์‹คํ–‰ ํ๋ฆ„ ๋น„๋™๊ธฐ์  ์ธํ„ฐ๋ž™์…˜ (์ด๋ฒคํŠธ ๋ฃจํ”„) ๋™๊ธฐ์  ํ๋ฆ„ (์ž…๋ ฅ โ†’ ์ฒ˜๋ฆฌ โ†’ ์ถœ๋ ฅ)

2) ์ง€์‹ ํŠธ๋ฆฌ ๊ตฌํ˜„ ์ฝ”๋“œ ๋น„๊ต

๐Ÿงฑ HTML/JS (๋ธŒ๋ผ์šฐ์ €)

<div id="root" class="invisible">
  <div string="๋™๋ฌผ์ด ์ง–์Šต๋‹ˆ๊นŒ?">
    <div string="๊ฐœ"></div>
    <div string="๊ณ ์–‘์ด"></div>
  </div>
</div>
function question(new_node, html) {
  $('#dialog').append(html);
  if ($(new_node).length == 0) return true;
  node = new_node;
  $('#dialog').append($(node).attr('string') + '?');
  return false;
}
  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ: ์‹ค์ œ ๊ตฌ์กฐ๋Š” HTML DOM, ๋ฐ์ดํ„ฐ๋Š” <div> ์š”์†Œ์˜ string ์†์„ฑ
  • ๋…ธ๋“œ ํƒ์ƒ‰: $(node).children(':first-child') ์‹์œผ๋กœ DOM ํƒ์ƒ‰
  • ํ™•์žฅ ๋ฐฉ์‹: wrap()๊ณผ prepend()๋กœ ์ƒˆ๋กœ์šด ์งˆ๋ฌธ์„ ์‚ฝ์ž…

โš™๏ธ C ์ฝ”๋“œ (ํ„ฐ๋ฏธ๋„)

typedef struct node {
  char *string;
  struct node *yes;
  struct node *no;
} Node;

Node *newNode(char *str) {
  Node *n = malloc(sizeof(Node));
  n->string = strdup(str);
  n->yes = n->no = NULL;
  return n;
}
void ask(Node *node) {
  if (node->yes == NULL && node->no == NULL) {
    printf("%s์ž…๋‹ˆ๊นŒ? (y/n) ", node->string);
    char response;
    scanf(" %c", &response);
    if (response == 'y') printf("๋งž์ท„์Šต๋‹ˆ๋‹ค!\n");
    else {
      // ์ƒˆ๋กœ์šด ์งˆ๋ฌธ/๋™๋ฌผ ์ถ”๊ฐ€...
    }
  } else {
    printf("%s (y/n) ", node->string);
    char response;
    scanf(" %c", &response);
    if (response == 'y') ask(node->yes);
    else ask(node->no);
  }
}
  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ: ๊ตฌ์กฐ์ฒด ๊ธฐ๋ฐ˜ ์ด์ง„ ํŠธ๋ฆฌ, malloc์œผ๋กœ ์ƒ์„ฑ
  • ๋…ธ๋“œ ํƒ์ƒ‰: ๋‹จ์ˆœํ•œ ํฌ์ธํ„ฐ ์ด๋™ (node->yes, node->no)
  • ํ™•์žฅ ๋ฐฉ์‹: strdup()์œผ๋กœ ๋ฌธ์ž์—ด ๋ณต์‚ฌ ํ›„ ์ƒˆ ๋…ธ๋“œ ์ƒ์„ฑ

3) ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ I/O ๋ฐฉ์‹ ๋น„๊ต

๊ธฐ๋Šฅ HTML+JS C (ํ„ฐ๋ฏธ๋„)
์ž…๋ ฅ ๋ฐฉ์‹ <button>, <input> ํด๋ฆญ โ†’ ์ด๋ฒคํŠธ ๋ฐœ์ƒ scanf, getchar ๋“ฑ์œผ๋กœ ๋™๊ธฐ ์ž…๋ ฅ
์ถœ๋ ฅ ๋ฐฉ์‹ <div>์— ๋ฌธ์ž์—ด append printf()๋กœ ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅ
์ธํ„ฐ๋ž™์…˜ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ (click) ์ˆœ์ฐจ์  ํ๋ฆ„, ์ž…๋ ฅ ์—†์œผ๋ฉด ๋Œ€๊ธฐ
๋ฌธ๋งฅ ์ „ํ™˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฒ˜๋ฆฌ, ์‚ฌ์šฉ์ž๋Š” ์ธ์‹ ๋ชปํ•จ read() โ†’ ์‹œ์Šคํ…œ ์ฝœ โ†’ ๋ฌธ๋งฅ ์ „ํ™˜ ๋ฐœ์ƒ
์‹œ์Šคํ…œ ์ฝœ ์‚ฌ์šฉ ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์—์„œ ์ถ”์ƒํ™”๋จ read, write, malloc, free ๋“ฑ ๋ช…์‹œ์  ํ˜ธ์ถœ

4) ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ๋ฐ ๊ด€๋ฆฌ ์ฐจ์ด

ํ•ญ๋ชฉ ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „ C ๋ฒ„์ „
๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ DOM์œผ๋กœ ๊ด€๋ฆฌ ์ง์ ‘ malloc, free ํ˜ธ์ถœ
ํŠธ๋ฆฌ ์ €์žฅ ๋ฌธ์„œ ๊ตฌ์กฐ๋กœ ์ž๋™ ์ €์žฅ ํž™์— ๋…ธ๋“œ ๊ตฌ์กฐ์ฒด๋กœ ์ €์žฅ
๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋ธŒ๋ผ์šฐ์ € GC ์ž๋™ ์ฒ˜๋ฆฌ ๋ช…์‹œ์  ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ํ•„์š”
๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฅ˜ ์œ„ํ—˜ ๋‚ฎ์Œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, dangling pointer ์œ„ํ—˜

5) ํ•ต์‹ฌ ๊ฐœ๋… ๋น„๊ต ์š”์•ฝํ‘œ

๊ตฌ๋ถ„ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ C ํ™˜๊ฒฝ
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ ์„ ์–ธ์  + ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ช…๋ นํ˜• + ์ ˆ์ฐจ์ 
๋ฐ์ดํ„ฐ ํ‘œํ˜„ DOM ์—˜๋ฆฌ๋จผํŠธ ์†์„ฑ ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ
์œ ์ € ์ด๋ฒคํŠธ ํด๋ฆญ, ํ‚ค ์ž…๋ ฅ โ†’ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋ฌธ์ž ์ž…๋ ฅ โ†’ ์กฐ๊ฑด ๋ถ„๊ธฐ
๋ Œ๋”๋ง ๋ธŒ๋ผ์šฐ์ € ์—”์ง„ ์ž๋™ ์ฒ˜๋ฆฌ ํ…์ŠคํŠธ ์ถœ๋ ฅ๋งŒ
๋ฒ„ํผ๋ง ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€ ๋ฒ„ํผ ์ž๋™ stdio, ๋“œ๋ผ์ด๋ฒ„, OS ๋ ˆ๋ฒจ ๋ฒ„ํผ
๋””๋ฒ„๊น… ๋ฐฉ์‹ ์ฝ˜์†”(log), ๋ธŒ๋ผ์šฐ์ € ํˆด gdb, printf ๋””๋ฒ„๊น…
์šด์˜์ฒด์ œ ์ถ”์ƒํ™” ๊ฑฐ์˜ ์™„์ „ ์ถ”์ƒํ™” ์šด์˜์ฒด์ œ ํ˜ธ์ถœ ์ง์ ‘ ์‚ฌ์šฉ
์ฝ”๋“œ ๋ณต์žก๋„ ์งง๊ณ  ๊ฐ„๋‹จ ๊ธธ๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ํ•„์š”

โœ… ์–ด๋–ค ์ƒํ™ฉ์— ์–ด๋–ค ๋ฐฉ์‹์ด ์ข‹์„๊นŒ?

๋ชฉ์  ๋ธŒ๋ผ์šฐ์ € ๋ฐฉ์‹์ด ์œ ๋ฆฌ C ๋ฐฉ์‹์ด ์œ ๋ฆฌ
์‚ฌ์šฉ์ž์™€ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ UI โœ… ์˜ˆ โŒ ์•„๋‹ˆ์š”
์‹œ์Šคํ…œ ๋™์ž‘ ์›๋ฆฌ ํ•™์Šต โŒ ํ•œ๊ณ„ ์žˆ์Œ โœ… ์•„์ฃผ ์œ ๋ฆฌ
๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘ โœ… ๋น ๋ฆ„ โŒ ๋А๋ฆผ
๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” / ๊ณ ์„ฑ๋Šฅ โŒ ๋ธŒ๋ผ์šฐ์ € ํ•œ๊ณ„ ์žˆ์Œ โœ… ๊ฐ€๋Šฅ
์žฅ์น˜ ์ œ์–ด, ๋“œ๋ผ์ด๋ฒ„ ๊ตฌํ˜„ โŒ ๋ถˆ๊ฐ€๋Šฅ โœ… ์‹œ์Šคํ…œ ์ง์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ
์œ ์ง€๋ณด์ˆ˜ โœ… DOM ํŠธ๋ฆฌ ํ™œ์šฉ โŒ ํฌ์ธํ„ฐ/๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์–ด๋ ค์›€

๐Ÿ“Œ ๊ฒฐ๋ก 

  • ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „์€ ๋น ๋ฅด๊ฒŒ UI๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ๋‚˜ I/O ์ฒ˜๋ฆฌ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋„์™€์ฃผ๋ฏ€๋กœ ํ•™์Šต์ด ์‰ฌ์›€
  • C ๋ฒ„์ „์€ ์ž…์ถœ๋ ฅ, ๋ฒ„ํผ๋ง, ์‹œ์Šคํ…œ ์ฝœ, ๋ฌธ๋งฅ ์ „ํ™˜ ๋“ฑ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ๊ฐœ๋…์„ ๋ชจ๋‘ ์ฒดํ—˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‚ด๋ถ€ ๋™์ž‘์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ ํ•ฉ

๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค! ์•„๋ž˜๋Š” **"์ถ”์ƒํ™”๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๊ฐœ์„ "**์ด๋ผ๋Š” ์ฃผ์ œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ, ๊ฐ€๋…์„ฑ ์ข‹๊ณ  ์Šคํ† ๋ฆฌํ…”๋ง ๊ตฌ์กฐ๋กœ ์ •๋ฆฌํ•œ ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๋‹ค.


๐Ÿง  ์ถ”์ƒํ™”๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๊ฐœ์„  โ€“ C์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ ‘๊ทผ ๋ฐฉ์‹ ์ฐจ์ด

1) ์ƒํ™ฉ ์„ค์ •: ์™œ ๋งค๋ฒˆ โ€˜๊ณ ์–‘์ด vs ๊ฐœโ€™๋ถ€ํ„ฐ ์‹œ์ž‘ํ• ๊นŒ?

๋™๋ฌผ ์ถ”์ธก ๊ฒŒ์ž„์„ ํ•ด๋ณธ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ์•Œ๊ฒ ์ง€๋งŒ,
ํ”„๋กœ๊ทธ๋žจ์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค ์ง€์‹ ํŠธ๋ฆฌ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ, "๊ฐœ์™€ ๊ณ ์–‘์ด" ์ˆ˜์ค€์—์„œ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

"์–ด์ œ๋Š” ์ผ€๋ฅด๋ฒ ๋กœ์Šค๊นŒ์ง€ ํ•™์Šตํ–ˆ๋Š”๋ฐ..."
์˜ค๋Š˜ ์‹คํ–‰ํ•˜๋‹ˆ ๋˜ ๊ฐœ์™€ ๊ณ ์–‘์ด๋งŒ ์•„๋Š” ๊ฒŒ์ž„์ด๋ผ๋ฉด ์‹ค๋ง์Šค๋Ÿฝ๊ฒ ์ฃ .

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์ด์ „์— ํ•™์Šต๋œ ์ง€์‹์„ ์ €์žฅํ•˜๊ณ , ๋‹ค์Œ ์‹คํ–‰ ์‹œ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ, ์ฆ‰ ์ƒํƒœ์˜ ์ง€์†์„ฑ(persistence)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2) C ์–ธ์–ด๋Š” ์–ด๋–ป๊ฒŒ ์ด๊ฑธ ํ•ด๊ฒฐํ–ˆ๋‚˜?

C ์–ธ์–ด๋Š” ์ด๋ฅผ ๊ฝค ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ์ด์œ ๋Š” ์šด์˜์ฒด์ œ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”๊ฐ€ C ์–ธ์–ด์— ์ž˜ ๋…น์•„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

โœ… ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ์ถ”์ƒํ™” ํ™œ์šฉ

์šด์˜์ฒด์ œ๋Š” ํŒŒ์ผ๊ณผ ์žฅ์น˜๋ฅผ โ€˜๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šคโ€™๋กœ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ํŒŒ์ผ์—์„œ ์ฝ๋Š” ์ฝ”๋“œ == ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์„ ๋ฐ›๋Š” ์ฝ”๋“œ
=> ๋‘˜ ๋‹ค fgets(), fputs() ๋“ฑ์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

์ด ๋•๋ถ„์— ๋™๋ฌผ ์ถ”์ธก ๊ฒŒ์ž„์„ C๋กœ ๋งŒ๋“ค๋ฉด,

  • ํ•™์Šต ๋‚ด์šฉ์„ ํŒŒ์ผ์— ์ €์žฅ(-o ์˜ต์…˜)ํ•˜๊ฑฐ๋‚˜
  • ์ €์žฅ๋œ ๋‚ด์šฉ์„ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์™€์„œ ์ด์–ดํ•˜๊ธฐ(-i ์˜ต์…˜)๊ฐ€ ๋งค์šฐ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

๐ŸŽฏ ์˜ˆ์‹œ ํ๋ฆ„

gta -o training.txt
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ ๋™๋ฌผ๊ณผ ์งˆ๋ฌธ์„ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ๋‚ด์šฉ์ด training.txt์— ์ €์žฅ๋จ
  • ๋‹ค์Œ ์‹คํ–‰ ์‹œ gta -i training.txt๋กœ ์ด์ „ ์ƒํƒœ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Œ

์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š”?
C ํ”„๋กœ๊ทธ๋žจ์ด ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ์ž…๋ ฅ/์ถœ๋ ฅ ์ถ”์ƒํ™”๋ฅผ ์ง์ ‘ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

3) ๋ธŒ๋ผ์šฐ์ €(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ)๋Š” ์™œ ์–ด๋ ค์šด๊ฐ€?

๋ฐ˜๋ฉด ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์€ C์ฒ˜๋Ÿผ ์ง์ ‘ ์‹œ์Šคํ…œ ์ž์›์„ ์ œ์–ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์™œ๋ƒํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ๋ณด์•ˆ ๋ชจ๋ธ๊ณผ ์ถ”์ƒํ™” ๋ ˆ์ด์–ด๋ฅผ ๋” ๋†’๊ฒŒ ์„ค์ •ํ•ด๋‘๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

โŒ ์ถ”์ƒํ™”๊ฐ€ โ€˜์ˆจ๊ฒจ์ ธ ์žˆ๋Š”โ€™ ๊ตฌ์กฐ

์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ,
๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ฝ”๋“œ      โ†’       ๋ธŒ๋ผ์šฐ์ € API      โ†’     ์šด์˜์ฒด์ œ I/O

       X                   O                   O

โ— ๋ถˆํŽธํ•œ ์ 

  • ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด File API, IndexedDB, LocalStorage ๋“ฑ ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ API๋ฅผ ์จ์•ผ ํ•จ
  • ์ด API๋“ค์€ ์ผ๊ด€๋œ ์ž…์ถœ๋ ฅ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์„ค๊ณ„์ฒ ํ•™์„ ๊ฐ€์ง
  • ๋”ฐ๋ผ์„œ ๊ฒŒ์ž„์˜ ์ƒํƒœ ์ €์žฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฐฉ์‹์˜ ์ฝ”๋“œ๋ฅผ ์ƒˆ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•จ

4) ์š”์•ฝ ๋น„๊ต

ํ•ญ๋ชฉ C ํ”„๋กœ๊ทธ๋žจ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ (๋ธŒ๋ผ์šฐ์ €)
์‹œ์Šคํ…œ ์ ‘๊ทผ ํŒŒ์ผ/์žฅ์น˜ ๋ชจ๋‘ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ œํ•œ์  ์ ‘๊ทผ๋งŒ ํ—ˆ์šฉ
์ƒํƒœ ์ €์žฅ ๋ฐฉ์‹ fopen, fgets, fputs ๋“ฑ LocalStorage, IndexedDB ๋“ฑ ๋ณ„๋„ API ํ•„์š”
ํ•™์Šต ์ง€์†์„ฑ ๊ตฌํ˜„ ๋‚œ์ด๋„ ๋‚ฎ์Œ (ํŒŒ์ผ๋งŒ ๋‹ค๋ฃจ๋ฉด ๋จ) ๋†’์Œ (์ถ”๊ฐ€ ๊ธฐ์ˆ  ํ•™์Šต ํ•„์š”)
์žฅ์  ๋‹จ์ˆœํ•œ ์ฝ”๋“œ๋กœ ๋‹ค์–‘ํ•œ ์ž…๋ ฅ/์ถœ๋ ฅ ๊ตฌํ˜„ ๊ฐ€๋Šฅ ์‚ฌ์šฉ์ž ๋ณด์•ˆ์— ๊ฐ•ํ•จ, ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ™˜๊ฒฝ
๋‹จ์  ์‹œ์Šคํ…œ ์ž์› ์ ‘๊ทผ ์ œํ•œ ์—†์Œ โ†’ ๋ณด์•ˆ ์œ„ํ—˜ ๋™์ผ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‹œ API ๋‹ค์–‘ํ•˜๊ณ  ๋ณต์žกํ•จ

5) ๐ŸŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์„ค๊ณ„์— ๋Œ€ํ•œ ๊ตํ›ˆ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ํ”Œ๋žซํผ์€ ์–ด๋–ค ์ถ”์ƒํ™”๋ฅผ ์–ด๋–ป๊ฒŒ ๋“œ๋Ÿฌ๋‚ผ ๊ฒƒ์ธ๊ฐ€์— ๋”ฐ๋ผ ์ƒ์‚ฐ์„ฑ๊ณผ ํŽธ์˜์„ฑ์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

  • C๋Š” "์‹œ์Šคํ…œ์— ๊ฐ€๊น๊ฒŒ ์ผํ•˜์ž"๋Š” ์ฒ ํ•™ ์•„๋ž˜, ์ž…์ถœ๋ ฅ๊ณผ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ํ†ตํ•ฉ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ณด์•ˆ๊ณผ ์œ ์ € ํŽธ์˜๋ฅผ ์ค‘์‹œํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ์ถ”์ƒํ™”๋ฅผ ๊ฐœ๋ฐœ์ž์—๊ฒŒ์„œ ์ˆจ๊ธฐ๊ณ , ๋Œ€์‹  ์•ˆ์ „ํ•œ ๊ณ ์ˆ˜์ค€ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด๋กœ ์ธํ•ด ๋™์ผํ•œ ๊ธฐ๋Šฅ์ด๋ผ๋„ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜๋ฉฐ, ์ถ”์ƒํ™” ์ˆ˜์ค€์— ๋”ฐ๋ผ ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ๋„ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๐Ÿ“ฆ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ‘œ์ค€ ์ž…์ถœ๋ ฅ: ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‹œ์ž‘์ 

1) ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๊ธฐ๊นŒ์ง€ โ€“ ์šฐ๋ฆฌ๊ฐ€ ๋ณด์ง€ ๋ชปํ•œ ์ค€๋น„ ์ž‘์—…๋“ค

C๋กœ ์ž‘์„ฑํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ./a.out์ด๋‚˜ gta ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ˆœ๊ฐ„, ๋‹จ์ˆœํžˆ ๋ฉ”์ธ ํ•จ์ˆ˜๋ถ€ํ„ฐ ์‹คํ–‰๋˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๊ทธ ์ด์ „์— ์•„์ฃผ ์ค‘์š”ํ•œ ์ค€๋น„ ์ž‘์—…์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

์ด๊ฑธ ๋‹ด๋‹นํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(runtime library) ์ž…๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•˜๋Š” ์ผ

  • ์Šคํƒ๊ณผ ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ์ดˆ๊ธฐํ™”
  • ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ์žฅ์น˜ ํŒŒ์ผ ์˜คํ”ˆ
  • stdin, stdout, stderr ๊ฐ™์€ ๊ธฐ๋ณธ ์ž…์ถœ๋ ฅ ํ•ธ๋“ค ์ค€๋น„

์ด๋Ÿฐ ์ค€๋น„๊ฐ€ ์—†์œผ๋ฉด printf, scanf, fgets ๊ฐ™์€ ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. C์—์„œ๋Š” ์ด ์ค€๋น„๊ฐ€ crt0 ๋˜๋Š” crt1.o๋ผ๋Š” ์Šคํƒ€ํŠธ์—… ์ฝ”๋“œ(startup object)์—์„œ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

2) stdio: C์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๐Ÿ“ stdio์˜ ํ•ต์‹ฌ ๊ฐœ๋…: ๋ฒ„ํผ๋ง๋œ ์ž…์ถœ๋ ฅ

ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ํฌ์ธํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

์ด๋ฆ„ ์„ค๋ช… ๋””์Šคํฌ๋ฆฝํ„ฐ
stdin ํ‘œ์ค€ ์ž…๋ ฅ 0
stdout ํ‘œ์ค€ ์ถœ๋ ฅ 1
stderr ํ‘œ์ค€ ์˜ค๋ฅ˜ ์ถœ๋ ฅ 2

๐Ÿค” stdout๊ณผ stderr์˜ ์ฐจ์ด๋Š”?

  • ๋‘˜ ๋‹ค ์ฝ˜์†”๋กœ ์ถœ๋ ฅ๋จ
  • ํ•˜์ง€๋งŒ ๋ฒ„ํผ๋ง ๋ฐฉ์‹์ด ๋‹ค๋ฆ„:
    • stdout: ๋ผ์ธ ๋ฒ„ํผ โ†’ ์ค„ ๋ฐ”๊ฟˆ ์ „๊นŒ์ง€ ์ €์žฅ๋˜๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์ด ์ค‘๋‹จ๋˜๋ฉด ์œ ์‹ค๋  ์ˆ˜๋„ ์žˆ์Œ
    • stderr: ๋น„๋ฒ„ํผ๋ง โ†’ ์ฆ‰์‹œ ์ถœ๋ ฅ๋จ

๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ํ•ญ์ƒ stderr๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒŒ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์žฌ๋ฐŒ๋Š” ์—ญ์‚ฌ์  ๋ฐฐ๊ฒฝ

์ดˆ๊ธฐ์˜ ์‚ฌ์ง„ ์กฐํŒ ์žฅ์น˜(C/A/T)๋Š” ์กฐํŒ๋œ ๋ฌธ์„œ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ๊นŒ์ง€ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ˆœํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€(์˜ˆ: โ€œํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹คโ€)๋ฅผ ์กฐํŒ ํ”„๋ฆฐํ„ฐ๋กœ ์ถœ๋ ฅํ•˜์ง€ ์•Š๊ณ  ํ„ฐ๋ฏธ๋„๋กœ ๋”ฐ๋กœ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด stderr๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

3) ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์–ด๋‘์šด ๊ทธ๋ฆผ์ž โ€“ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ

๐Ÿ’ฃ gets()์˜ ์œ„ํ—˜ํ•œ ํ•จ์ •

์ดˆ๊ธฐ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” gets(char *buffer)๋ผ๋Š” ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์ž…๋ ฅ ํ•จ์ˆ˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด ํ•จ์ˆ˜๋Š” ์น˜๋ช…์ ์ธ ๋‹จ์ ์„ ์•ˆ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

char buffer[2];
gets(buffer);  // ๐Ÿ‘ˆ ๋ฌธ์ œ ๋ฐœ์ƒ
  • gets()๋Š” ์ž…๋ ฅ๋ฐ›๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ์ œํ•œํ•˜์ง€ ์•Š์Œ
  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด buffer์˜ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด? โ†’ ๋ฉ”๋ชจ๋ฆฌ ์นจ๋ฒ”

๐Ÿšจ ์‹ค์ œ ์œ„ํ˜‘ ์‚ฌ๋ก€

{% hint style="danger" %} ๋งŒ์•ฝ buffer ๋’ค์— ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ(์˜ˆ: launch_missiles)๊ฐ€ ์œ„์น˜ํ•œ๋‹ค๋ฉด,
yyy์™€ ๊ฐ™์€ ์ž…๋ ฅ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ์„ ์œ„ํ˜‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. {% endhint %}

์ด๋Ÿฐ ์ทจ์•ฝ์ ์€ ์ˆ˜๋งŽ์€ ๋ณด์•ˆ ์‚ฌ๊ณ ๋กœ ์ด์–ด์กŒ๊ณ ,
C99 ์ดํ›„๋กœ๋Š” gets()๊ฐ€ ์‚ฌ์šฉ๊ธˆ์ง€(deprecated) ๋˜์—ˆ์œผ๋ฉฐ,
C11์—์„œ๋Š” ์™„์ „ํžˆ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

โœ… ์•ˆ์ „ํ•œ ๋Œ€์•ˆ: fgets(buffer, sizeof(buffer), stdin)

๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐœ์ƒํ•  ์‹œ ๋ฒ„ํผ์— ๋‹ค ๋‹ด์ง€ ๋ชปํ•œ ๊ฐ’๋“ค์€ ๋ฒ„ํผ ์ดํ›„์˜ ๊ณต๊ฐ„์— ๋“ค์–ด์ฐจ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋“ค์–ด์ฐจ๋Š” ๋ฐฉ์‹์ด ๋ฐ€์–ด๋‚ด๊ธฐ๊ฐ€ ์•„๋‹Œ ๋ฎ์–ด์“ฐ๊ธฐ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€๋ น 8์นธ์งœ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ๊ณ , ๊ทธ ์•ˆ์— 4์นธ์งœ๋ฆฌ ๋ฒ„ํผ๊ฐ€ ์žˆ์„ ๋•Œ

https://namu.wiki/w/%EB%B2%84%ED%8D%BC%20%EC%98%A4%EB%B2%84%ED%94%8C%EB%A1%9C

์ด์™€ ๊ฐ™์ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํผ๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด ๋ฒ„ํผ ์ดํ›„์˜ ๊ฐ’์ด ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค.

๋ฌธ์ œ๋Š” ์ด๊ฑธ ํ”„๋กœ๊ทธ๋žจ์€ ์ „ํ˜€ ๋ชจ๋ฅด๊ณ  ์žˆ๋Š” ์ƒํƒœ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์‹ฌ์ง€์–ด ๋ฒ„ํผ ์ดํ›„์˜ ๊ฐ’์ด ๋ฐ”๋€Œ์–ด๋„ ํ”„๋กœ๊ทธ๋žจ์€ ์ด๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ†ต์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค!

โ‡’ ๋ฌผ๋ก  ์ด๋Š” ๋กœ์šฐ ๋ ˆ๋ฒจ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์„ธ์„ธํ•˜๊ฒŒ ์ฝ”๋”ฉํ•ด์•ผ ํ–ˆ๋˜ ๋•Œ์˜ ์ด์•ผ๊ธฐ๊ณ  ์š”์ฆ˜์€ ๋””๋ฒ„๊น…์‹œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฒ„ํผ ์•ž๋’ค์— ์˜ค๋ฒ„ํ”Œ๋กœ ๋ฐฉ์–ด์šฉ 1~4๋ฐ”์ดํŠธ์งœ๋ฆฌ ๊ฐ’์„ ๋„ฃ์–ด(์นด๋‚˜๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค. ์–ด์›์€ ์นด๋‚˜๋ฆฌ์•„(์กฐ๋ฅ˜) ๋ฌธ์„œ ์ฐธ์กฐ) ์นจ๋ฒ”๋˜์—ˆ์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋•Œ๋ ค๋ฒ„๋ฆฌ๊ฑฐ๋‚˜ ์ฝ”๋”ฉ ๋‹จ๊ณ„์—์„œ '์ด ํ•จ์ˆ˜๋Š” ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์˜ ์œ„ํ—˜์ด ์žˆ์Œ' ์ด๋ผ๊ณ  ๊ฒฝ๊ณ ๋ฅผ ํ•ด ์ค€๋‹ค. ๋ฌผ๋ก  ์ด ํ˜„์ƒ์ด ์‚ฌ๋ผ์ง„ ๊ฑด ์•„๋‹ˆ๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์—ฌ์ „ํžˆ ๋ฒ„ํผ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’์„ ์ฒดํฌ ํ•ด์•ผ ๋œ๋‹ค.

์ค‘์š”ํ•˜์ง€ ์•Š์€ 10์ค„~50์ค„์งœ๋ฆฌ ์†Œ๊ทœ๋ชจ ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๋ฉด ์ด๋Š” ๋”ฑํžˆ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ ์ค‘ํ˜•์ด๋‚˜ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ์ด์•ผ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š”๋ฐ ์ด ์›๋ฆฌ๋ฅผ ํ†ตํ•ด ํ•ดํ‚น์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด 10์ž๋ฆฌ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์น˜๊ณ  ๋“ค์–ด๊ฐ€๋Š” ์‹œ์Šคํ…œ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ’ ๋ฐ”๋กœ ๋’ค์— ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ๋ฌป๋Š” ๊ฐ’์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.(0=์‹คํŒจ, ์ด์™ธ์˜ ๊ฐ’=์„ฑ๊ณต) ์ด ์ƒํ™ฉ์—์„œ ๋์ž๋ฆฌ๊ฐ€ 0์ด ์•„๋‹Œ 11์ž๋ฆฌ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ‹€๋ฆฌ๋”๋ผ๋„ ๋šซ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค!

๋งŒ์•ฝ ๋ฒ„ํผ๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ์“ฐ์ด๋Š” ๊ฐ’์ด ํ”„๋กœ๊ทธ๋žจ์˜ RETN[4]๊ฐ’์„ ๋ฎ์–ด์“ฐ๊ฒŒ ๋œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ ํŠน์ •ํ•œ ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ , ์ด ํ•จ์ˆ˜์˜ ์ฃผ์†Ÿ๊ฐ’์„ ์•Œ๊ณ  ์–ด๋–ค ์ž…๋ ฅ์ด ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๊ทธ๋ƒฅ '์ž…๋ ฅ๋ฐ›๋Š” ๋ฌธ์ž์—ด + 4[5]/8[6]๋ฐ”์ดํŠธ(SFP ๋ฎ์–ด์“ฐ๊ธฐ์šฉ) + ํ•ด๋‹น ํ•จ์ˆ˜ ์ฃผ์†Œ'๋ฅผ ์ž…๋ ฅ๊ฐ’์— ์‘ค์…”๋„ฃ์–ด ์ž…๋ ฅ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋ฉด ์ž์‹ ์ด ์›ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์ ํ”„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์‚ฌ๋ก€๋กœ๋Š” ํ•˜ํŠธ๋ธ”๋ฆฌ๋“œ ์‚ฌํƒœ์™€ ์Šคํƒ€ํฌ๋ž˜ํ”„ํŠธ 1์˜ EUD๊ฐ€ ์žˆ๋‹ค.

- ๋‚˜๋ฌด ์œ„ํ‚ค -

4) ๋ฉ”๋ชจ๋ฆฌ์™€ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” C ๊ตฌ์กฐ์ฒด โ€“ ๋…ธ๋“œ ๊ตฌ์กฐ ์„ ์–ธ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” DOM <div> ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ์ง€๋งŒ,
C์—์„œ๋Š” ์ข€ ๋” ์ง์ ‘์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์™€ ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

struct node {
  struct node *no;
  struct node *yes;
  char string[1];
};
  • no, yes๋Š” ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ
  • string์€ ๋™๋ฌผ ์ด๋ฆ„์ด๋‚˜ ์งˆ๋ฌธ

๐Ÿ’ก ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐฉ์‹

C์—์„œ๋Š” ๋ฌธ์ž์—ด์„ ๋‹ด๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ ๊ตฌ์กฐ์ฒด ํฌ๊ธฐ + ๋ฌธ์ž์—ด ๊ธธ์ด๋งŒํผ malloc์„ ์‚ฌ์šฉํ•ด ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

malloc(sizeof(struct node) + strlen(string))

์ด๋Ÿฐ ์ €์ˆ˜์ค€ ๋ฉ”๋ชจ๋ฆฌ ์ œ์–ด๋Š” ์œ„ํ—˜ํ•˜์ง€๋งŒ ๊ฐ•๋ ฅํ•˜๋ฉฐ, ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์•„์ฃผ ์ค‘์š”ํ•œ ๋Šฅ๋ ฅ์ž…๋‹ˆ๋‹ค.

๐Ÿงพ ์ •๋ฆฌ: ๋Ÿฐํƒ€์ž„, ์ž…์ถœ๋ ฅ, ๋ณด์•ˆ๊นŒ์ง€ ์ด์–ด์ง€๋Š” ์‹œ์Šคํ…œ ์„ธ๊ณ„

ํ•ญ๋ชฉ ์„ค๋ช…
๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‹คํ–‰ ์ „์— ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ ํŒŒ์ผ ํ•ธ๋“ค์„ ์ดˆ๊ธฐํ™”
stdio ์ž…๋ ฅ/์ถœ๋ ฅ๊ณผ ๋ฒ„ํผ๋ง์„ ๋‹ค๋ฃจ๋Š” ํ‘œ์ค€ I/O ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
stdout vs stderr ์ถœ๋ ฅ ๋ฐฉ์‹์˜ ์ฐจ์ด๋กœ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๊ด€๋ฆฌ
gets()์™€ fgets() ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์™€ ๊ทธ๋กœ ์ธํ•œ ๋ณด์•ˆ ์œ„ํ˜‘
๊ตฌ์กฐ์ฒด + ํฌ์ธํ„ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ณด๋‹ค ๋” ์ง์ ‘์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์กฐ์ž‘ ๋ฐฉ์‹

๐Ÿง  ์ฃผ์ œ: ๊ณ ์ˆ˜์ค€๊ณผ ์ €์ˆ˜์ค€ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ๊ณ„์—์„œ โ€“ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ vs C๋กœ ๊ตฌํ˜„ํ•œ โ€˜๋™๋ฌผ ์ถ”์ธก ๊ฒŒ์ž„โ€™ ๋น„๊ต

1) ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ์™€ ์‹คํ–‰ ํ™˜๊ฒฝ ๋น„๊ต

๊ตฌ๋ถ„ HTML/JavaScript C ์–ธ์–ด
์‹คํ–‰ ํ™˜๊ฒฝ ๋ธŒ๋ผ์šฐ์ € (V8 ์—”์ง„ ํฌํ•จ) OS์—์„œ ์ง์ ‘ ์‹คํ–‰ (ํ„ฐ๋ฏธ๋„ ๊ธฐ๋ฐ˜)
์ž…์ถœ๋ ฅ ๋ฐฉ์‹ ๋ธŒ๋ผ์šฐ์ € ์ œ๊ณต Web API, DOM, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ stdin, stdout, stderr ๋ฐ ํŒŒ์ผ ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜
UI ์ฒ˜๋ฆฌ ๋ฒ„ํŠผ, ํ…์ŠคํŠธ ์ž…๋ ฅ, HTML DOM์œผ๋กœ ๊ตฌํ˜„ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ y/n/q ์ž…๋ ฅ ์ฒ˜๋ฆฌ
์ง€์‹ ํŠธ๋ฆฌ ๊ตฌ์กฐ <div>๋ฅผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ™œ์šฉ struct node ๊ธฐ๋ฐ˜ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ
๊ฒŒ์ž„ ์ƒํƒœ ์ €์žฅ ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์—์„œ๋Š” ์–ด๋ ค์›€ ํŒŒ์ผ ์ž…์ถœ๋ ฅ (์˜ต์…˜์œผ๋กœ -i, -o)
ํ”„๋กœ๊ทธ๋žจ ํ๋ฆ„ jQuery ๋ฐ JS ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ ๋ฃจํ”„, ์กฐ๊ฑด๋ฌธ, ํฌ์ธํ„ฐ ์ค‘์‹ฌ์˜ ๊ตฌ์กฐ์  ์ฒ˜๋ฆฌ

2) ์ž…์ถœ๋ ฅ ์ถ”์ƒํ™”์˜ ์ฐจ์ด

  • ๋ธŒ๋ผ์šฐ์ €(JavaScript):
    • ํŒŒ์ผ ์ ‘๊ทผ ์ œํ•œ (๋ณด์•ˆ์ƒ ์ด์œ ๋กœ local file ์ ‘๊ทผ ์–ด๋ ค์›€)
    • Web API๋กœ ์ž…์ถœ๋ ฅ ์ถ”์ƒํ™”
    • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋งŽ์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ฐ์ถค (ํŒŒ์ผ, ํ„ฐ๋ฏธ๋„ ์กด์žฌ X)
  • C ์–ธ์–ด:
    • ํŒŒ์ผ/์žฅ์น˜ ๊ตฌ๋ถ„ ์—†์Œ โ†’ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
    • fopen, fgets, fputs ๋“ฑ์˜ ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
    • stderr๋Š” ๋ฒ„ํผ๋ง์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•œ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ์— ์‚ฌ์šฉ

๋ธŒ๋ผ์šฐ์ €์—์„œ ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด โ€œ์™„์ „ํžˆ ๋‹ค๋ฅธ APIโ€๋ฅผ ์จ์•ผ ํ•˜์ง€๋งŒ, C์—์„œ๋Š” ์žฅ์น˜์™€ ํŒŒ์ผ์ด ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์‚ฌ์šฉ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

3) ๋ฉ”๋ชจ๋ฆฌ์™€ ์ž๋ฃŒ๊ตฌ์กฐ ๊ตฌํ˜„ ๋น„๊ต

ํ•ญ๋ชฉ JavaScript C ์–ธ์–ด
๋…ธ๋“œ ๊ตฌ์กฐ <div string="์งˆ๋ฌธ">...</div> struct node with string[]
๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์‚ฌ์šฉ malloc์œผ๋กœ ์ˆ˜๋™ ํ• ๋‹น
๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ JS ๋‚ด์žฅ ๋ฌธ์ž์—ด ํ•จ์ˆ˜ strcpy, strlen ๋“ฑ ์ง์ ‘ ์ฒ˜๋ฆฌ
ํฌ์ธํ„ฐ ์‚ฌ์šฉ ์—†์Œ (์ฐธ์กฐ ๊ธฐ๋ฐ˜) yes/no โ†’ ํฌ์ธํ„ฐ ์ง์ ‘ ์—ฐ๊ฒฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” <div> DOM ์š”์†Œ๊ฐ€ ๊ณง ํŠธ๋ฆฌ ๋…ธ๋“œ์ด์ž ๋ฐ์ดํ„ฐ๋ฅผ ํ’ˆ์€ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. C์—์„œ๋Š” ์ด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌ์กฐ์ฒด์™€ ํฌ์ธํ„ฐ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๋„ ์ง์ ‘ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4) ๋ฒ„ํผ๋ง๊ณผ ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ๊ตฌ์กฐ

stdin / stdout / stderr ๊ตฌ์กฐ

  • stdin: ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›์Œ
  • stdout: ์ผ๋ฐ˜ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
  • stderr: ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ (๋ฒ„ํผ๋ง ์—†์Œ)
char buffer[2];
gets(buffer); // ์œ„ํ—˜: ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ ๊ฐ€๋Šฅ

gets๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” fgets()๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ ์ทจ์•ฝ์ ์€ ๋ณด์•ˆ ์ธก๋ฉด์—์„œ ํฐ ์ด์Šˆ์ž…๋‹ˆ๋‹ค.

๐ŸŽฏ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ ์˜ˆ์‹œ

char buffer[2];
gets(buffer);  // yyy ์ž…๋ ฅ โ†’ launch_missiles ๋ณ€์ˆ˜์— ์˜ํ–ฅ ๊ฐ€๋Šฅ

โ†’ ๋Œ€์‘๋ฒ•:

fgets(buffer, sizeof(buffer), stdin);

5) ํ›ˆ๋ จ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ฐจ์ด

  • JavaScript:
    • ๋ธŒ๋ผ์šฐ์ €์— ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ ์ €์žฅ ์–ด๋ ค์›€
    • ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ๋˜๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ์—ฐ๋™ ํ•„์š”
  • C ํ”„๋กœ๊ทธ๋žจ:
    • -i, -o ์˜ต์…˜์œผ๋กœ ํŒŒ์ผ ์ž…์ถœ๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„
    • fopen, fputs, fgets ๋“ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅ

ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ์— ์ €์žฅํ•œ ๋’ค ๋‹ค์Œ ๊ฒŒ์ž„์—์„œ ์ด์–ด์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ์€ CLI์—์„œ ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

โœจ ๋งˆ๋ฌด๋ฆฌ: ์™œ ๋‘ ์ฝ”๋“œ๋Š” ๊ฐ™์€ ๊ฒŒ์ž„์ธ๋ฐ ์ด๋ ‡๊ฒŒ ๋‹ค๋ฅผ๊นŒ?

  • ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ์•ฑ์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•˜์ง€๋งŒ, ์‹œ์Šคํ…œ ์ž์› ์ ‘๊ทผ์—๋Š” ์ œํ•œ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ฉด C๋กœ ๊ตฌํ˜„๋œ CLI ๋ฒ„์ „์€ ๋ชจ๋“  ๊ฒƒ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜์ง€๋งŒ, ํŒŒ์ผ๊ณผ ์žฅ์น˜๋ฅผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด ํ™•์žฅ์„ฑ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์ถ”์ƒํ™”์˜ ์ฐจ์ด๋Š” ๊ณง ๊ฐœ๋ฐœ ๋ฐฉ์‹๊ณผ ์„ฑ๋Šฅ, ์œ ์ง€๋ณด์ˆ˜์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.