1. C# 컴파일러
컴퓨터는 인간의 언어를 이해 못 해. 컴퓨터는 심지어 프로그래밍 언어도 이해 못 해. 오직 0과 1로 이루어진 머신 코드로 작성된 프로그램만 이해하지.
강아지한테는 "옆에", "손" 같은 명령이 있잖아? 컴퓨터에서는 그런 명령의 역할을 숫자가 해: 각 명령은 어떤 숫자로 인코딩돼 (이걸 머신 코드라고도 해).
숫자로만 프로그램을 짜는 건 진짜 힘들어서, 사람들이 프로그래밍 언어랑 컴파일러를 만들었어. 이런 언어는 한편으론 사람이 이해하기 쉽고, 다른 한편으론 컴파일러가 이해할 수 있어. 컴파일러는 프로그래밍 언어로 작성된 프로그램 텍스트를 머신 코드로 바꿔주는 특별한 프로그램이야.
보통 프로그래머는 프로그래밍 언어로 코드를 짜고, 그 다음에 컴파일러를 실행해서, 작성한 코드 파일들을 기반으로 하나의 머신 코드 파일(최종 컴파일된 프로그램)을 만들어.
- C++ 언어로 작성된 프로그램
-
컴파일러
- 머신 코드로 이루어진 프로그램
이렇게 만들어진 프로그램은 바로 컴퓨터에서 실행할 수 있어. 근데 이런 방식의 단점은, 만들어진 프로그램의 코드는 CPU랑 운영체제에 엄청 의존적이라는 거야. Windows용으로 컴파일된 프로그램은 Android 폰에서 실행 안 돼.
만약 네가 Android용으로 프로그램을 만들었다면, Windows 운영체제에서는 실행 안 돼!
근데 C#은 훨씬 더 혁신적인 방식을 써.
- C# 언어로 작성된 프로그램
-
C# 컴파일러
- 특별한 IL 코드로 이루어진프로그램 (바이트 코드)
-
CLR
- 머신 코드로 이루어진 프로그램
C# 컴파일러는 모든 클래스를 하나의 머신 코드 프로그램으로 컴파일하지 않아. 대신에, 네 코드를 머신 코드가 아니라 특별한 중간 IL 코드(바이트 코드)로 컴파일해. 머신 코드로의 컴파일은 프로그램 실행 시에 이뤄져.
그럼 프로그램을 실행할 때 누가 머신 코드로 컴파일해줄까?
이걸 위해서 CLR(Common Language Runtime)이라는 특별한 프로그램이 있어 — C#의 가상 머신이지. 먼저 CLR을 실행하고, 그 다음에 바이트 코드로 된 프로그램을 실행해. 그리고 CLR이 실제로 프로그램을 실행하기 전에 머신 코드로 컴파일해줘.
만약 네 CPU가 더 많은 머신 명령어를 지원하는 최신형이라면, "두 번째 컴파일" 때 네 CPU와 OS에 맞는 머신 코드가 생성돼. 그래서 C#이 가끔 C++보다 더 빠를 수도 있어. C++은 바로 머신 코드로 컴파일돼서 CPU의 가장 흔한 명령어만 쓸 수 있거든.
2. 컴파일 시 흔한 에러
속도랑 코드 최적화는 지금은 별로 중요하지 않고, 진짜 중요한 건 컴파일러가 네 프로그램의 에러를 체크해준다는 것이야. 컴파일러는 코드가 맞는지 확인하고, 작은 실수라도 있으면 실행을 막아버려.
에러 예시:
문자열만 저장할 수 있는 변수에 숫자를 넣으려고 할 때.
string userName = 42; // 앗! 이렇게 하면 안 돼.
컴파일러는 바로 타입이 안 맞는다고 에러를 내: "Cannot implicitly convert type 'int' to 'string'".
또 다른 예시 — WriteLine() 명령에서 오타가 있을 때:
Console.WriteLin("안녕!"); // 메서드 이름에 오타
컴파일러가 말할 거야: "그런 메서드 없어 — 문법 확인해!"
에러 읽는 법?
대부분의 컴파일러는 코드에서 에러가 어디 있는지 알려주고, 가끔은 수정 방법도 제안해줘. 에러를 두려워하지 마: 에러 하나하나가 네 내면의 "보스"를 깨는 한 걸음이야.
3. 주석
자, 상상해봐: 복잡한 프로그램을 짜고 있어. 다 잘 돌아가고, 넌 천재야! 근데 한 달 뒤에 그 코드를 열었더니... 아무것도 모르겠는 거야. 여기저기 이상한 변수, 무슨 코드인지도 모르겠고. 머릿속엔 "이건 내가 쓴 게 아니야!"만 맴돌지. 이럴 때 주석이 널 구해줘.
주석은 교과서 여백에 쓰는 메모나 냉장고에 붙인 쪽지("맥주. 마시지 마. 내일 아침!") 같은 거야. 컴파일러는 주석을 완전히 무시하고, 사람만 읽어. 주석은 코드의 의미를 설명하거나, 중요한 부분을 표시하거나, 심지어 프로그램의 일부를 "꺼버릴" 때도 써.
중요: 어떤 컴파일러도 네 주석을 읽지 않아, 완전히 무시돼!
한 줄 주석
C#에는 두 가지 주석이 있어 — 한 줄 주석이랑 여러 줄 주석. 한 줄 주석은 더블 슬래시 //로 시작해서 줄 끝까지 가. // 뒤에 있는 건 전부 주석이고, 컴파일러가 완전히 무시해.
예시:
Console.WriteLine("안녕, 세상!"); // 이건 인사말을 화면에 출력해
여기서 // 이건 인사말을 화면에 출력해 — 이게 주석이야. 코드에서 이 줄이 왜 필요한지 모르겠으면, 이렇게 써!
또 다른 예시:
int x = 42; // 프로그래머의 나이 값
한 줄 주석을 따로 줄에 쓸 수도 있어:
// 사용자 이름 변수 초기화
string userName = "바샤";
거의 대본의 대사처럼: 주석이 왜, 무엇 때문에 필요한지 설명해줘.
여러 줄 주석
만약 쓸 말이 많으면? 진짜 스토리가 있다면? 이럴 땐 여러 줄 주석을 써. /*로 시작해서 */로 끝나. 이 사이에 있는 건 전부 컴파일러가 무시해, 줄이 여러 개여도 상관없어.
예시:
/*
여기서 우리는 사용자 이름을 화면에 출력해.
이름이 없으면 "손님"이라고 쓸 거야.
*/
Console.WriteLine("이름을 입력하세요:");
또는 이렇게:
int age = 18; /* 새 사용자용
나이의 초기값 */
주의: 여러 줄 주석 안에 또 다른 여러 줄 주석을 넣을 수 없어. 컴파일러보다 똑똑하려고 하지 마 — 안 돼.
일러스트:
| 종류 | 문법 | 예시 |
|---|---|---|
| 한 줄 | // 주석 |
int x = 1; // 설명 |
| 여러 줄 | /* 아무거나 여기 */ |
/* 원하는 건 다 설명 가능 */ |
4. 실생활 예시
코드 줄 "끄기":
가끔 코드의 일부를 잠깐 실행 안 하고 싶을 때가 있어. 이럴 때 주석이 딱이야:
// Console.WriteLine("잠깐 필요 없는 텍스트");
줄은 남아있지만, 컴파일러는 "안 보여".
TODO와 FIXME 메모
프로그래머도 사람이니까, 가끔 스스로에게 "이 코드는 아직 미완성이야"나 "여기 버그 있음" 같은 메모를 남겨야 해. 그래서 자주 이렇게 써:
// TODO: 빈 입력 체크 추가하기
// FIXME: 이 함수가 합계를 잘못 계산함
많은 에디터랑 IDE가 이런 단어를 하이라이트해줘!
프로그래머 농담
그리고, 물론, 코드에는 아주 재밌는 주석도 종종 있어:
// 난 이 코드에 책임 없어. 억지로 썼어.
// 미래의 나에게! 이 코드는 미안해.
// 이런 걸 또 보면, 출근할 때 무기 들고 가야 할 듯.
// 이 조건이 언젠가 실행되면, 보상 줄 테니 xxx-xxx-xxx로 연락해줘.
// 프로그래머에게:
//
// 이 서브루틴 "최적화" 끝내고
// 이게 얼마나 큰 실수였는지 알게 되면,
// 아래 카운터를 올려서 다음 사람에게 경고해줘:
//
// 시간_여기_날린_횟수 = 42
// 이걸 쓰기 시작할 땐, 신과 나만 내가 뭘 하는지 알았어.
// 지금은 신만 알아
// 가끔 컴파일러가 내 모든 주석을 무시하는 것 같아
// 내 모든 코드와 노력을 내 아내 달린에게 바친다.
// 이게 프로덕션에 들어가면, 그녀가 나랑 우리 세 아이, 그리고 강아지를 먹여 살려야 할 거야.
맞아, 주석은 진짜 웃길 수 있어. 왜냐면, 이건 살아있는 사람들이 쓰니까.
GO TO FULL VERSION