시리즈:쉽게 배우는 프로그래밍 입문

문서의 내용이 너무 쉬워서 오늘부터 프로그래밍 할 수 있을 것 같습니다.

이 문서에는 독자적으로 연구한 내용이 들어갑니다. 다른 사람의 의견을 존중하면서 무례하지 않도록 작성해 주시고, 의견 충돌 시 토론 문서에서 토론해 주세요.

들어가기 전에

이 항목은 예비 컴퓨터공학/과학 생들이 프로그래밍의 기초적인 내용을 적는 집단연구문서입니다.

이 항목에 내용을 추가하시는 분들께서는 대상층이 예비 대학교 1학년생이라 생각하시고 내용을 추가해 주셨으면 좋겠습니다.

만약에 항목에 없는 새로운 언어를 기준으로 추가하실 경우, 새로 목차를 만들어 주시길 바랍니다.

틀:쉽게 배우는 프로그래밍 입문

프로그래밍을 대하는 우리의 자세

프로그래밍은 어려운 것이 아니다.

...뒤로 가기나 편집 버튼을 누르기 전에, 이 문단을 끝까지 읽어보자. 정말로, 프로그래밍은 어려운 것이 아니다. 쉽다고도 안했다 단지 배울 수 있는 양이 방대할 뿐이다. 이해하기 쉽게, RPG로 비유해보도록 하겠다. 당신은 LV 1 용사고 이제 막 마을을 떠나 모험을 떠나려는 것일 뿐이다. 그런 당신의 앞에 400 LV짜리 히든보스가 나올 것 같은가? 처음부터 50레벨짜리 몬스터 인카운트만 돌아다니고, 당신은 처음부터 그걸 때려잡으려고 달려들텐가? 아니다. 당신은 그냥 마을 근처에 돌아다니는 손쉬운 LV 1 슬라임부터 잡으며 천천히 성장해나갈 것이다. 프로그래밍도 마찬가지다. 포인터니 오브젝트니 팩토리니 싱글턴이니 하는 렙제도 까마득한 장비를 좁은 인벤토리에 벌써부터 우겨넣고 낑낑댈 필요가 없다. 다 내려놓고, 차분한 마음과 힘찬 도전정신만 장착한 채 눈앞의 슬라임에 집중하자. 놈은 생각보다 연약하다.

프로그래밍을 배우는 사람들이 첫번째로 만나는 강적이 바로 오류, 버그다. 그대로 했는데 왜 오류가 나나요? 오류때문에 코딩을 할 수가 없어요. 오류가 자꾸만 나는데 아몰랑 안할래 하는 사람들이 많다. 하지만, RPG 좀 해본 사람이라면 알 것이다. 어려운 적일수록 많은 경험치를 제공한다는 것을 말이다. 프로그래밍이란 RPG는 코딩간 수없이 반복되는 전투와 시행착오로 경험치를 쌓아 레벨업을 해서 점차 오류에 대한 대처능력을 키우는 생존게임이지, 천재적인 컨트롤로 완전무결한 플레이를 해야하는 액션 게임이 아니다.[1] 오류를 두려워하지말고 오류를 환영하라. 반갑게 맞이하여 오류를 정복하라. 그 다음 동일한 오류가 발생하면 당신은 한칼에 그 오류를 박살낼 수 있게 된다. 그렇게 박살낸 오류가 많을수록 당신의 코딩레벨은 올라간다. 오류를 쓰러뜨리기 힘들다고? 인터넷에서 공략을 찾아보고 고수들에게 질문을 날려라. 제작사에서 제공하는 '레퍼런스'라는 가이드북이 있고, 고레벨 유저들이 당신의 질문에 친절하게 대답해줄 것이다.

두번째로 만나는 심리적인 장벽이 바로 무결성에 대한 집착이다. 무식하고 비효율적인 방법으로 코딩을 하고, 모 드라마에서 나오는 것 처럼 열 줄이면 될 코드를 백 줄로 짠다고 해서 당신은 재능이 없거나 프로그래밍에 어울리지 않는 사람이 아니며, 당신이 지금껏 배우고 익힌 것이 쓸데없어지는게 아니다. 당신은 단지 더 나은 방법을 아직 익히지 못했을 뿐이다. 당신은 돈 받고 코딩해주는 프로도 아니고, 이제 막 첫걸음을 떼는 초보다. 쉽고 멋진 방법을 모르는 것은 당연하지 않은가! 아니, 사실 까놓고 말하면 현업전선에서도 편법과 꼼수로 일단 되게만 해놓는 프로그래밍이 횡행하고 있다. 리팩토링[2]좀 하자는 말이 굉장히 자연스럽게 나오는게 그바닥이다. 그러니 집착을 버리고, 열린 마음으로 프로그래밍을 대하자.

어떤 언어가 좋은가를 따지거나, 여러 언어를 한번에 배우려는 시도를 처음부터 하는 사람이 간혹 있는데, 그냥 한 언어를 열심히 배우는 것을 권한다. 프로그래밍이라는 것이 결국 대동소이한 것이라 언어간 차이라고 해봤자 문법차이가 대부분이기 때문이다.[3]그러니 시작한 언어가 뭐든 간에 프로그래밍 자체를 잘 배워놓으면 그 언어로 짜는 프로그램에 제한이 있을때 자기가 알아서 갈아타게 된다. 별거없는 기능이라 MFC써서 짜기 개같아서 VBS로 걍 뚝딱 만든다던가... 데모샷 프로그램 만들어야되는게 그거 다 짜기 개같아서 ActionScript 잠깐 배워서 플래시로 뚝딱 만든다거나...

