1편에서 왜 C를 공부하는지와 전체 로드맵을 먼저 잡았습니다. 이제는 생각을 바로 실행으로 옮겨, Mac에서 C 코드를 직접 컴파일하고 실행할 수 있는 상태를 만드는 것이 목표입니다. C를 공부하려고 마음먹었으면 가장 먼저 해야 할 일은 "내 컴퓨터에서 소스 코드가 실행 파일로 바뀌는 흐름"을 한 번 직접 경험하는 것입니다.
이번 글에서 새로 나오는 용어
- Xcode Command Line Tools: Mac에서
clang,git,make같은 개발용 명령어를 사용할 수 있게 해 주는 도구 모음 - 컴파일러: 사람이 쓴 소스 코드를 컴퓨터가 이해할 수 있는 형태로 바꿔 주는 프로그램
- 목적 파일 (Object File): 소스 코드를 컴파일한 중간 결과물로, 아직 바로 실행되지는 않는 파일
- 링크 (Link): 목적 파일과 필요한 라이브러리를 묶어 최종 실행 파일을 만드는 과정
핵심 개념
학습 메모
- 소요 시간: 30~40분
- 준비물: Mac과 터미널 기본 사용 경험
- 학습 목표:
clang으로 C 파일을 컴파일하고 실행하기
Mac에서는 보통 Xcode 전체를 설치하지 않아도 Xcode Command Line Tools만 있으면 C를 시작할 수 있습니다. 이 도구 모음 안에 clang이 들어 있고, 우리는 이번 글에서 이 clang을 기준으로 C 프로그램을 컴파일합니다.
참고로 Mac에서 보이는 버전 문자열은 보통 Apple clang version ... 형태입니다. 같은 clang이라도 운영체제에 따라 표시 방식이 조금 다를 수 있으니, 처음에는 숫자를 외우기보다 "내 Mac에서 clang 명령이 동작하는가"만 확인해도 충분합니다.
여기서 한 가지를 먼저 분명히 하고 가겠습니다.
즉, C는 파일을 저장한다고 바로 실행되는 언어가 아니라, "소스 코드 -> 컴파일 -> 링크 -> 실행" 흐름을 거칩니다.
코드로 따라하기
개발 도구 설치 확인하기
먼저 Mac에 개발 도구가 있는지 확인합니다.
clang --version
버전 정보가 보이면 이미 준비된 상태입니다. 만약 xcode-select: note: no developer tools were found 같은 메시지가 나온다면 아래 명령으로 설치를 시작합니다.
xcode-select --install
설치가 끝난 뒤에는 아래 명령으로 개발 도구 경로가 잡혀 있는지도 확인할 수 있습니다.
xcode-select -p
보통 /Applications/Xcode.app/Contents/Developer 또는 /Library/Developer/CommandLineTools 같은 경로가 출력됩니다.
첫 번째 C 파일 만들기
작업용 폴더를 하나 만들고, 그 안에 hello.c 파일을 만듭니다.
#include <stdio.h>
int main(void) {
printf("Hello, C!\n");
return 0;
}
이 코드는 화면에 Hello, C!를 출력하고 정상 종료합니다. 아직은 모든 문법을 이해하려 하기보다, "C 코드는 이렇게 파일에 적고 컴파일해서 실행한다"는 흐름을 먼저 익히는 것이 더 중요합니다.
컴파일하고 실행하기
이제 터미널에서 아래 명령을 실행합니다.
clang hello.c -o hello
./hello
첫 번째 줄은 hello.c를 읽어서 hello라는 실행 파일을 만드는 명령입니다. 이 한 줄 안에는 컴파일과 링크가 함께 들어 있습니다. 두 번째 줄은 그 실행 파일을 현재 폴더에서 직접 실행하는 명령입니다.
정상적으로 실행되면 아래처럼 보입니다.
Hello, C!
여기서 중요한 점은, hello.c를 실행한 것이 아니라 컴파일 결과로 만들어진 hello를 실행했다는 것입니다.
코드 안의 \n은 줄을 한 번 바꾸라는 뜻입니다. 그래서 출력 뒤에 커서가 다음 줄로 내려갑니다.
기본 흐름 먼저, 깊이 보기는 나중에
처음 공부할 때는 아래 두 줄만 안정적으로 할 수 있으면 충분합니다.
clang hello.c -o hello
./hello
여기까지가 "기본 실행 흐름"입니다. 아래 내용은 왜 이런 명령이 가능한지 더 깊이 이해하고 싶을 때 보는 확장 설명입니다.
컴파일 과정을 한 단계씩 보기
1편에서 예고했던 것처럼, C는 한 번에 마법처럼 실행되는 것이 아니라 몇 단계를 거칩니다. 지금은 이름만 가볍게 익히고, 각 단계가 실제로 파일을 어떻게 바꾸는지만 확인해 봅시다.
1) 전처리 결과 보기
clang -E hello.c
-E는 전처리만 보겠다는 뜻입니다. 이 명령은 #include <stdio.h> 같은 지시문을 펼친 결과를 보여 줍니다. 출력이 아주 길게 보이는데, 그만큼 표준 라이브러리 선언이 많이 끼어든다는 뜻입니다.
2) 목적 파일 만들기
clang -c hello.c -o hello.o
-c는 링크 없이 목적 파일까지만 만들겠다는 뜻입니다. 이제 hello.o라는 목적 파일이 생깁니다. 이 파일은 기계어에 가까운 중간 산출물이지만, 아직 다른 코드와 연결되지 않았으므로 바로 프로그램처럼 실행하지 않습니다.
3) 실행 파일 만들기
clang hello.o -o hello
이 단계에서 링크가 일어나고, 최종 실행 파일이 만들어집니다. printf처럼 표준 라이브러리에 있는 기능도 이 과정에서 함께 연결됩니다. 처음에는 clang hello.c -o hello 한 줄만 써도 충분하지만, 나중에 여러 파일로 프로젝트가 커지면 이 분리가 더 중요해집니다.
자주 만나는 첫 오류
처음 시작할 때는 오류가 나와도 이상한 것이 아닙니다. 아래 세 가지를 가장 자주 보게 됩니다.
clang: error: no such file or directory: 'hello.c': 현재 폴더에hello.c가 없거나 파일 이름이 다릅니다.zsh: command not found: clang: Xcode Command Line Tools가 아직 설치되지 않았을 수 있습니다.permission denied: 실행 파일이 아니거나 경로를 잘못 입력했을 수 있습니다.
처음 단계에서는 특히 "지금 내가 소스 파일에 있는가, 실행 파일을 실행하는가"를 구분하는 것이 중요합니다. 링크 오류는 여러 파일이나 외부 함수를 다루기 시작할 때 더 자주 만나므로, 지금은 이름만 익혀 두어도 충분합니다.
실전 예시: 숫자 출력 프로그램으로 바꾸기
hello.c를 아래처럼 바꿔 보세요.
#include <stdio.h>
int main(void) {
int year = 2026;
printf("C study starts in %d.\n", year);
return 0;
}
다시 컴파일하고 실행하면, "수정 -> 컴파일 -> 실행" 흐름을 한 번 더 반복해 볼 수 있습니다. C에서는 파일 내용을 고친 뒤 거의 항상 다시 컴파일해야 새 결과가 반영됩니다.
왜 중요한가
Python이나 JavaScript를 먼저 배웠다면, 파일을 저장한 뒤 바로 실행하는 감각에 익숙할 수 있습니다. 하지만 C는 컴파일과 링크를 분명히 거치기 때문에, 코드가 실제 프로그램이 되는 과정을 더 선명하게 보여 줍니다.
이번 단계에서는 아래 네 가지가 되면 성공입니다.
clang --version으로 개발 도구 준비 상태를 확인하기hello.c파일을 만들고clang hello.c -o hello로 컴파일하기./hello로 실행 파일을 직접 실행하기clang -c를 통해 목적 파일이라는 중간 단계가 있다는 사실 확인하기
이 흐름을 한 번 손으로 해 보면, 이후에 헤더 파일, 여러 소스 파일, 빌드 자동화를 배울 때도 훨씬 덜 막히게 됩니다.
CodeSandbox로 이어서 실습하기
아래 샌드박스는 CodeSandbox의 Universal starter입니다. C는 터미널에서 직접 컴파일하고 다시 실행하는 흐름이 중요하니, 이번 글의 코드를 파일로 만들고 빌드-실행 사이클을 다시 따라가 보세요.
💬 댓글
이 글에 대한 의견을 남겨주세요