C2009.04.17 19:21


이번 강좌에서는 아래와 같은 내용을 배우게 됩니다.
  • Hello, World! 빠삭하게 분석
  • 주석(Comment)의 사용

신나는 씹어먹는 C 언어!


  안녕하세요 여러분. 저번 강의에서의 희열을 아직도 느끼시나요? 방금 자신의 손으로 최초의 프로그램 - Hello, World! 를 만들었다는 사실을 말이죠. 하지만 자신이 프로그램을 만들었다는 사실을 친구들에게 자랑하기 전에, 그 프로그램이 어떻게 동작하는지 살펴보도록 합시다.

Hello, World 프로그램 분석하기

  일단, 여러분이
지난번에 쓰셨던 코드는 다음과 같습니다. 사실, 지난번에는 이 코드가 뭔 내용인가 하면서 쓰셨겠죠. 다만 한 가지 눈치 챘을 법한 부분은 바로 큰 따옴표로 닫혀 있는 부분의 "Hello, World!" 가 프로그램에 출력된다는 점이죠. 만약 여러분들께서 이를 "I LOVE U" 라 던지 여러가지 문장으로 바꿔보아서 실행 해 보았었으면 매우 훌륭한 일을 하신 겁니다. 호기심은 좋은 덕목 중의 하나이죠.

#include <stdio.h>
int main()
{

        printf("Hello, World! \n");
        return 0;
}

  일단 위 프로그램의 첫 줄 부터 봅시다.


#include <stdio.h>


  영어를 잘 하시는 분은 include 의 뜻이 '포함하다' 라는 것임을 알 수 있습니다. 그렇다면 위 프로그램은 무엇을 포함하고자 하는 것일까요? 바로 옆의 'stdio.h' 라는 파일을 포함하고자 하는 것입니다. 그렇다면 우리는 왜, stdio.h 라는 파일을 이 프로그램에 포함 시켰을 까요? 그 사실은 아래에 계속됩니다.

  그 다음 부분을 살펴 봅시다.

int main()

  이번에는 조금 생소한 단어군요. main 은 그렇다 쳐도, int 는 또 무엇입니까? 언뜻 보기에 무엇의 약자 인 것 같은데 말이죠. 사실 이는 '정수' 를 뜻하는 integer 의 약자입니다. 또한 그 옆의 main 은 함수를 말하는 것이죠. 사실 이 문장의 뜻은 '정수 형을 반환하는 메인 함수' 라는 뜻이며, 대부분의 C 프로그램은 위 함수로 부터 시작됩니다. 자세한 사실은 나중에 알아봅시다.

{

  그 다음 문장은 참으로 간단하군요. 중괄호 입니다. 여기서 중괄호는 main 함수의 시작을 알리게 되죠. 즉, 중괄호로 묶인 부분은 '여기는 main 함수 꺼야' 라는 것을 나타냅니다. 이 때, 중괄호로 열었다면 반드시 } 로 닫아주어야 합니다.

printf("Hello, World! \n");

   이제, 위 프로그램에서 가장 핵심이라 볼 수 있는 부분인 'printf' 를 살펴 봅시다. printf 는 화면에 괄호안의 내용을 출력할 수 있게 해주는 함수 입니다. 위의 경우, 괄호 안에 있는 Hello, World! 가 화면에 출력되었지요.

  그런데, 도대체 위 함수가 어떻게 해서 화면에 글자를 출력하는 것일까요? 사실, 화면에 글자를 출력하는 것은 쉬운 일 일 것 같지만, 매우 복잡한 과정을 거치는 것입니다. 왜냐하면, 일단 운영체제에 자신이 화면에 글자를 뿌려야 한다는 메시지를 보내야 하고, 또 운영체제는 하드웨어 (모니터) 에 이를 뿌린
다는(출력한다는) 것을 이야기 해 주어야 하기 때문이죠.

  하지만 우리가 위 짧은 문장을 화면에 표현하기 위해 위 모든 내용을 작성해야 한다는 것은 상당히 불합리해 보입니다. 따라서 우리는 위 모든 내용을 포함하고 있는 파일을 필요로 하는데, 그 것이 바로 앞서 이야기한 stdio.h 입니다. stdio 는 STandard Input Output header 의 약자로, '표준 입출력 헤더' 입니다. 이 파일에는 입출력, 즉 화면에 출력하고, 키보드로 부터 입력을 받아들이는 것에 대한 내용을 가지고 있습니다. 물론, 이 파일 하나에 모든 내용이 다 구현 되어 있는 것은 아닙니다. 자세한 내용은 나중에 배우게 됩니다.

  그런데, 한 가지 이상한 점이 있습니다. 큰 따옴표 안의 내용이 모두 출력되는데, 왜 마지막의 \n 은 출력되지 않은 것일까요? 그렇다면 한 번 여러분들 께서 \n 을 지워 보고 다시 프로그램을 실행해 보세요. 아마 다음과 같이 나올 것 입니다.


    지난번 하고 차이점이 보이세요? 분명히 지난 번에는 'Press anykey to continue' 가 한 줄 개행되어 나타났는데 이번에는 연이어 나타났습니다. (윈도우 한글판 사용자의 경우 '아무키나 누르세요' 가 나타날 것입니다)

  아하, 알겠습니다. 바로 \n 은 키보드 상의 엔터, 즉 개행 문자 였던 것입니다. (참고로 \ 를 Escape character 라고 합니다)
 
