[C언어] 01_첫 프로젝트
모든 프로그래밍 언어 학습은 화면에 "Hello World"를 띄우는 것에서 시작한다. 단순해 보이는 이 한 줄짜리 프로그램에도 사실 C언어의 기본 골격이 모두 담겨 있다.
이 글에서는 첫 프로그램을 작성해보고, 그 안에 들어 있는 구성요소(헤더, main 함수, 전처리기, 주석)가 각각 무슨 역할을 하는지 하나씩 짚어본다.
1. 첫 프로그램: Hello World
#include <stdio.h>
int main(void)
{
printf("Hello World! \n");
printf("Kim ChulSoo \n");
return 0;
}
실행하면 다음과 같이 출력된다.
Hello World!
Kim ChulSoo
printf 끝의 \n은 줄바꿈 문자다. 화면에서 커서를 다음 줄로 옮겨, 두 문장이 각각 다른 줄에 출력되게 한다. \n이 없으면 두 문장이 한 줄에 붙어 나온다.
2. C 프로그램의 구성요소
위 짧은 코드를 한 줄씩 보면 C 프로그램의 기본 틀이 보인다.
#include <stdio.h>: 표준 입출력 기능을 가져오는 전처리기 지시문(3절에서 설명).int main(void): 프로그램이 시작되는 진입점. C 프로그램은 반드시main함수에서 실행을 시작한다.{ ... }: 함수의 본문을 감싸는 중괄호.return 0;: 프로그램이 정상 종료됐음을 운영체제에 알리는 반환값.
주석 (Comment)
주석은 프로그램 실행과 무관하게, 코드를 읽는 사람을 위해 다는 설명이다. 컴파일러는 주석을 무시한다.
/* 여러 줄에 걸쳐 쓸 수 있는 주석
파일 이름, 작성자, 설명 등을 적어둔다 */
// 한 줄 주석
/* */는 여러 줄, //는 한 줄짜리 주석이다. 들여쓰기와 함께, 주석은 코드의 가독성을 높이는 기본 도구다.
3. 전처리기 (Preprocessor)
#으로 시작하는 지시문은 컴파일이 시작되기 전에 처리된다. 그래서 전처리기라 부른다.

#include <stdio.h>
이 한 줄은 "컴파일 전에 stdio.h라는 헤더 파일의 내용을 이 자리에 그대로 가져오라"는 뜻이다. stdio.h 안에는 printf(), scanf() 같은 표준 입출력 함수들의 원형(선언)이 들어 있다.
즉 우리가 printf를 바로 쓸 수 있는 건, include로 그 함수의 선언을 미리 끌어왔기 때문이다. 이 선언 없이 printf를 쓰면 컴파일러가 그 함수를 알지 못해 경고나 오류를 낸다.
4. 변수와 입출력 맛보기
데이터를 잠시 담아두는 메모리 공간이 변수이고, 변수는 쓰기 전에 반드시 자료형과 함께 선언해야 한다. 출력과 입력은 형식 지정자로 자료형을 맞춘다.
- 출력:
printf()+ 형식 지정자(%d정수,%lf실수,%s문자열 등) - 입력:
scanf()+ 형식 지정자 + 변수의 주소(&)
int x = 20, y = 10;
printf("두 수의 합: %d\n", x + y); // 30
int n;
scanf("%d", &n); // 입력은 변수 앞에 & 를 붙인다
입력에서 &를 붙이는 이유는, scanf가 "값을 어디에 저장할지" 그 위치(주소)를 알아야 하기 때문이다. 이 주소 개념은 나중에 포인터에서 본격적으로 다룬다.
비주얼 스튜디오는 보안을 이유로 scanf 사용 시 오류를 낸다. 소스 코드 맨 첫 줄에 아래 한 줄을 추가하면 해결된다.
#define _CRT_SECURE_NO_WARNINGS5. 첫 프로그램 실행 흐름
Hello World와 이름을 출력한다. 입력은 없고, 출력 두 번 뒤 정상 종료한다.
이 예제에서 꼭 봐야 할 부분은 main이 시작점이고, printf가 출력 담당이며, return 0이 정상 종료 신호라는 점이다.
#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
printf("Kim ChulSoo\n");
return 0;
}
유제: 자기소개 출력하기
아래처럼 이름, 학과, 관심 분야를 세 줄로 출력하는 프로그램으로 바꿔보면 printf와 \n을 바로 연습할 수 있다.
printf("이름: 홍길동\n");
printf("학과: 컴퓨터공학\n");
printf("관심 분야: C 프로그래밍\n");
한 걸음 더
main함수가int를 반환하고 끝에서return 0;을 하는 데는 이유가 있다. 이 반환값은 프로그램의 종료 상태를 운영체제에 전달하는 신호로, 관례상 0은 "정상 종료", 0이 아닌 값은 "오류로 종료"를 뜻한다. 셸 스크립트나 다른 프로그램이 이 값을 보고 실행 성공 여부를 판단한다.#include에서<stdio.h>처럼 꺾쇠를 쓰면 컴파일러가 표준 라이브러리 경로에서,"myheader.h"처럼 큰따옴표를 쓰면 현재 프로젝트 폴더부터 찾는다. 표준 헤더는 꺾쇠, 내가 만든 헤더는 큰따옴표가 관례다.- 전처리기는 단순히 텍스트를 갈아끼우는 단계라,
#define으로 상수나 매크로를 정의하면 컴파일 전에 코드 곳곳이 그 값으로 치환된다._CRT_SECURE_NO_WARNINGS도 사실 이#define을 이용해 "이 경고를 끄라"는 표시를 미리 심어두는 것이다.