공통 용어

어떤 프로그래밍 언어를 사용하든지 반드시 알아야 할 용어들을 정리하였다.

변수

프로그램을 실행하였을 때, 프로그램의 자료를 메모리에 올릴 때, 데이터를 저장하는 메모리에 있는 공간

상수

프로그램에서 값을 바꿀 수 없고 고정되어 있는 변수, 또는 값(그냥 데이터).

함수

함수(function), 서브루틴(subroutine), 루틴(routine), 메서드(method), 프로시저(procedure)

프로그램에서 특정 동작을 수행하는 코드 부분이다.

번역기

어떠한 언어를 다른 언어로 바꾸어 주는 프로그램을 번역기라고 한다. 보통 세가지 경우를 생각할 수 있다.

첫째로 고급 언어를 저급 언어로 바꾸는 경우이다. 도착어가 기계어나 바이트 코드인 경우. 어쨌든 실행하면 CPU가 알아먹어야 하므로 모든 언어는 기계어로 도착한다고 할 수 있겠다.

둘째로 고급 언어를 고급 언어로 바꾸는 경우이다. source-to-source compiler라고 한다. 구현체나 버전의 차이를 매꿔야 하는 경우, 혹은 도착어를 좀 더 쉽게 쓰려 하는 경우 등이 이에 속한다.

다음의 예가 있겠다:

  • 자바스크립로 번역되는 CoffeeScript[4]
  • 자바스크립트로 번역되는 Dart[4]
  • 자바스크립트로 번역되는 TypeScript[5]
  • 루비를 자바스크립트로 번역해주는 Opal

전부 도착어가 자바스크립트인 것 같다면 착각이다.

마지막으로 저급 언어를 고급 언어로 바꾸는 경우가 있다. 이를 decompiler라고 한다. 이런 경우는 소스코드를 실행하기 위한 목적이 아니라 아니 애초에 고급언어도 결국 기계어로 실행시키는데 굳이 이런 뻘짓을 해서 실행시킬 이유가 뭘까 프로그램을 분석하는 게 주 목적이다.

해석하는 방식에 따라서도 두가지로 나눌 수 있다.

하나는 번역할 코드를 모두 읽어들인 후 한 번에 번역하는 컴파일러(compiler)이다. 컴파일 타임에 오류를 잡아낼 수 있으며 통번역되기 때문에 속도가 월등히 빠르다.[6]

또 다른 하나는 컴파일러와 다르게 한 줄 한 줄씩 읽어들인 후 번역하는 인터프리터(interpreter)이다. 특징은 미리 번역할 필요가 없기 때문에 코드를 즉시 실행할 수 있어 테스트에 유용하며 변수의 종류를 지정하지 않아도 인터프리터가 잡아내기 때문에 문법이 유연해진다. 대표적인 인터프리터 언어로는 파이썬이 있다.

둘을 융합한 JIT(Just-in-time 컴파일)이라는 것도 있다. 미리 코드를 통번역 하지 않고, 프로그램을 시작할 때 필요한 부분만 번역하는 방식을 말한다. 예로 PyPy, Dalvik VM등이 있다.

빌드

프로그램의 소스코드를 실행 가능한 파일 형태로 변환하는 것을 말한다. 참고로 이는 컴파일이 필요한 언어에서 사용하는 용어로, 인터프리터 언어는 애초에 즉시 실행이 되기 때문에 "빌드"라는 개념이 존재하지 않는다.

통합 개발 환경

Integrated Development Environment, 보통 IDE로 줄여 사용한다. 기본적으로 컴파일러, 디버거, 텍스트 편집기를 포함한다. Visual StudioEclipse처럼 기본적인 기능 외에 추가적인 기능을 자체적으로 또는 플러그인을 통해 제공하기도 한다.

  1. 프로그래밍은 만렙이 없는 게임이다. 전세계 랭커들도 항상 오류와 버그를 잡으면서 레벨업에 매진하고 있다.
  2. 비효율적이거나 용도가 제한적인 코드를 고쳐서 효율적이고 다용도로 만드는 작업.
  3. 물론 진짜 그런 것은 아니고, 언어별로 자잘한 차이나 장단점, 가능/불가능한 요소 등 여러 차이가 있지만 학습량에 있어서는 정말로 언어간 문법차이 배우는게 대부분이다.
  4. 4.0 4.1 언어 자체가 JavaScript로 번역되는 것을 전제로 만들어졌다.
  5. 언어 자체가 JavaScript로 번역되는 것을 ㅈ...
  6. 무슨 언어로 컴파일 되냐에 따라 다르다. 보통은 기계어로 컴파일 되기 때문에 아무래도 빠르지만 자바 프로그램의 경우 자바 바이트코드로 컴파일하여 JVM이라는 인터프리터에서 실행하기 때문에 실행속도에 차이가 난다.