[C 시리즈 2편] Mac에서 C 개발 환경 준비하고 첫 컴파일 해보기

English version

1편에서 왜 C를 공부하는지와 전체 로드맵을 먼저 잡았습니다. 이제는 생각을 바로 실행으로 옮겨, Mac에서 C 코드를 직접 컴파일하고 실행할 수 있는 상태를 만드는 것이 목표입니다. C를 공부하려고 마음먹었으면 가장 먼저 해야 할 일은 "내 컴퓨터에서 소스 코드가 실행 파일로 바뀌는 흐름"을 한 번 직접 경험하는 것입니다.

이번 글에서 새로 나오는 용어

  1. Xcode Command Line Tools: Mac에서 clang, git, make 같은 개발용 명령어를 사용할 수 있게 해 주는 도구 모음
  2. 컴파일러: 사람이 쓴 소스 코드를 컴퓨터가 이해할 수 있는 형태로 바꿔 주는 프로그램
  3. 목적 파일 (Object File): 소스 코드를 컴파일한 중간 결과물로, 아직 바로 실행되지는 않는 파일
  4. 링크 (Link): 목적 파일과 필요한 라이브러리를 묶어 최종 실행 파일을 만드는 과정

핵심 개념

학습 메모

  • 소요 시간: 30~40분
  • 준비물: Mac과 터미널 기본 사용 경험
  • 학습 목표: clang으로 C 파일을 컴파일하고 실행하기

Mac에서는 보통 Xcode 전체를 설치하지 않아도 Xcode Command Line Tools만 있으면 C를 시작할 수 있습니다. 이 도구 모음 안에 clang이 들어 있고, 우리는 이번 글에서 이 clang을 기준으로 C 프로그램을 컴파일합니다.

참고로 Mac에서 보이는 버전 문자열은 보통 Apple clang version ... 형태입니다. 같은 clang이라도 운영체제에 따라 표시 방식이 조금 다를 수 있으니, 처음에는 숫자를 외우기보다 "내 Mac에서 clang 명령이 동작하는가"만 확인해도 충분합니다.

여기서 한 가지를 먼저 분명히 하고 가겠습니다.

  • 소스 코드: 사람이 읽고 수정하는 .c 파일
  • 목적 파일: 컴파일 중간 단계에서 만들어지는 .o 파일
  • 실행 파일: 최종적으로 ./hello처럼 실행하는 결과물

즉, 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는 터미널에서 직접 컴파일하고 다시 실행하는 흐름이 중요하니, 이번 글의 코드를 파일로 만들고 빌드-실행 사이클을 다시 따라가 보세요.

Live Practice

C Practice Sandbox

CodeSandbox

Run the starter project in CodeSandbox, compare it with the lesson code, and keep experimenting.

Universal starterCterminal
  1. starter를 fork한 뒤 hello.c 같은 실습 파일을 만든다
  2. 본문 코드를 붙여 넣고 clang 또는 gcc가 있으면 직접 컴파일한다
  3. 코드를 고친 뒤 다시 빌드하고 실행 결과를 비교한다

C는 브라우저 미리보기보다 터미널 빌드 흐름이 핵심입니다. Universal starter의 컴파일러 구성이 환경에 따라 다를 수 있으니, 먼저 clang이나 gcc 사용 가능 여부부터 확인하세요.

실습

  • 따라 하기: hello.c를 만들고 clang hello.c -o hello, ./hello 순서로 실행합니다.
  • 확장하기: 출력 문장을 바꾸고 숫자 변수를 하나 추가한 뒤, 다시 컴파일했을 때만 결과가 바뀌는지 확인합니다.
  • 디버깅: 일부러 helloo.c처럼 파일 이름을 틀리게 입력해 보고, 오류 메시지가 무엇을 뜻하는지 해석해 봅니다.
  • 완료 기준: 소스 파일, 목적 파일, 실행 파일의 차이를 한 문장씩 설명하고, 컴파일 명령을 스스로 다시 입력해 실행할 수 있으면 됩니다.

마무리

이번 글에서 중요한 것은 "C 문법을 많이 아는가"가 아니라, "C 프로그램이 내 Mac에서 어떤 단계를 거쳐 실행되는가"를 직접 경험했는가입니다. 다음 글에서는 변수와 기본 자료형을 통해, C가 값을 어떤 크기로 저장하고 다루는지 본격적으로 살펴보겠습니다.

💬 댓글

이 글에 대한 의견을 남겨주세요