프로그래밍 언어하면 C언어를 떠올리시는 분들이 많은데, 저는 자바스크립트로 프로그래밍을 강의하려 합니다.

프로그래밍 언어를 처음 배울 때 주로 Hello World라는 문자열을 화면에 출력하는 간단한 코드를 작성하게 되는데, C언어는 코딩(coding)을 한줄이라도 하기 위해선 개발 툴을 설치하고 관련 라이브러리들을 불러와야 하는 과정이 필요합니다.

또한 내가 작성한 코드가 다른 컴퓨터에서 정상적으로 작동하기 위해서는 해당 컴퓨터에 관련 라이브러리들이 제대로 설치되어야 합니다. 반대로 다른 사람이 만든 코드 역시 내컴퓨터에 라이브러리들이 제대로 설치되어 있지 않다면 실행되지 않습니다. 프로그래밍을 배울 때 코딩 외에 신경써야 할 부분이 많다는 것이죠.

1. 자바스크립트를 공부하기 위해서는 아무런 프로그램의 설치가 필요하지 않습니다. 자바스크립트는 웹브라우저에서 실행되는데, 브라우저에 코드를 입력할 수 있는 도구인 '콘솔'이 있기 때문입니다. (랩탑이나 데스크탑의 경우에 한함. 만약 타블릿이나 핸드폰으로 이 글을 읽고 계시다면 코드작성 시에는 랩탑이나 데스크탑을 이용해 주세요.) 물론 실제로 프로그램을 작성한다면 개발용 텍스트 에디터를 사용하는 것이 좋지만, 간단한 코드를 작성하고 테스트하기 위해서는 불필요합니다.

2. C언어는 코드 수정후 재실행시 컴파일이라는 과정이 필요해서 전체 코드를 다시 실행해야 하지만, 자바스크립트는 컴파일이 필요하지 않고 프로그램 실행 중에도 변수, 함수를 생성하거나 해당 데이터, 코드를 변경할 수 있습니다. 코딩 연습할 때 굉장히 편리합니다.

3. C언어에서 작성한 프로그램은 운영체제(윈도우, 맥, 안드로이드, IOS 등)에 따라 호환이 안되는 경우가 많습니다. 자바스크립트는 웹브라우저에서 실행되므로 운영체제의 영향을 받지 않습니다. 브라우저간 호환성은 운영체제 호환성에 비해 굉장히 좋습니다. 심지어 모바일, 타블릿에서도 동일하게 실행됩니다.

이 글은 자바스크립트가 C언어보다 좋다는 것을 설명하는 글은 아닙니다. 배울 때 이것 저것 따질 것이 적다는 것이죠. 프로그래밍 언어는 하나를 어느정도 배워 두면 다른 언어를 익히는 것은 그렇게 어렵지 않습니다. 일단 재미를 붙이고 자신감을 얻는게 중요하죠. 나중에 다른 언어가 필요해 지면 그때 다른 언어를 공부하셔도 늦지 않습니다.

자바스크립트란?

자바스크립트(Java script)는 웹브라우저상에 명령어를 전달하는 언어로 자바(Java)와는 전혀 다른 별개의 언어입니다. 할 수 있는 일도 웹브라우저상으로만 제한됩니다만, 요즘은 웹상에서 못하는 것이 거의 없죠. 웹브라우저에서 작동하는 유일한 언어이기도 합니다. 이 때문에 웹 프로그래밍을 하게 된다면 반드시 접하게 되는 언어입니다.

자바스크립트로 Hello World 출력하기

Hello World 출력은 프로그래밍 언어를 배울 때 가장 먼저 배우는 것으로 화면에 텍스트를 출력하는 것을 익히는 것이 목적입니다. 아래 순서대로 따라해보세요.

1. 현재 이 글을 보고 계신 웹브라우저에서 새 창/새 탭을 열고, 주소창에 "about:blank"라고 입력합니다. (about:blank은 빈 페이지를 여는 명령어입니다.)

