C, Hello World


Hello World 코드


#include <stdio.h>

int main(void)
{
	printf("Hello World! \n");
	return 0;
}

이전 포스트에서 썻던 우리의 첫 c 코드입니다.

이 짧은 코드에서 알아야 할 점은 크게 3가지 입니다.

  1. #include 전처리기
  2. Scope와 구문
  3. 함수




#include 전처리기


코드 제일 처음을 보면

#include <stdio.h>

가 있습니다. 여기서 #전처리기라고 합니다.

여기서 이란 컴파일 전을 의미합니다.

즉, 컴파일 전에 그 다음에 나오는 명령어를 실행하라는 것입니다.


여기서 그 명령어는 include 입니다.

include는 뒤에 오는 파일을 코드에 포함하라는 C언어의 예약어입니다.


여기서는 뒤에 오는 파일이 stdio.h 입니다.

stdio는 Standard Input/Output을 의미합니다.

즉, stdio.h는 표준입출력 헤더파일입니다.


다시 정리해서

#include <stdio.h>

의 의미를 다시 살펴보면

컴파일 하기 전에 stdio.h 라는 헤더파일을 소스코드의 일부로 포함하고 컴파일 하라

는 뜻입니다.


이 헤더파일을 포함해야하는 이유는 밑에있는 printf() 함수 때문입니다.

이 printf() 함수는 stdio.h이라는 헤더파일에 선언되어 있고,

c는 헤더파일에 정의된대로 printf()를 실행합니다.

헤더파일을 포함하지 않으면 c는 printf()가 무슨 소린지 모를것이고,

에러를 뿜어냅니다.

not_include_stdio_error


Visual Studio를 기준으로 헤더파일은

아래 이미지와 같은 경로에 위치합니다.

path_header_vs

각종 헤더파일이 모여있는데요,

저같은 경우에는 stdio.h 파일은 여기 없고, 다른 곳에 있었습니다.

path_header_vs_2017_stdio

Visual Studio 버전에 따라서, 혹은 윈도우 버전에 따라서

헤더파일의 위치도 다른 곳에 위치하는 것 같습니다.

참고로 저는 Windows 10에 Visual Studio 2017입니다.


MacOS에서 Xcode를 사용하는 경우,

아래의 이미지와 같은 경로에서 stdio.h 파일을 찾을 수 있습니다.

macOS_xcode_stdio_path


이처럼 자신이 사용하고자 하는 함수가 있으면,

그 함수가 선언되어 있는 헤더파일을 먼저 전처리 해야합니다.

물론 자신만의 헤더파일을 만들어서 사용할 수도 있습니다.

그건 나중에 다루도록 하겠습니다.




Scope와 구문


Scope라는 것은 {}입니다.

그리고 이 사이에 존재하는 코드를 구문이라 합니다.

위의 코드에는 2개의 구문이 있고, 각 구문은 ;(세미콜론)으로 끝납니다.

첫번째 구문은 printf() 함수로 소괄호 안의 문자열을 출력합니다.

두번째 구문은 main() 함수의 리턴 구문입니다.

이에 대해서는 함수 부분에서 더 설명하겠습니다.




함수


위 코드에는 2개의 함수가 있습니다.

main() 함수와 printf() 함수.

보통 수학에서 말하는 함수는 다음과 같습니다.

y = f(x)

함수 f에 매개변수 x를 넣으면 결과값이 y가 나옵니다.

이를 main() 함수에 빗대어 보겠습니다.

함수 main에 매개변수 void를 넣으면 결과값(return)이 0이 나옵니다.

이때 main() 앞에 int가 의미하는 바는

결과값이 int(정수 자료형)이어야 함을 명시하는 것입니다.

그리고 c에서 void라 함은 매개변수가 없다는 뜻입니다.

실제로 void의 뜻은 ‘공허’입니다.

그리고 모든 함수는 return 구문과 함께 종료됩니다.


printf() 함수에 빗대어 보겠습니다.

함수 printf에 매개변수 문자열(“Hello World”)를 넣으면

결과값인 문자열 “Hello World”이 반환되고, 화면에 출력됩니다.


main()함수와 printf() 함수의 차이점이라면,

main()은 프로그래머가 직접 만드는 함수이고,

printf()는 c에서 이미 만들어져 있는 함수라는 것입니다.


그리고 위 코드를 설명할 때 다음과 같이 표현합니다.

main()함수에서 printf()함수를 호출한다.

즉, main()은 호출자(caller),

printf()는 피호출자(callee)가 됩니다.


C언어에서는

프로그램 시작 == main() 함수의 시작
프로그램 종료 == main() 함수의 종료(return 구문)

입니다.

사실 위의 코드에서는 “Hello World”의 출력이 중요하지,

main()함수의 반환값이 무엇인지는 중요하지 않습니다.

즉, return 값이 0이 아닌 다른 숫자여도 별 상관없습니다.

즉, main()함수는 결과(return)값이 의미있다기보다는

연산과정 그 자체가 의미가 있는 경우입니다.

이처럼 함수는 return값이 목적일 수도 있고,

연산과정 그 자체가 목적일 수 있습니다.


물론 연산과정 그 자체가 목적일 경우,

return값이 무엇이냐는 프로그램이 돌아가는데는 별 상관이 없습니다.

하지만 보통

정상 종료일 때는 0을,

비정상 종료일 때는 1을,

많이들 반환합니다.