참고적으로 알아야 할 사실은 우리나라 키보드의 경우 \ 로 나타나지만 외국 대부분의 키보드에는 \ 대신에 역슬래시(\) 를 사용합니다. 따라서, 보통 C 언어 서적을 보면 \n 이라 나타난 것이 있는데 이는 \n 과 똑같은 것입니다.

  마지막으로 하고 싶은 말은 모든 문장은 끝나는 부분에 세미콜론(;)을 찍어 주어야 된다는 것입니다. 물론,함수의 선언 부분 (즉, int main() ) 뒤에나 헤더파일 선언 부분 (#include <stdio.h>) 뒤에는 ; 을 꼭 붙일 필요는 없으나 위와 같이 printf(.....) 나, 아래 줄의 return 0 와 같은 문장들에게는 꼭 끝에 세미콜론을 붙일 필요가 있습니다. 만약 붙이지 않는다면 이전 강의에서 보았던 오류들이 나타나게 되죠.

return 0;

  영어로 읽어 보면 대충 뜻을 짐작하셨겠지만, 0 을 반환(return)한다는 뜻 입니다. 0 을 왜 반환할까요? 그리고 그 것을 반환한다면 '누구' 한테 반환하는 것인가요? 쉽게 말해 운영체제에게로 반환합니다. (정확히 말하면 이 프로그램을 호출한 프로그램 - 예를 들면 프로그램 관리자(O/S) 등 ) 그런데 왜 하필이면 0 일까요? 1 이면 안되고 왜 2 이면 안되죠.

  그렇다면 한 번 1 이나 다른 원하는 숫자를 반환하도록 해보세요. 결과는 똑같습니다. 그런데 왜 굳이 0 을 반환하는 것일까요?

  사실은 0 을 반환한다는 것은 컴퓨터에게 '프로그램이 무사히 종료되었음' 을 알리는 것이죠. 반면에 1 을 반환한다면 컴퓨터에게 '프로그램이 무사히 종료되지 않았어요. 즉, 오류가 발생했어요.' 를 알리는 것입니다. (이는 국제 표준화기구인 ISO에서 결정된 바 입니다.)  즉, 프로그래머들끼리 만든 일종의 약속인 셈입니다. 하지만 지금 이 정도 수준의 프로그램에서 꼭 리턴값을 지키지 않는 다고 해서 큰 문제는 없습니다.

}

  마지막으로 이렇게 꼭 중괄호로 닫아주어야지, 그렇지 않을 경우 파일의 끝이 없다는 오류가 발생하게 됩니다. 와우! 이쯤 되면 위 프로그램을 빠삭하게 분석해 보았다고 할 수 있습니다.

주석(Comment) 넣기

  마지막으로 모든 프로그래밍 언어에 기본으로 있는 기능이자, 그 만큼 중요한 기능인 주석 넣기에 대해 알아봅시다. 주석이라 하면, 코멘트, 즉 자신의 코드에 대해 설명을 해주는 것입니다. 아마 위의 대여섯 줄 짜리 코드에 뭐가 설명할 필요가 있겠어? 라고 생각할 수 있지만 실제로 '쓸만한' 프로그램을 만들게 되면 코드의 길이가 수천줄을 넘어가는 것은 예삿일입니다. 물론 그런 파일들이 여러개 모여서 프로그램을 만들게 되는 것이지요.

  그렇게 된다면 코멘트 없이는 이 코드가 도대체 무슨 역할을 하는지도 잘 모르고, 남이 쓴 코드가 어떤일을 하고, 어떻게 돌아가는지 이해가 잘 안되는 경우가 많습니다. 더욱 심각한 사실은 자신이 쓴 코드도 못알아 보는 경우가 있다는 것입니다. 이처럼, 이런 기분나쁜 일을 미연에 방지하기 위해 이 코드가 무슨 역할을 하고 어떻게 동작되는지 간단하게 나마 설명해 주는 것이 필요하겠죠. 그런 것을 바로 주석 이라 합니다.

  우리가 코드를 이해하기 위해 필요한 것이지, 컴퓨터에는 아무런 도움이 되지 않는 것이므로 컴파일러는 이 주석을 완전히 무시해 버립니다. 마치 우리만이 볼 수 있는 것 처럼 말이죠. 그렇기 때문에 주석에 무슨 짓을 해도 상관이 없습니다.

  기본적으로 C 언어 에서는 두 가지 형태의 주석을 지원합니다.

  마치 컴파일러가 철저히 무시한다는 것을 반영하기라도 한 것인지, 주석은 초록색으로 표시됩니다. 보통 한 줄에 쓸 수 있는 주석은 // 로 나타내고, 주석이 조금 길어저 여러 줄에 걸쳐 표시하려면 /* 와 */ 를 이용합니다. 한 번, 위 Hello, World! 프로그램에 자기 나름대로 주석을 넣어 설명을 해보세요.


