C 언어 학습 노트 1: Hello, World!까지의 시행착오
마침내 화면에 이 한 줄이 나왔다.
Hello, World!
돌아보면 코드는 몇 줄 되지도 않는다. 그런데 파일을 만드는 순간부터 이 문장을 보기까지는 생각보다 여러 번 헤맸다. 다음에 같은 실수를 했을 때 어디부터 확인하면 좋을지, 아직 기억날 때 적어 둔다.
1. hello.c 파일부터 만들기
먼저 텍스트 파일을 하나 만들고 이름을 hello.c로 바꿨다. 파일 이름만 바꾸면 준비가 끝난 줄 알았다.
컴파일하려고 보니 실제 이름은 이랬다.
hello.c.txt
Windows가 마지막 확장자인 .txt를 숨기고 있어서 화면에 보이는 이름과 실제 이름이 달랐다.
파일 확장자 표시를 켠 다음에야 제대로 고쳤다. 코드를 읽기도 전에, 파일 이름부터 확인해야 한다는 걸 배웠다.
2. 비슷하게 생긴 문장 부호에 속았다
예제를 옮겨 적는 과정에서 이런 코드를 만들었다. 아래는 잘못된 예시다.
printf(“Hello, World!/n”);
첫 컴파일부터 오류가 여러 개 나왔다. 괄호도 있고, 따옴표도 있고, 끝에 세미콜론까지 있는데 무엇이 문제인지 바로 보이지 않았다.
예제와 나란히 놓고 보니 기호 모양이 달랐다.
( ) “ ” ;
( ) " " ;
윗줄에는 전각 괄호와 세미콜론, 스마트 따옴표가 들어 있다. 아랫줄이 코드에서 써야 하는 ASCII 문장 부호다.
한글로 글을 썼기 때문에 생기는 문제는 아니다. 문서에서 코드를 복사하거나 입력기를 바꾸는 과정에서 이런 기호가 섞이지 않았는지 확인해야 한다. 한글 주석이나 문자열의 표시 문제는 별도로 소스와 터미널의 문자 인코딩 설정을 살펴볼 일이다.
괄호와 따옴표, 세미콜론을 다시 입력했다. 이때는 /n도 잘못 썼다는 사실을 아직 몰랐다.
3. 표시된 줄보다 윗줄이 문제일 수도 있다
기호를 고치다가 이번에는 세미콜론을 빠뜨렸다.
printf("Hello, World!/n")
return 0;
편집기가 뒤쪽의 return 근처를 가리켜서 한동안 return 0;만 보고 있었다. 예제와 똑같이 썼는데 왜 틀렸다는 건지 이해가 되지 않았다.
결국 바로 윗줄 끝에 세미콜론이 없다는 걸 찾았다.
오류가 표시된 위치가 언제나 실수한 글자를 정확히 가리키는 것은 아니었다. 다음에는 해당 줄뿐 아니라 윗줄에서 빠진 기호가 없는지도 확인해야겠다.
4. main을 mian으로 적었다
세미콜론을 고쳤으니 이제 될 줄 알았는데 빌드가 또 실패했다. 이번에는 시작 부분이었다.
int mian(void)
main의 가운데 두 글자를 바꿔 적었다. 계속 출력문만 살펴보다 보니 이 부분은 여러 번 읽고도 놓쳤다.
다시 고쳤다.
int main(void)
그제야 빌드가 성공했다.
일단 프로그램의 시작점 이름은 main이라고 기억해 둔다. 앞의 int와 괄호 안의 void는 함수를 배울 때 다시 자세히 살펴보기로 했다.
5. 실행은 되는데 출력이 이상했다
처음으로 출력이 나와서 반가웠다. 그런데 화면에는 이렇게 나왔다.
Hello, World!/n
줄이 바뀌는 대신 /n이 그대로 붙어 있었다. 다시 보니 이렇게 적어야 했다.
printf("Hello, World!\n");
줄바꿈은 역슬래시를 쓰는 \n인데, 나는 슬래시를 쓰는 /n으로 적었다.
이번에는 컴파일 오류가 나지 않았다. /n도 문자열 안에서는 그냥 출력할 수 있는 글자이기 때문이다.
컴파일이 성공했다는 것과 원하는 결과가 나왔다는 것은 따로 확인해야 했다.
6. 고쳤는데도 결과가 그대로였다
슬래시를 고치고 다시 컴파일해서 실행했는데 출력이 바뀌지 않았다. 내가 또 기호를 잘못 봤나 싶어서 몇 번이나 확인했다.
그런데 편집기에서 파일을 저장하지 않은 상태였다.
내가 보고 있던 수정 내용은 아직 편집기 안에만 있었고, 컴파일러는 디스크에 저장된 이전 파일을 읽고 있었다. 저장한 다음 다시 컴파일하니 출력이 바뀌었다.
나중에 인사말을 바꿔 보다가 비슷한 일을 한 번 더 겪었다. 이번에는 분명 저장도 했다.
터미널의 앞쪽 내용을 다시 보니, 수정하면서 따옴표를 하나 빠뜨려 컴파일이 실패해 있었다. 그 뒤에 실행한 hello.exe는 이전에 만들어 둔 파일이었다.
그래서 순서를 적어 두었다.
저장하고, 컴파일 성공을 확인한 다음, 실행하기.
처음에는 거의 한 가지 작업처럼 느껴졌는데, 어느 단계를 보고 있는지 놓치면 예전 결과를 보면서 엉뚱한 곳을 고칠 수도 있었다.
7. 두 번 클릭하니 창이 바로 닫혔다
터미널에서 실행되는 것을 확인한 뒤 파일 탐색기에서 hello.exe를 두 번 클릭했다.
창이 잠깐 나타났다가 사라졌다. 글자가 있었는지도 제대로 보지 못해서 프로그램이 또 잘못된 줄 알았다.
이미 열려 있는 PowerShell에서 실행해 봤다.
.\hello.exe
출력은 그대로 있었다.
Hello, World!
프로그램이 금방 끝나면서 새로 열린 콘솔 창도 닫힌 것이었다. 이미 열려 있는 터미널에서 실행하면 프로그램이 끝난 뒤에도 출력을 볼 수 있었다.
지금은 이 방법으로 확인하고, 창을 멈추게 하는 코드를 급하게 추가하지 않기로 했다.
마지막으로 정상 동작하는 코드 남기기
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
처음에는 낯설기만 했던 몇 줄도 이제는 대략 무엇을 하는지 구분할 수 있게 됐다.
stdio.h에는 여기서 사용하는printf의 선언이 있다.main은 프로그램의 시작점이다. 이름을 틀리면 안 된다.printf는 글자를 출력하고,\n은 줄을 바꾼다.return 0;은 프로그램이 정상적으로 끝났다는 뜻이다.
덧붙임: 컴파일과 실행 명령도 따로 적어 두기
GCC가 이미 설정된 Windows PowerShell에서 hello.c가 있는 폴더로 이동한 뒤 먼저 컴파일한다.
gcc hello.c -o hello.exe
컴파일 오류가 없는 것을 확인한 다음 실행한다.
.\hello.exe
gcc를 찾을 수 없다는 메시지가 나오면 컴파일러 설치와 명령 검색 경로부터 확인해야 한다. 컴파일 오류가 났다면 코드를 고치는 것이 먼저다. 이전에 만들어진 hello.exe를 이어서 실행하면 다시 헷갈릴 수 있다.
이번에 시간을 쓴 부분은 대부분 작았다. 파일 이름, 문장 부호 하나, 글자 두 개의 순서, 저장 여부 같은 것들이었다.
오류 메시지가 한꺼번에 나오면 모든 줄이 틀린 것처럼 느껴졌다. 돌아보니 첫 번째 오류 근처부터 하나씩 확인하고 다시 시도하는 편이 나았다. 아직 C를 많이 배운 건 아니지만, 적어도 내 작업에서 어디를 확인해야 하는지는 처음보다 조금 알게 됐다.
다음에는 변수를 배워 볼 생각이다. 숫자 하나를 저장하고 출력하는 것부터 시작해 보자.