----------------
title : C 언어 및 강좌 관련 자주 질문되는 것들에 대한 답변
publish_date : 2015-08-11
path : /C
--------------

C 언어 및 강좌 관련해서 자주 질문되는 것을을 모아보았습니다 C 언어 및 강좌 관련해서 자주 질문되는 것을을 모아보았습니다.


질문 댓글을 달기 전에 여기를 먼저 확인해보셨으면 좋겠습니다 :)


###  강좌에 관한 질문들


#### 이 블로그는 왜 운영하는 것이지요?

저는 C 와 C++ 을 오로지 책과 인터넷으로만 배웠기 때문에 그 어려움이 상당히 컸습니다. 더군다나, 지금은 물론 양질의 자료들이 매우 많아졌지만 제가 본격적으로 공부를 하던 2006년 그 당시만 해도 인터넷에선 공짜로 컴퓨터 언어를 배운다는 거 그 자체가 꽤나 까다로웠습니다.

물론 영문으로 된 훌륭한 자료들은 많았지만, 한글로 되어 있는 양질의 자료들은 별로 없었습니다. 게다가 혼자서 컴퓨터 언어를 배우다 보니까 아리송하고 이해하기 힘든 부분을 쉽게 설명해주는 강사도 옆에 없었습니다. (포인터 개념을 이해하느라 몇 주를 고생했는지 모르겠습니다...) 그래서 훗날 저는, 혼자서 공부하는 저 같은 사람들을 위해서

1. 인터넷 상에서 무료로 볼 수 있으며
2. 초보자들의 눈높이 상에서 설명하며
3. 어떠한 궁금증도 쉽게 긁어줄 수 있는

그러한 강좌를 써보자 하는 생각을 하였습니다. 그리고 탄생한 그 결실이 '씹어먹는 C 언어' 입니다. C 언어를 배우고자 하는 모든 사람들이 프로그래밍을 할줄 아냐 모르냐에 전혀 구애받지 않고 밑바닥 부터 차근차근 알려주는 그러한 강좌 입니다. 그리고 당연하게도, 지금 여러분들이 보시다 싶이 무료로 제공되고 있고 추후 변경할 계획도 없습니다.후에 이 씹어먹는 C 언어 강좌가 꽤나 성공적이였기에, 저는 좀 더 확대해서 C++ 강좌도 써보고, 여러 레퍼런스들도 자료들도 업로드 하기 시작하였습니다. 그리고 무엇보다도, 영어로 된 훌륭한 자료들을 번역해서 제공하는 '오픈 북 프로젝트' 도 진행하고 있습니다.


####  강좌는 언제 올리시나요?

강좌를 다 써야 올립니다 :) 저도 언제 올릴 수 있는지는 잘 모르겠습니다. 현재 C++ 그 다음 강좌를 작성중에 있는데 이 역시 언제 작성이 완료될 지는 잘 모르겠습니다. 목표는 2017년 안에 C++ 강좌를 완성하는 것입니다!

####  댓글은 언제 다시나요?

강좌는 자주 못올리지만 댓글은 틈틈히 달 수 있도록 노력하고 있습니다. 특히 오타나 잘 이해가 안가는 부분을 지적해주는 댓글은 정말 환영입니다. 물론 생각해보기에 대한 답도 댓글로 달아주시면 감사하겠습니다!

하지만 볼 때 당황스러운 댓글들은, '그냥 이해가 안가요' (그럼 제가 어떻게 도와줘야 되나요!) 나 강좌에 전혀 관련 없는 소스코드나 자신의 숙제를 올려 놓고 '왜 오류가 나는지 모르겠어요', '어떻게 해야해요?' 등 이러한 대책없는 댓글들이 있습니다. 이런 댓글들은 자제해주시면 감사하겠습니다.

#### 누구세요?

