3.3 Hello, world! 출력하기

hello.c 소스 코드 편집 창에 다음 내용을 입력합니다.

hello.c

#include <stdio.h>

int main()
{
    printf("Hello, world!\n");

    return 0;
}
참고 | 입력할때 뜨는 팝업 창에 놀라지 마세요!

#include <까지 입력하면 다음과 같이 팝업 창이 나옵니다.

그림 3‑9 Visual Studio의 자동 완성 기능

팝업 창에는 현재 사용할 수 있는 헤더 파일 목록이 표시되는데 글자를 입력할 때마다 해당 글자에 해당하는 헤더파일이 선택됩니다. 그리고 방향 키를 사용해서 선택할 수도 있으며 헤더 파일을 선택한 뒤 엔터 키를 누르면 헤더 파일 이름이 소스 코드에 자동으로 입력됩니다. 또한, 헤더 파일뿐만 아니라 자료형, 변수, 함수, 구조체 필드 등 C 언어의 각종 문법을 입력할 때도 팝업 창이 표시됩니다.

이처럼 Visual Studio 같은 IDE는 자동 완성 기능이 있어서 코딩을 편하게 해줍니다.

이제 hello.c 파일을 컴파일해보겠습니다. 메뉴의 빌드(B) > 솔루션 빌드(B)를 클릭합니다(F7 키를 눌러도 됩니다. 단, F7 키는 Visual Studio의 개발 설정을 Visual C++로 설정해야 사용할 수 있습니다. 설정 방법은 'Unit 2 Visual Studio 설치하기'를 참조하세요).

그림 3‑10 hello.c 컴파일 완료
0310

메뉴의 디버그(D) > 디버그하지 않고 시작(H)을 클릭합니다(Ctrl+F5 키를 눌러도 됩니다).

그림 3‑11 hello.exe 실행

이제 hello.exe가 실행되면서 명령 프롬프트 창에 Hello, world!가 출력됩니다. 드디어 C 언어의 첫 번째 관문을 통과했습니다. 만약 명령 프롬프트 창이 실행되었다가 바로 닫힌다면 '3.1 새 프로젝트 만들기'로 돌아가서 프로젝트의 하위 시스템콘솔(SUBSYSTEM:CONSOLE)로 설정했는지 확인하세요.

그림 3‑12 hello.exe 실행 화면

여기서 아무 키나 누르면 명령 프롬프트 창이 종료됩니다.

이러한 방법으로 소스를 수정한 뒤 Visual Studio에서 실행 파일을 바로 실행해볼 수 있습니다. 특히 솔루션 빌드(F7)로 소스 파일을 컴파일 하지 않아도 디버그하지 않고 시작(Ctrl+F5)을 실행하면 자동으로 소스 파일을 컴파일해줍니다.

만약 이 프로젝트는 만료되었습니다(T).라고 나오면 이 대화 상자를 다시 표시 안함(D)에 체크한 뒤 예(Y) 버튼을 클릭하면 됩니다(이 창은 소스 코드가 수정된 상태에서 프로그램을 실행하려고 할 때 표시됩니다. 소스 코드가 수정되었으면 어차피 다시 컴파일해야 하므로 창을 표시하지 않고 바로 컴파일하도록 설정합니다).

그림 3‑13 프로젝트 만료 창
0313

컴파일이 끝났으니 hello.exe 파일이 생성되었습니다. 이제 hello.exe 파일의 위치를 찾아보겠습니다. 다음과 같이 hello 솔루션을 선택한 뒤 마우스 오른쪽 버튼을 클릭하면 팝업 메뉴가 나오는데 여기서 파일 탐색기에서 폴더 열기(X)를 클릭합니다.

그림 3‑14 Visual Studio에서 솔루션 폴더 열기

탐색기가 열리면 솔루션 폴더가 표시됩니다. 여기서 Debug 폴더 안으로 들어갑니다.

그림 3‑15 탐색기에서 솔루션 폴더 표시
0315