2. 웹브라우저의 콘솔을 엽니다. 웹브라우저 콘솔은 웹브라우저에 코드를 입력하기 위한 도구입니다. 아래 표를 보고 자신의 운영체제(OS)와 웹브라우저에 맞는 단축키를 누릅니다.

 운영체제  브라우저  콘솔 여는 법
 윈도우  크롬  Ctrl + Shift + J
 파이어폭스  Ctrl + Shift + K
 인터넷 익스플로러/엣지  F12 누른 후 콘솔(Console)탭 클릭
 맥  크롬  Command + Option + J
 파이어폭스  Command + Option + K
 사파리  Command + , 누른 후, 환경설정 > 고급 > '개발자용 메뉴 보기' 체크, 설정을 종료한 후 브라우저로 돌아 와서 Command + Option + C

저는 크롬 브라우저를 사용하여 콘솔 화면을 열었습니다.

커서가 깜박이는 것을 볼 수 있습니다. 이 부분에 코드를 입력할 수 있습니다.

3. 아래 코드를 입력한 후 엔터

1
console.log("Hello World!")
cs

Hello World!가 출력되었습니다.

- console.log()는 콘솔에 텍스트를 출력하는 함수입니다.
라는 코드에서 괄호안에 출력하고 싶은 내용을 넣으면 화면에 출력해 줍니다. - "Hello World!"에서 큰 따옴표(")는 텍스트를 출력하기 위해 사용하였고 숫자를 출력하고 싶은 경우에는 큰 따옴표를 사용하지 않아도 됩니다. 괄호안의 내용을 바꿔서 다른 내용을 출력하는 연습을 해봅시다.

"지금 프로그래밍을 한 건가요?"

프로그램을 만들었다기 보다, 명령어를 하나 배운 것 같은 느낌이 드실 겁니다. 이건 자바스크립트가 웹브라우저에서 작동하는 스크립트 언어이기 때문입니다. 이미 웹브라우저라는 프로그램이 실행중인 상태에서, 그 프로그램에 코드를 보내 실행되는 형태입니다.

좀 더 프로그램같은 걸 보고 싶은 분들은 아래코드를 복사해서 웹브라우저 콘솔에 붙여넣기해 보세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
var width = 350, height = 250, range = 20;
var player = {x: 150, y: 75, width: 20, height: 20, val:2};
var enemy = {x: 0, y: 0, width: 20, height: 20, val:1};
var score = 0, count = 0, key = [];
var canvas = document.createElement("canvas");
canvas.width = width;
canvas.height = height;
canvas.style.border = "1px solid black";
var ctx = canvas.getContext("2d");
document.body.appendChild(canvas);
setInterval(function(){
  update();
  draw();
},10)
function draw(){
  ctx.save();
  ctx.fillStyle = "white";
  ctx.fillRect(0,0,width,height);
  ctx.fillStyle = "red";
  ctx.fillRect(enemy.x-enemy.width/2,enemy.y-enemy.height/2,enemy.width,player.height);
  ctx.fillStyle = "black";
  ctx.fillRect(player.x-player.width/2,player.y-player.height/2,player.width,player.height);
  ctx.font = "20px Arial";
  ctx.fillStyle = "black";
  ctx.fillText("Score: "+score,0,20);
  ctx.restore();
}
function update(){
  if(player.x >= enemy.x-range && player.x <= enemy.x+range && player.y >= enemy.y-range && player.y <= enemy.y+range ){
    enemy.y = 0;
    score++;
  }
  if(enemy.y > height || enemy.y == 0){
    enemy.x = Math.ceil(Math.random()*width);
    enemy.y = 0;
    enemy.val = 1;
  }
  if(key[37]&&player.x-player.width/2>0) player.x -= player.val;
  if(key[38]&&player.y-player.height/2>0) player.y -= player.val;
  if(key[39]&&player.x+player.width/2<width) player.x += player.val;
  if(key[40]&&player.y+player.height/2<height) player.y += player.val;
  enemy.y += enemy.val;
  enemy.val += 0.02;
}
window.addEventListener("keydown"function(e){
  key[e.keyCode] = true;
});
window.addEventListener("keyup"function(e){
  key[e.keyCode] = false;
});
cs

마우스로 게임화면을 한번 클릭하신 후 키보드 상하좌우 키를 눌러 검은 네모를 움직일 수 있습니다. 검은 네모가 떨어지는 빨간 네모에 닿으면 점수가 올라갑니다. 게임종료는 없습니다. 지금 이 코드는 그냥 흥미위주로 봐주시고 코드의 이해는 하지 않으셔도 됩니다.

이번 글에서는 프로그래밍 언어의 발달 과정을 살펴봅시다. 이 부분 역시 프로그래밍을 하는데 반드시 알아야 하는 부분은 아닙니다. 대강의 흐름을 이해하시고 구체적인 언어의 문법을 이해하거나 외우려고 하시지 마세요.

기계어

처음 프로그래머들은 실제로 0과 1을 사용하여 프로그램을 작성하였습니다. 이를 기계어(Machine Language)라고 합니다.

000000 00001 00010 00110 00000 100000

이런 식이죠. 저는 기계어를 모르기 때문에 위 코드는 영문위키(https://en.wikipedia.org/wiki/Machine_code)에서 가져왔습니다. 내용을 해석해 보면,

[  op  |  rs |  rt |  rd |shamt| funct]
 000000 00001 00010 00110 00000 100000    2진법
    0     1     2     6     0     32     10진법

- 0번 오퍼레이션(op)의 32번 기능(funct)을 사용합니다.
- 이 기능은 rs 레지스트리의 값과 rt 레지스트리의 값을 더하여 rd레지스트리에 저장합니다. 여기서 레지스트리는 CPU에서 데이터를 임시로 저장하는 장치를 뜻합니다(윈도우 운영체제의 레지스트리와는 다릅니다).
- 즉 1번 레지스트리의 값(rs)에 2번 레지스트리값(rt)을 더하여 6번 레지스트리(rd)에 전달합니다.

바로 앞 강의에서 살펴 본 칩과 마찬가지로 0과 1로 구성된 32개의 신호를 CPU에 전달하면 CPU가 위 명령을 수행하기 위한 출력 신호를 생성하게 되고, 다음 장치들이 그 값을 받아 명령을 완수하게 됩니다.

기계어로 작성된 코드는 가독성이 굉장히 떨어지기 때문에 사람이 알아 보기 쉽게 하기 위해 나온 것이 어셈블리어(Assembly Language)입니다.

어셈블리어

10110000 01100001 <- 기계어
MOV AL, 61h <- 위 기계어에 해당하는 어셈블리어

저는 어셈블리어 역시 전혀 모르기 때문에 이 또한 영문 위키(https://en.wikipedia.org/wiki/Assembly_language)에서 가져왔습니다.

AL 레지스트리에 61h(h는 hex로 6진법을 뜻합니다. 6진법 61은 10진법으로 97입니다)를 넣으라(move)는 명령입니다.

10110000이라는 명령이 MOV AL이라는 문자로, 2진수인 01100001이 6진법인 61h가 되어 사람이 이해하기에 조금 더 쉬워졌습니다. 하지만 CPU는 0과 1밖에 모르기 때문에 어셈블리어로 작성된 코드는 CPU로 바로 전달될 수 없고 어셈블러(assembler)라는 프로그램을 통해 기계어로 번역된 후 CPU가 처리할 수 있습니다.

어셈블리어는 기계어를 단순히 사람이 보기 좋게 숫자를 문자로, 2진수를 다른 진수의 수로 변경한 것으로 기계어와 1대 1 변환이 가능합니다.

저급언어

기계어와 어셈블리어처럼 CPU에 직접 명령을 내리는 코드를 작성하는데 사용되는 언어를 저급언어라고 합니다. CPU에 명령어를 바로 전달하는 것은 초창기에는 너무 당연한 일이였겠지만, CPU가 발전하고 종류가 다양해지게 되면서 CPU 아키텍처가 바뀌면 프로그램이 작동하지 않게 되는 문제가 발생합니다. 즉 CPU 종류에 따라 각각의 프로그램을 작성해야 하는 것이죠. 기계어/어셈블리어는 하나의 언어가 아닙니다. 해당 CPU 메뉴얼에 맞춰 프로그래밍을 하는 것이 기계어로 코딩하는 것입니다.

또 다른 문제점은 CPU의 작동 방식이 사람이 이해하기에 난해하다는 점입니다. 예를들어, 2+3을 계산하려면 아래와 같은 명령들을 내려야 합니다.

- 2를 1번 레지스트리에 저장
- 1번 레지스트리의 값에 3을 더해서 2번 레지스트리에 저장
- 2번레지스트리의 값을 꺼내서 출력

굉장히 구체적으로 명령을 내려 줘야하기 때문에 익히기가 힘들고 코드가 복잡해지므로 생산성이 높지 않습니다.

고급언어

C언어, 자바, 자바스크립트, 파이썬 등과 같은 고급언어는 운영체제와 컴파일러/인터프리터 등의 프로그램을 통해 시스템에 맞는 기계어의 번역이 이루어 집니다. 또한 번역시 CPU가 처리해야 할 구체적인 과정이 알아서 처리되어 사람의 입장에서 명령을 내릴 수 있게 됩니다. 이것을 명령이 추상화가 되었다고 합니다. 물론 CPU의 입장에서 추상화가 된 것이죠.

2+3을 계산하는 명령을 그냥 2+3이라고 작성하면 이 명령이 기계어로 번역될 때 번역기가 이 문장을 이해하고 해당 CPU에 맞는 기계어를 알아서 생성하게 됩니다.

CPU의 입장에서 프로그래밍하는 언어가 저급언어, 사람의 입장에서 프로그래밍하는 언어가 고급언어라고 할 수 있습니다.

저급, 고급이 언어 자체의 좋고 나쁨을 뜻하지는 않습니다. 오히려 저급언어로 만들어진 프로그램이 CPU를 직접 제어하므로 고급언어보다 훨씬 빠른 프로그램을 만들 수 있습니다. 하지만 요즘은 컴퓨터 성능이 많이 좋아져서 고급언어로 만든 프로그램이 조금 비효율적이라도 여전히 빠르고, 프로그램을 만드는 효율(얼마나 쉽고 빠르게 프로그램을 만들 수 있는지)이 중요하게 여겨지기 때문에 대부분의 프로그램들이 고급언어로 만들어 지고 있습니다.

컴퓨터의 작동 원리는 프로그래밍을 하는데 꼭 알아야 하는 것은 아니지만 프로그램이 어떻게 컴퓨터를 작동시키는지와 밀접하게 연관되어 있고 몇몇 프로그래밍의 기본 개념을 이해하는데 도움을 줍니다.

컴퓨터는 전자계산기

최초의 컴퓨터는 수학식을 계산하는 도구였습니다. 지금은 컴퓨터로 영화도 보고 게임도 하고 뉴스도 읽을 수 있죠. 하지만 이 기능들은 계산기의 기능을 확장한 것입니다.

키보드로 키를 입력하거나, 마우스를 움직이거나 터치스크린을 터치하는 등의 사람의 동작을 컴퓨터가 처리할 수 있게 전기신호로 변환하는 장치를 입력장치라고 합니다. 반대로 전기신호를 사람이 이해할 수 있게 빛(화면), 소리 등으로 변환하는 장치를 출력장치라고 합니다. 이 신호는 숫자로 나타내어질 수 있고, 컴퓨터는 입력장치를 통해 입력받은 값을 연산하여 출력장치에 전달합니다.

이처럼 현대의 컴퓨터도 여전히 숫자들을 바탕으로 하여 정보를 처리하고 계산하는 장치라는 것을 이해하고 컴퓨터가 어떻게 수를 계산하는지 알아봅시다.

아래 내용에 전혀 흥미가 없으신 분들은 컴퓨터가 2진수 계산을 하는 장치라는 것만 알고 넘어가도 됩니다.

컴퓨터와 2진 신호 체계

흔히들 컴퓨터는 0과 1밖에 모른다고 하죠. 컴퓨터의 중앙처리장치인 CPU가 0과 1로만 계산을 하기 때문입니다. 그런데 CPU는 숫자 0과 숫자 1을 어떻게 구별할까요?

사실 CPU는 숫자 0도, 숫자 1도 모릅니다. CPU에는 모든 신호가 전기로 전달되는데 이 때 전압이 일정한 기준보다 높은 경우 이것을 1, 전압이 일정한 기준 보다 낮은 경우 이것을 0으로 사람들이 표현한 것입니다.

CPU는 <전압이 충분히 높음>과 <전압이 충분하지 않음>의 두가지 신호로 된 2진법을 사용합니다. 혹시 여기서 2진법, 10진법에 대해 잘 모르시는 분들은 따로 검색을 통해서 기본 개념을 익히시고 계속 읽어 주세요.

여기서 "전압이 충분함"이 어떤 기준인지, 왜 높고 낮음 두가지로만 구별하는지(10단계의 전압을 구별하면 10진법을 사용할 수 있을텐데 말이죠!)를 이해하려면 CPU의 구성품인 트랜지스터가 무엇인지 알아야 합니다.

트랜지스터와 논리연산

트랜지스터는 CPU를 구성하는 구성품으로 전기 신호의 흐름에 관여하게 됩니다. CPU에는 트랜지스터가 수십억개가 모여있으며 제작기술이 발달함에 따라 그 수가 늘어나고 있죠. (초창기의 컴퓨터의 CPU는 수천개의 트랜지스터로 구성되어 있었음)

CPU 구성에 사용되는 npn 트랜지스터는 아래와 같이 구성되어 있습니다.

트랜지스터에는 전류가 흐를 수 있는 다리가 3개(이미터, 베이스, 컬렉터) 있으며 베이스에 전압이 일정 수준 이상(0.6볼트 이상) 이면 컬렉터로 들어온 전류가 이미터로 전달될 수 있고 그렇지 않으면 컬렉터에서 이미터로 전류가 흐르지 않게 하는 장치입니다. 즉 베이스에 특정한 전압 이상의 전류가 통하고 있는지 아닌지를 통해 이미터에 CPU에 0, 1의 신호를 주게 되는 것입니다.

트랜지스터의 이러한 특성을 이용하면 '논리 게이트'라는 것을 만들 수 있습니다.

 논리 게이트

 구조

 설명

 AND GATE

 

A와 B에 모두 전압이 있어야
Out에 전류가 흐름

 OR GATE

 

A나 B에 중에 한 곳이라도 전압이 있으면
Out에 전류가 흐름

위 표는 트랜지스터로 어떻게 논리 게이트를 구성하는지 보여주기 위한 2가지 예제일 뿐이고 트랜지스터들을 연결하는 방법에 따라 아래와 같은 다양한 논리 게이트를 만들 수 있습니다.

Symbol에서 왼쪽이 입력신호, 오른쪽이 출력신호이며, Truth Table에서 왼쪽 A 혹은 A, B가 입력 값, 오른쪽 X가 출력값을 나타냅니다. 예를 들어, AND 게이트의 경우 X로 1 신호를 보내기 위해서는 (A, B)가 각각 (1, 1)이 되어야 하며, 나머지 (0, 0), (1, 0), (0, 1)인 경우는 0 신호를 보내게 됩니다.

논리 게이트를 또다시 모아모아 계산을 할 수있는 칩을 만들 수 있습니다. 아래는 두자리 2진수 두개의 합을 구하는 칩 구성입니다.

이 칩은 0과 1을 입력받는 부분이 4개, 0과 1을 출력하는 부분이 3개로, 4가지 입력부에 두자리 2진수 2개를 나란히 입력하면 그 합이 출력됩니다. 입력부에 스위치를 연결하고 출력부에 전구를 연결하면 각각 스위치를 켜고 끔에 따라 전구에 불이 들어오는 순서가 달라지겠죠.

위 칩에서 알 수 있는 중요한 점들!!

1. 입력값인 1011이 순서대로 하나씩 1, 0, 1, 1이 들어가는 것이 아니라 1011이 동시에 쑥 들어가서 오른쪽으로 값이 101이 동시에 쑥 나온다는 것

2. 결국 2진수 1011(10진수로는 11)를 입력으면 101(10진수로 5)를 출력하고 있다는 것입니다. 즉, 규칙을 이해하고 사용하는 것이 요구된다는 점이죠,

3. 출력값 101은 숫자 101이 아니라 세개의 출력선에 전류가 흐르고 있는지 아닌지를 나타낸다는 점! 출력으로 나온 전류를 다시 다른 칩에 넣어 변환하여 모니터나 프린터같은 출력장치에서 그 값을 활용할 수 있습니다.

이런식으로 논리 게이트를 구성하여 CPU를 설계하게 됩니다(정확히는 CPU의 연산부분을 이런식으로 설계).

정리

입력장치, 연산장치, 출력장치와 더불어 또 한가지 중요한 장치가 저장장치인데요, 컴퓨터의 저장장치는 0과 1의 전기 신호를 기록해 두었다가 전류가 흐르면 이전에 기록해놓았던 2진 전기 신호들을 재현하는 장치입니다.

결론적으로 컴퓨터는 0과 1의 전기 신호를 처리하는 장치, 프로그램은 0과 1들의 전기 신호들를 저장장치에 기록해 놓은 것이며 프로그래머는 0과 1들의 전기 신호들을 기록하는 사람들이라고 할 수 있습니다.

그러면 프로그래머들은 프로그래밍을 할 때 0과 1을 써넣는 작업을 하나요? 처음에는 진짜 그랬습니다. 하지만 프로그래밍 언어를 통해 0과 1을 직접 써넣을 필요가 없어졌습니다.

다음글에서는 프로그래밍 언어의 발달 과정을 알아 보겠습니다.

컴퓨터 프로그램은 어떠한 문제를 해결하기 위해서 컴퓨터가 해야 할 일들을 작성해 놓은 코드들의 모음입니다.

여기서 '문제의 해결'이라는 것은 다른말로 '목적의 달성'이라고 생각할 수도 있습니다. 전역일 계산기 프로그램은 남은 복무 기간를 표시하는 것이 프로그램의 목적이 되고 게임의 경우 사용자에게 즐거움을 주는 것이 목적이 됩니다.

프로그램이 해결할 문제/목적이 정해지면, 이를 달성하기 위한 구체적인 과정이 논리적으로 계획되어야 하는데, 이 구체적인 실행 계획을 알고리즘이라고 합니다. 전역일 계산기를 예로들면:

  1. 입대날짜를 입력받음
  2. 복무기간을 입력받음
  3. 남은 기간 계산 (남은 기간 = 입대날짜+복무기간-오늘날짜)
  4. 남은 기간 화면에 표시

이 정도면 컴퓨터가 실행할 수 있을 것 같습니다. 이제 각각 항목을 코드로 작성(코딩)하면 프로그램이 됩니다.

게임을 만드는 것은 훨씬 복잡한 알고리즘을 필요로 합니다. 비행기 슈팅 게임을 만들 때 실제 게임의 진행 방식을 생각해 봅시다.

  1. 배경을 화면에 그림
  2. 플레이어 비행기를 화면에 그림
  3. 적 비행기를 화면에 그림
  4. 적비행기 총알을 만들고 화면에 그림
  5. 0.05초 기다림
  6. 방향키 입력이 있으면 플레이어 비행기를 그 방향으로 한칸 움직임
  7. 발사키 입력이 있으면 플레이어 비행기에서 총알을 만들고 화면에 그림
  8. 게임 종료키 입력이 있으면 게임 메뉴 화면으로 돌아감
  9. 적 비행기 움직임
  10. 총알들을 움직임
  11. 배경을 움직임
  12. 총알들 충돌확인 후 할 일(플레이어가 적군 총알에 맞는 경우 플레이어 생명 감소, 적군총알이 내 총알에 맞는 경우 둘다 사라짐 등등)
  13. 비행기들 충돌확인 후 할 일(플레이어의 생명 감소 등)
  14. 처음으로 돌아감

이런식으로 굉장히 구체적으로 계획을 세워야 합니다. 이마저도 간단하게 작성된 것이고 실제로 게임을 만들기 위해서는 더욱 구체적인 세부 사항들까지 생각해야 합니다.(적 비행기의 출현, 이동경로, 점수의 계산, 총알이 몇 개까지 나갈지 등등등)

이렇게 만든 알고리즘을 코드로 작성하면 아래와 같은 게임이 됩니다. 아래는 C언어로 작성한 비행기 게임입니다.

프로그래밍을 한다는 것은 1. 컴퓨터가 처리할 수 있는 알고리즘을 만들고, 2. 그 알고리즘을 코드로 작성하는 것입니다.

알고리즘을 잘 만들기 위해서는 목적과 기능을 구체적, 논리적으로 쪼개고 정리하는 방법을 연습해야 하고, 코드를 작성하기 위해서는 자바스크립트, 자바, C, C++, C#, 파이썬 등의 프로그래밍 언어의 문법과 사용법을 익혀야 합니다.

이 강의 시리즈에서는 프로그래밍을 전혀 모르는 사람들을 대상으로 프로그래밍에 대한 일반적인 지식과 자바스크립트를 사용하여 코딩을 하는 방법을 알아보겠습니다.

+ Recent posts