[이재범 입니다](http://itguru.tistory.com/251)

###  C 언어

#### C 언어가 무엇인가요?

C 언어는 컴퓨터 언어의 한 종류 입니다. 우리가 다른 사람과 소통할 때 언어가 필요하듯이, 컴퓨터에게 이런 저런 일들을 시키기 위해서는 역시 언어가 필요합니다. 사실 컴퓨터는 잘 알려져 있듯이 0 과 1 을 나타내는 각각의 전기 신호들로 밖에 소통할 수 없습니다. 다시말해, 컴퓨터에게 무언가 이야기 하려면 0 과 1 의 조합으로 얘기를 해야 된다는 것이지요.

하지만 이는 인간에게 너무 불편합니다. 그래서, 좀더 사람이 이해하기 쉽게 만든 것이 C 언어 이고, 이 C 언어로 작성된 코드는 '컴파일' 이라는 과정을 거쳐서 0 과 1 의 언어로 탈바꿈 하게 되는 것입니다 C 언어는 컴퓨터 언어의 한 종류 입니다.

우리가 다른 사람과 소통할 때 언어가 필요하듯이, 컴퓨터에게 이런 저런 일들을 시키기 위해서는 역시 언어가 필요합니다. 사실 컴퓨터는 잘 알려져 있듯이 0 과 1 을 나타내는 각각의 전기 신호들로 밖에 소통할 수 없습니다.

다시말해, 컴퓨터에게 무언가 이야기 하려면 0 과 1 의 조합으로 얘기를 해야 된다는 것이지요. 하지만 이는 인간에게 너무 불편합니다. 그래서, 좀더 사람이 이해하기 쉽게 만든 것이 C 언어 이고, 이 C 언어로 작성된 코드는 '컴파일' 이라는 과정을 거쳐서 0 과 1 의 언어로 탈바꿈 하게 되는 것입니다.\sidenote{정확히 말하면, C 언어 코드 -> 어셈블리어 -> 0 과 1의 언어 의 단계가 있지만 설명의 단순화를 위해 그냥 이렇게 정리하겠습니다}

#### C 언어를 왜 배우나요?

까놓고 말해서 굳이 C 언어를 프로그래밍 입문 용으로 배울 필요는 없습니다. 왜냐하면 C 언어는 제대로 알고 쓰기에굉장히어려운 언어이기 때문이까요. C 언어를 처음 만들었던 시기는 1970년대 입니다. (위키피디아에 따르면 1969 ~ 1973년 이라 하네요) 이 시기에는 프로그래밍은 정말 정말 전문가들이나 할 수 있는 시기였습니다.

이렇게 수염난 아저씨들이나 할 수 있던 시절이였습니다. 이 사람들 한테 굳이 쉽고 이해하기 편한 언어가 필요했을까요? 물론 C 언어의 문법들이 현재의 대부분의 컴퓨터 언어의 기반이 된다는 것은 틀림 없이 맞는 말이지만 그렇다고 해서 이 언어를 반드시 배울 필요는 없는 셈입니다. 하지만 C 언어를 배우고 어느 정도 깊게 이해한다면 여러분들은 다음과 같은 능력을 기룰 수 있습니다.

C 언어를 배움으로써 가장 좋은 점은, 컴퓨터가 대략 어떻게 돌아가는지 이해할 수 있다는 것입니다. 많은 사람들은 흔히 C 언어가 빠르다고 이야기 합니다. 그 이유는 사실 C 언어는 언어 차원에서 많은 것을 하지 않기 때문입니다. 다시 말해 프로그래머가 자기 마음대로 언어의 제약 없이 무언가를 할 수 있습니다. 이 때문에 C 언어로 제대로 코딩하기 위해선 여러분들은 컴퓨터가 어떻게 돌아가는지를 잘 알고 있어야 합니다.

두 번째로 좋은 점은 C 언어로 코딩함으로써 후대에 발전한 언어들을 좀 더 잘 이해할 수 있다는 것입니다. 이게 무슨 말이냐 하면, 후대의 많은 언어들이 C 언어로 프로그램을 설계하였을 때 부족했던 점, 힘들었던 점들을 보완하면서 발전해나갔다는 것입니다. 사실 요즘 유행하고 있는 `Java` 나 C++ 을 바로 먼저 배워도 상관 없지만, '왜 하필 이렇게 했을까?' 라는 고민에 대한 해답을 얻기는 힘듭니다. 

예를 들어 초장부터 객체지향 프로그래밍을 배우면, 왜 도대체 이런 방식을 만들어냈을까 알 수 없습니다. 이런 고민에 대한 해답은 이들 언어가 없었을 적 시절인, C 언어 시절로 돌아가 프로그래밍 함으로써 배울 수 있습니다.

마지막으로 다른 언어들이 범접할 수 없는 영역이 있다면 바로 임베디드 프로그래밍 부분 입니다. 이러한 곳에서는 메모리 사용도 매우 제한되고 속도도 매우 느리기 때문에, 시스템에 가장 가까이에서 최적화 할 수 있는 C 언어가 제격이라 볼 수 있습니다. 또한 대부분의 플랫폼에서는 적어도 C 컴파일러 하나쯤은 지원하기 때문에 C 언어 하나만 알고 있어도 거의 대부분의 환경에서 작동하는 어플리케이션을 만들 수 있습니다.

####  C 언어로 무엇을 할 수 있나요?

간단히 이야기 하자면 여러분이 상상하는 모든 프로그램은 C 로 만들 수 있습니다.

#### 이 강좌를 마치면 스타크래프트나 `MS` 워드 같은 프로그램들을 만들 수 있나요?

안타깝게도 여러분이 이 강좌에서 시작할 때 부터 끝까지 보게될 것은 까만 화면에 나오는 글씨들일 뿐입니다. 저 같은 경우도 처음에 C 언어를 배우기 시작할 때, "아 나도 스타크래프트 같은 게임이나 `MS` 워드 같은 멋진 프로그램들을 만들 수 있겠지?" 라는 꿈을 품었었습니다.

그런데, 처음에 까만 화면에 글자 몇 개 뛰우는 것을 가르쳐주는 것을 보고 "흠, 처음에는 요렇게 간단한 것 부터 배우는 구나" 라고 생각하고, 책을 첨 부터 끝까지 살펴보았습니다. 맨 마지막 페이지에 멋진 프로그램을 만들 줄 알고 기대하였는데, 여전히 까만 화면에 글씨 띄우는 것이였습니다.

이 강좌는 C 언어를 배우는 강좌 입니다. C 언어 역시 하나의 '언어' 입니다. 영어를 처음 배울 때 생각해보세요. 영어를 처음 배울 때에는 단어를 외워야 하고, 문법을 배웁니다. 그리고 간단한 문장 정도를 쓰는 것을 연습합니다. 물론 끝으로 갈 수 록 짧은 영어로 에세이 정도는 쓰겠지요. 어느 누구도 영어를 처음 배우는 당신에게 소설 한 권을 쓰라고 주문하지 않습니다.

C 언어를 배우는 과정도 마찬가지 입니다. 처음에 C 언어의 몇 가지 개념들과 문법들, 그리고 수십 줄 혹은 수백 줄 정도 되는 프로그램 하나를 짜는 것을 연습합니다. 이 정도가 이 강좌에서 다루는 한계 입니다. 스타크래프트나 `MS` 워드 같은 거대한 프로그램을 만드는 것은, 영어로 소설 한 권을 쓰는 것과 비슷한 일입니다. 이를 위해서라면, 조그만 프로그램들도 많이 만들어보고, 무엇보다도 요즘에는 이런 거대한 프로그램을 혼자서 만드는 것이 아니기 때문에 다른 사람들과 협력하면서 코딩하는 법도 배워야 할 것입니다.

그렇다면 여러분은 과연 그런 삐까뻔적 한 프로그램들은 어떻게 만드는지 궁금하실것입니다. 까만 화면에서 탈피해서 무언가 진짜로 윈도우즈 상에서 돌아가고 싶은 애플리케이션을 만들고 싶은 분들은 `Windows API` 혹은 `MFC` 를 공부하던지 (옛날 방식), `Qt` 를 사용 하실 수 도 있습니다. 아니면 요즘 마이크로소프트에서 밀고 있는 C# 을 이용할 수 도 있습니다.

'그걸 왜 이제 말해주냐!' 며 '처음부터 얘네들을 먼저 배우면 좋지 않았냐' 라고 반문 하실 수 도 있는데, 확시리 C 언어를 하나 제대로 알고 딴 언어들을 배우면 확실히 편합니다.. 진짜로요

#### 해킹을 배우고 싶습니다. 무엇을 먼저 배워야 하나요?

어떠한 분야로 나가는지는 모르겠지만 기본적으로 C 언어는 할 줄 알아야 합니다. C 언어 먼저 배우시고 나중에 생각해보세요

#### C 랑 C++ 은 다른 언어인가요?

네. 매우 다른 언어 입니다. 초기에는 C++ 이 C 언어의 단순한 확장팩이라고도 했었지만 (그래서 C++ 초기 이름이 C with `class` 입니다) 그 후에 C++ 이 엄청나게 커져 버려서 사용하는 방식에 있어서 아예 다른 언어가 되버렸습니다. C++ 과 C 와의 문법은 매우 유사하지만 ( [같다고 생각하는 사람들이 있는데 미묘하게 다릅니다](http://web.archive.org/web/20080617183013/http://www.research.att.com/~bs/bs_faq.html#C-is-subset)), 근본적으로 다른 목적을 가지고 만들어진 언어입니다. 물론, C++ 컴파일러로 C 언어 코드를 컴파일 할 수 있기는 합니다.

#### 윈도우즈 `API` 가 무엇인가요?

여러분이 지금 사용하고 있는 운영체제인 Windows 에서 돌아가는 어플리케이션을 제작을 위해서 마이크로소프트에서 제공하는 인터페이스(- 쉽게 말해 여러가지 함수들) 라고 하면 됩니다. 예컨대, 제가 창이 하나가 있는 프로그램을 만들고자 합시다. 그렇다면, '창' 을 만드는 함수를 만들어야 겠지요? 이를 Windows 에서는 함수의 형태로 제공하게 됩니다.

![](http://img1.daumcdn.net/thumb/R1920x0/?fname=http%3A%2F%2Fcfile9.uf.tistory.com%2Fimage%2F2551764D55C959F1343CCF)

이런 까만화면에서..!

[](http://img1.daumcdn.net/thumb/R1920x0/?fname=http%3A%2F%2Fcfile10.uf.tistory.com%2Fimage%2F2121454D55C959F211CF60)

진짜 윈도우를 띄운다!

또한, 제가 제 프로그램의 특정 부분을 클릭 하였다고 합시다. 제가 어디 한 곳을 클릭을 하면, 이 사실은 운영체제에 전달되는데, 운영체제는 이 메세지를 다시 제 프로그램에 뿌려주고, 제 프로그램은 메세지를 받을 준비를 하다가 받게 되면 적절한 처리를 하게 됩니다.

이렇게 운영체제에서 제공하는 기능들을 사용하기 위한 것이 바로 윈도우즈 API 이고, 이를 사용할 줄 알아야 윈도우즈에서 까만 콘솔창이 아닌 우리가 생각하는 그런 프로그램들을 만들 수 있게 되는 것입니다. 윈도우즈 API 는 대부분이 C 로 구성되어 있습니다. 즉, 이 강좌를 마치신 분들은 바로 `Windows API` 를 사용해서 애플리케이션을 만들 수 있습니다!



###  비주얼 스튜디오 (Visual Studio) 사용 관련 문제들


#### Error LNK:1123 COFF로 변환하는 동안 오류가 발생했습니다

[http://www.microsoft.com/ko-kr/download/details.aspx?id=23691](http://www.microsoft.com/ko-kr/download/details.aspx?id=23691)에 들어가서 비주얼스튜디오 2010 서비스팩 1 을 설치하시면 됩니다.

####  화면에 바로 꺼집니다.

비주얼스튜디오 상에서 프로젝트를 생성할 때 '새 콘솔 어플리케이션' 으로 설정해야지, '아무 키나 누르세요' 가 나오는 것이 지원됩니다. 그래도 꺼진다면, 프로그램 맨 마지막에 `scanf` 로 문자 하나 받는 루틴을 넣어보세요. 그러면 이 입력을 대기하느라 종료되지 않을 것입니다.

#### 소스를 한 번에 정렬하고 싶습니다. 

http://itguru.tistory.com/142 를 참조하세요



###  C 언어 공부 관련

####  (첫 생각해보기) 에서 막혔습니다. 도와주세요!

아마 C 언어를 처음 배우신 분들이라면, 이 생각해보기가 처음으로 독자적으로 처음 부터 끝 까지 코딩하게 되는 것일 겁니다. 무언가 여태까지는 남의 도움을 받아서 코딩을 해왔는데 막상 혼자 만들려고 하니까 머리도 하얘지고 뭐가 어떻게 해야 될지 모르겠지요. 그럴 때는 키보드에 손가락을 올리기 보다는 종이와 펜을 꺼내와서 어떤 식으로 구상할 지 생각해보는 것이 좋습니다.

코드를 쓰기 보다는, 어떠한 방식으로, 예를 들어 '음, 반복문을 여기에 놓고, 어떠한 조건에서 어떻게 출력을 해야되니까 여기에 `if` 를 넣어야 겟네' 이런 식으로 구상을 해보세요.

이 과정이 완료되었다면, 종이에 써 놓은 것을 보고 그대로 코드로 옮기기만 하면 됩니다. 물론, 문법이 틀릴 수 있습니다. 틀려서 오류가 발생하였을 경우에는 아래 질문을 봐주시기 바랍니다.

#### 오류가 발생하였습니다. 도와주세요!

초보자의 경우 저지르는 오류들의 대부분은 아마 C 언어 문법을 틀린 것입니다. 대개 문장 끝에 세미콜론 (;) 을 붙이지 않앗더라던지, 아직 C 언어의 사용이 미숙하여 변수 및 함수 정의, `for, if` 등을 제대로 사용하지 못하는 것일 뿐입니다. 그 외로, 0 으로 나눠서 오류가 발생했다던지, 배열의 끝을 제대로 체크하지 않아서 오류가 발생했다던지 등의 이유들이 있습니다.

오류가 발생하였을 때는 당황하지 말고 일단 오류 내용을 그대로 긁어서 `Google` 이나 `Naver` 에 검색해보는 것이 좋습니다. 초보자들이 저지르는 대다수의 오류들은 이미 이전의 수 많은 초보자들이 질문을 올려놓았기 때문이지요. 그 외 컴파일은 깔끔하게 됬는데 프로그램만 실행하면 이상하게 되는 경우에는 [디버깅을 통해 한 스텝 한 스텝 확인](http://itguru.tistory.com/31)하면 됩니다.

#### 컴파일러를 사용할 수 없는 환경입니다. 공부를 어떻게 해야 되나요?

인터넷만 할 수 있다면 온라인 상에서 컴파일 할 수 있습니다. 예를 들어,

https://ideone.com/

에선 C 를 포함한 다양한 언어로 코딩이 가능하며, 심지어 입력 값도 설정이 가능합니다 (stdin 을 눌러서 거기에 원하는 입력값을 써 넣으시면 됩니다)

#### 강좌를 끝냈습니다. 이제 뭘 해야 되나요?

여러분 마음 이겠지만, 저라면 저 만의 독자적인 C 프로젝트 하나 정도는 만들고 싶을 것입니다. 예를 들어, 콘솔용 엑셀 이라 던지 (실제로 사용자가 입력한 수식에 따라 계산도 수행되고..) 아니면 간단한 게임을 만들 수 도 있습니다. 이렇게 C 언어와 친숙해지고 나면 다른 컴퓨터 언어를 배우는 것이 좋아보입니다.

C 언어와 좀 다른 유형의 언어를 배우면서도 C 언어와 좀 다른 유형의 언어를 배우면서도,웹 쪽에서 놀고 싶다면 요즘 대박대박 HOT 한 언어인 자바스크립트라던지, 아니면 파이썬 , 하스켈과같은 언어들도 굉장히 좋아보입니다.

아니면, C 스타일이 괜찮고, 객체지향 프로그래밍에 관심이 있다 하는 분들은 C++ 이나 Java, C# 등을 배우는 것도 좋습니다. 여기 까지 오신 분들이라면 원하는 것은 다 하실 수 있으리라 생각합니다!