Debug 폴더를 보면 hello.exe가 보입니다. 탐색기에서 위쪽 주소 표시줄을 클릭하면 현재 폴더의 경로를 알 수 있습니다.

그림 3‑16 탐색기에서 hello.exe 파일 위치 표시
0316

이번에는 Visual Studio를 통하지 않고 명령 프롬프트에서 hello.exe를 직접 실행해보겠습니다.

  1. 윈도우 키+R을 누른 뒤 cmd를 입력하여 명령 프롬프트를 실행합니다.
  2. hello 솔루션 폴더 아래의 Debug 폴더로 이동합니다(cd c:\project\hello\Debug).
  3. hello.exe를 입력하여 실행파일을 실행합니다.
그림 3‑18 명령 프롬프트에서 hello.exe 실행

명령 프롬프트에 Hello, world!가 출력됩니다.

프로그램을 실행해보았으니 이제 소스 코드를 살펴보겠습니다.

#include <stdio.h>

int main()
{
    printf("Hello, world!\n");

    return 0;
}

C 언어를 모르는 상태에서도 얼핏 보면 printfHello, world!를 출력한다는 것을 알 수 있습니다.

네. 맞습니다. " " (큰따옴표)로 감싼 부분을 문자열이라고 하고, printf는 화면에 문자열을 출력하는 함수입니다.

그런데 함수가 무엇일까요? 소스를 자세히 보면 main, printf는 단어 뒤에 ( ) (괄호)가 붙어 있습니다. 이렇게 뒤에 괄호가 붙은 단어를 함수(function)라고 합니다.

다음과 같이 printf를 써주고, 괄호 안에 출력할 내용을 넣은 뒤 ; (세미콜론)을 붙이면 printf 함수가 실행됩니다. 다른 말로는 함수를 호출(call)한다고 말하기도 합니다.

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

그런데 Hello, world!끝에 붙은 \n은 실행을 해도 화면에 안나오네요? 네. 이건 제어 문자라고하는 특별한 문자입니다. 화면에 직접 표시 되지는 않지만 문자열을 다음 줄에서 출력되도록 만들며 키보드에서 엔터 키의 역할과 같습니다.

여기서 printf 함수를 사용하기 위해 한 줄이 더 필요한데 소스 코드의 첫째 줄을 보면 다음과 같이 #include가 있습니다.

#include <stdio.h>

#include는 헤더 파일을 포함하는 문법이며 printf 함수를 사용하려면 stdio.h 헤더 파일이 필요합니다. 앞으로 다양한 함수를 사용하면서 헤더 파일도 여러 가지를 사용하게 되는데 필요한 헤더 파일을 그때 그때 함께 설명하겠습니다.

소스 코드에서 또 눈에 띄는 부분이 main 함수입니다.

int main()
{
}

main함수는 C 언어로 프로그램을 만들었을 때 가장 처음에 실행되는 특별한 함수입니다. 우리는 main 함수를 채워 넣으면서 프로그래밍을 하게 됩니다(만약 소스에서 main 함수가 없으면 컴파일이 되지 않습니다).

즉, C 언어 프로그램은 항상 main 함수가 있어야 하며 main 함수부터 실행된다는 점을 기억하세요.

이제 main 함수의 마지막 부분을 보면 다음과 같이 return 0;을 사용하였습니다.

return 0;  

함수는 반환값을 함수 바깥으로 전달할 수 있는데 main 함수도 함수이므로 반환값을 설정할 수 있습니다. 이 부분은 'Unit 46 함수에서 반환값 사용하기'에서 자세히 설명하겠습니다.

참고 | 프로그래밍이란?

우리가 Visual Studio에 소스 코드를 입력하여 프로그램을 만드는 작업을 프로그래밍 또는 코딩이라 하며 다음과 같이 소스 코드 편집 → 컴파일 → 실행 과정을 반복하게 됩니다.

그림 3‑19 우리가 하는 일

다음과 같이 .c 소스 파일은 .obj 파일을 거쳐 .exe 파일로 생성됩니다.

그림 3‑20 파일의 변화