C 언어와 프로그램 기본 구조
C 언어 소개
C 언어는 1970년대 초반에 개발된 프로그래밍 언어로, 컴퓨터 시스템 소프트웨어, 임베디드 시스템, 게임 개발 등에 널리 사용됩니다.
현대의 다양한 프로그래밍 언어에 큰 영향을 미쳤습니다.
C 프로그램의 기본 구조
#include <stdio.h>
int main() {
// 여기에 코드 작성
return 0;
}
기본 구조 설명
- #include <stdio.h> : C 프로그램에서 기본적인 입출력 함수(printf, scanf)를 사용하기 위해 필요한 헤더 파일을 포함합니다.
- int main() { } : C 프로그램의 시작점입니다. 모든 C 프로그램은 main 함수에서 실행을 시작합니다.
- { } : 중괄호 안에 프로그램의 명령어를 작성합니다.
- return 0; : 프로그램이 정상적으로 종료되었음을 운영체제에 알립니다.
첫 번째 프로그램: "Hello, World!" 출력
#include <stdio.h>
int main() {
printf("Hello, World!\n"); // 화면에 Hello, World! 출력
return 0;
}
printf("Hello, World!\n"); : 화면에 "Hello, World!"를 출력하는 함수입니다. \n은 줄바꿈을 의미합니다.
프로그램 컴파일과 실행
1. 코드 작성 후 파일을 저장합니다. 예: hello.c
2. 터미널(또는 명령 프롬프트)에서 다음 명령어를 입력하여 컴파일합니다:
gcc hello.c -o hello
3. 컴파일이 완료되면 다음 명령어로 프로그램을 실행합니다:
./hello
주석의 중요성
주석은 코드에 대한 설명을 추가할 때 사용합니다. 컴파일러는 주석을 무시하므로 프로그램에 영향을 주지 않습니다.
주석은 다음과 같이 작성할 수 있습니다:
// 한 줄 주석
/* 여러 줄 주석 */
코드의 가독성을 높이고, 협업 시 다른 사람이 코드를 이해하는 데 도움을 줍니다.
C 언어에서 출력과 들여쓰기
출력 함수 더 알아보기
printf는 다양한 데이터 타입을 출력할 수 있습니다:
#include <stdio.h>
int main() {
printf("정수: %d\n", 10);
printf("실수: %f\n", 3.14);
printf("문자: %c\n", 'A');
printf("문자열: %s\n", "Hello, World!");
return 0;
}
%d`, `%f`, `%c`, `%s`는 각각 정수, 실수, 문자, 문자열을 출력할 때 사용합니다.
들여쓰기의 중요성
들여쓰기는 코드의 가독성을 높이고 구조를 명확하게 합니다.
들여쓰기 없이 작성된 코드와 들여쓰기를 잘 지킨 코드를 비교해보세요:
#include <stdio.h>
int main(){printf("Hello, World!\n");return 0;}
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
첫 번째 코드보다 두 번째 코드가 훨씬 읽기 쉽고 이해하기 쉬운 것을 알 수 있습니다.
C Compiler (gcc)
컴퓨터는 오직 0과 1로 이루어진 이진수, 즉 기계어(machine code)만 이해할 수 있습니다. 하지만 사람이 직접 기계어로 프로그래밍하기에는 너무 복잡하고 어려우므로, 우리는 사람이 이해하기 쉬운 고급 언어를 사용합니다. C 언어는 그 중 하나입니다. C compiler는 C언어를 기계어로 바꿔줍니다.
컴파일의 과정
C 언어로 작성된 소스 코드(source code)는 사람이 이해하기 쉽게 작성된 텍스트입니다. 예를 들어, 다음과 같은 코드를 생각해봅시다:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
이 코드는 사람이 읽고 이해하기 쉬운 형태로 작성되었습니다. 그러나 컴퓨터는 이 코드를 직접 이해하지 못합니다. 이 코드가 실제로 컴퓨터에서 실행되기 위해서는 기계어로 변환되어야 합니다. 이 변환 과정을 컴파일(compile)이라고 합니다.
컴파일러의 역할
컴파일러는 C 언어로 작성된 소스 코드를 읽고 이를 기계어 코드로 번역합니다. 이 과정은 크게 다음 단계를 거칩니다:
1. 소스 코드 분석 (Lexical Analysis) : 코드에서 사용된 문법 요소들을 분석합니다. 예를 들어, 변수 이름, 키워드, 연산자 등을 분류합니다.
2. 구문 분석 (Syntax Analysis) : 코드가 올바른 문법에 맞게 작성되었는지 검사합니다. 이때 문법 오류가 있으면 컴파일러는 오류를 보고합니다.
3. 코드 생성 (Code Generation) : 소스 코드를 기계어로 변환하여 실제 실행 가능한 코드로 만듭니다.
결과물: 기계어 코드 (Executable File)
컴파일이 완료되면 .exe (Windows), 또는 실행 파일 (Linux, macOS) 같은 실행 가능한 파일이 생성됩니다. 이 파일은 이미 기계어로 변환된 상태로, 컴퓨터가 이를 바로 실행할 수 있습니다.
예를 들어 보자면:
- 사람이 작성한 소스 코드: printf("Hello, World!\n");
- 컴퓨터가 이해하는 기계어: 01010100 10101011 11001001 ... (이진수 코드)
이렇게 변환된 기계어 코드는 컴퓨터의 CPU가 이해하고 실행할 수 있는 명령어들로 구성됩니다.
요약
소스 코드는 사람이 이해할 수 있는 형태로 작성됩니다.
컴파일러는 이 소스 코드를 기계어로 번역합니다.
번역된 기계어 코드는 컴퓨터가 직접 이해하고 실행할 수 있습니다.
연습 과제
아래 내용을 참고하여 자신만의 출력 메시지를 작성해 보세요:
#include <stdio.h>
int main() {
printf("안녕하세요! C 언어를 시작합니다.\n");
printf("저의 이름은 [이름]입니다.\n");
return 0;
}