강좌를 보다가 조금이라도 궁금한 것이나 이상한 점이 있다면 꼭 댓글을 남겨주시기 바랍니다. 그 외에도 강좌에 관련된 것이라면 어떠한 것도 질문해 주셔도 상관 없습니다. 생각해 볼 문제도 정 모르겠다면 댓글을 달아주세요.

현재 여러분이 보신 강좌는 <<씹어먹는 C 언어 - <2 - 1. C 언어 본격 맛보기>>>> 입니다. 이번 강좌의 모든 예제들의 코드를 보지 않고 짤 수준까지 강좌를 읽어 보시기 전까지 다음 강좌로 넘어가지 말아주세요




Posted by Psi

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. \n

    \n 이 개행문자 처리되므로 어떤방법을 써도 \n 을 출력해 낼순 없는건가요?

    2014.12.24 19:28 신고 [ ADDR : EDIT/ DEL : REPLY ]
  3. \n

    \n 이 개행문자 처리되므로 어떤방법을 써도 \n 을 출력해 낼순 없는건가요?

    2014.12.24 19:28 신고 [ ADDR : EDIT/ DEL : REPLY ]
  4. nate

    강좌 보다가 궁금해서 그러느데

    int main() 말고도 void main() 을 쓰는데
    이 두개 차이점이 있을까요

    return 0; 도 2010 버전에선 안적어도 프로그램이 잘돌아가는데 별상관업조? 뭐나중에 구조체나 함수에선 쓰긴하는데
    그냥 자기 맘인가요?

    2015.02.09 19:20 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 답변자

      int main(), void main() 의 차이는

      앞의 int, void 가 위 예제의

      return뒤에 들어갈 값을 미리 정해준다고 생각하시면 편할 것 같네요.

      void의 경우 단어 뜻대로 '공허'의 뜻입니다. 따라서 return 행이 삭제되어도 이상없이 빌드 되지만,

      int 의 경우 int변수가 정수를 뜻하므로
      return 뒤에 0,1,2... 등 정수가 들어가 줘야 정상 빌드 됩니다. 물론 return행은 필수입니다 ^^

      2017.05.11 14:57 신고 [ ADDR : EDIT/ DEL ]
  5. pjh

    주석을 어디 넣어요.?

    2015.04.16 14:46 신고 [ ADDR : EDIT/ DEL : REPLY ]
  6. 비밀댓글입니다

    2015.04.17 00:50 [ ADDR : EDIT/ DEL : REPLY ]
  7. 안녕하세요, 이 강의를 들으며 (중간고사 기간임에도 불구)C에 푹 빠져든 학생입니다. 출력 함수 뒤에 ("를 치고 영문을 입력하는데, 영문 대신 한글을 입력하니 이상한 단어로 깨지(?)며 나타나더라구요. 이것이 왜 그런지 알고 싶습니다.

    2015.04.28 19:44 신고 [ ADDR : EDIT/ DEL : REPLY ]
  8. cgcrew

    쉽게 이해가 잘 되네요, 대학교 때 이렇게 설명해주시는 분이 있으셨다면

    좋았을텐데요 ㅜㅡㅜ

    2015.07.16 15:10 신고 [ ADDR : EDIT/ DEL : REPLY ]
  9. 와, 오늘 처음 c언어라는걸 공부하기시작했는데요 글이 제 생각의 흐름대로 설멸해주네요
    읽다가 그러니까 이게 뭔데 왜하는데 라는 생각이 들면 딱 그 설명을 ㅋㅋㅋ
    프로그래밍하면 유명한 열혈책사서 보고있는데 이 글이 이해가 더 잘되요
    같이 공부하면 좋을거같네요
    좋은강의감사합니다

    2015.07.29 22:41 신고 [ ADDR : EDIT/ DEL : REPLY ]
  10. InfinityCSO

    c:\users\administratir\documents\visual studio 2010\projects\hello\Debug.exe 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다라고 계속 에러가 나네요.
    인터넷에 치면 프로젝트 속성에서 구성 속성, 매니페스트 도구 - 입력 및 출력 - 출력 매니페스트 파일을 아니요로 바꾸라 하는데 이번에 만든건 프로젝트 속성도 뜨지 않구요..
    무슨 패키지1이라는걸 설치하라는데 다른 방법은 없을까요..

    2015.08.03 21:02 신고 [ ADDR : EDIT/ DEL : REPLY ]
  11. aaa

    int main 설명해주시는 부분에 뜻인며 라고 되있는데 오타아닐까요?

    2015.12.01 14:12 신고 [ ADDR : EDIT/ DEL : REPLY ]
  12. 윤준용

    강좌 잘보고있습니다
    친절하신 설명 완전 초보인 제게 딱입니다
    고맙습니다^^

    2016.05.01 01:42 신고 [ ADDR : EDIT/ DEL : REPLY ]
  13. 강좌 잘 보고 있습니다.
    언리얼4를 공부하는데 C언어가 기초입니까?
    C#을 쓰는 유니티와 언리얼4의 C++의 차이는 무엇입니까?

    2016.05.26 10:32 신고 [ ADDR : EDIT/ DEL : REPLY ]
  14. jjjpata

    답변 감사합니다. 2011년에 나온 C++은 어떤 차이점이 있는거지요?
    C, C++은 2011년 이후에 다른 방식으로 배워야 한다고 들었는데,
    C ++를 배우기 위해서는 C가 필수적입니까?
    참고로 저는 언리얼 블루프린트를 잘 이해하기 위해 프로그래밍을 배우기 시작했습니다.

    2016.05.30 11:09 신고 [ ADDR : EDIT/ DEL : REPLY ]
  15. jjjpata

    int main() 와 int main(void)

    괄호안에 void를 넣는 것과 안 넣는 것은 왜 그런것입니까?

    2016.06.01 12:24 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • C에서는 매개변수로 아무것도 오지않는다는 의미로 void를 이렇게 int main(void)명시적으로 넣어줘야 합니다. int main()는 매개변수가 없다라는 의미가 아니라 몇 개가 오는지 정확히 알 수 없다라고 컴파일러가 해석합니다.

      C++에서는 매개변수가 없다는 의미로 둘 다 같습니다.

      2017.09.05 10:15 신고 [ ADDR : EDIT/ DEL ]
  16. ELLA

    너무 감사합니다. 두번째 강좌도 무사히 잘 맞췄습니다. 감사드려요. 학원에서 배우는 강좌같지가 않고 너무 좋습니다,

    2016.08.18 04:29 신고 [ ADDR : EDIT/ DEL : REPLY ]
  17. :D

    include 앞에 #은 왜 붙히는건가요?

    2017.03.21 09:55 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • #가 붙이있는걸들을 preprocessor(전처리기) 라고 합니다. C 전처리기로 검색해보세요.

      2017.09.05 10:17 신고 [ ADDR : EDIT/ DEL ]
  18. JIWOO6630

    쉽게 설명해주시는 것 같은데 너무 어렵네요 ㅎㅎ;; 그리고 앱이 너무 최신으로 되서 다운로드도 못했네요

    2017.08.28 22:26 신고 [ ADDR : EDIT/ DEL : REPLY ]
  19. 지나가다가

    저는 비전공자라 입사하면서 자바로 처음 프로그래밍 배워서 C언어는 문외한이었는데 너무 잘 설명되어있어서 많이 배워갑니다.. 이런 댓글 잘 안다는데 감사해서 하나 남기고 가요ㅜㅜ

    2017.10.02 15:47 신고 [ ADDR : EDIT/ DEL : REPLY ]
  20. heerang11

    좋은 강의 감사합니다! 완전 좋네요

    2017.12.04 11:39 신고 [ ADDR : EDIT/ DEL : REPLY ]
  21. 뭐가 잘못됐지

    hello world
    c:\Users\willi\source\repos\Project8\Debug\Project8.exe(13272 프로세스)이(가) 0 코드로 인해 종료되었습니다.
    이 창을 닫으려면 아무 키나 누르세요.

    똑같이 했는데 출력은 되는데 밑에 한줄이 떠요.. 뭐가 문제 일까요

    2018.09.06 00:10 신고 [ ADDR : EDIT/ DEL : REPLY ]