C 언어란?
- 정의: C 언어는 컴퓨터와 의사소통하기 위한 컴파일형 프로그래밍 언어입니다.
- 작동 원리: 프로그래머가 C 언어로 소스 코드(.c 확장자)를 작성하고, 이를 컴파일러로 번역한 후 링커를 통해 최종적으로 바이너리 실행 파일(Windows에서는 .exe)을 생성하여 컴퓨터에서 실행합니다.
- 다른 언어와의 관계: C++, Java, Go, Python 등 많은 언어들이 있지만, C 언어는 그 중에서도 가장 기본적이고 영향력 있는 언어입니다.
C 언어의 역사와 발전
- 기원: Unix 운영 체제 개발을 위해 처음 만들어졌습니다.
- 발전 과정:
- 1969년: Bell 연구소의 Ken Thompson과 Dennis Ritchie가 Unix를 개발했습니다.
- Thompson은 BCPL 언어를 바탕으로 B 언어를 만들었습니다.
- Ritchie는 B 언어를 개선하여 초기 C 언어를 탄생시켰습니다.
- 위상: 오랫동안 프로그래밍 언어 순위 상위권에 위치하며 시스템 프로그래밍 및 임베디드 분야에서 주요 언어로 사용됩니다.
컴파일러 선택 - VS2022
컴파일 및 링크 과정
- 소스 파일: .c 파일
- 컴파일: 각 .c 파일은 컴파일러를 거쳐 대응하는 목표 파일(.obj 확장자)로 변환됩니다.
- 링크: 여러 목표 파일과 라이브러리 파일은 링커를 통해 실행 프로그램(.exe 파일)으로 결합됩니다.
주요 컴파일러 및 IDE
- 컴파일러: msvc, clang, gcc 등이 있습니다.
- IDE(통합 개발 환경): 편집, 컴파일, 디버깅 등의 기능을 통합합니다.
- VS2022: MSVC가 내장되어 있으며 설치 용량이 크지만 초보자에게 적합합니다.
- XCode: Apple 컴퓨터용으로 clang이 내장되어 있습니다.
- CodeBlocks: gcc가 내장되어 있으나 환경 설정이 필요합니다.
- DevC++: gcc가 내장되어 있으며 경량화된 버전으로 일부 코딩 대회에서 사용됩니다.
- Clion: 기본적으로 CMake를 사용하며 컴파일러를 설정할 수 있지만 유료입니다.
VS2022의 장단점
- 장점: 메인스트림 IDE로서 다양한 기능을 제공하며 설치만 하면 바로 사용 가능합니다.
- 단점: 설치 파일 크기가 크고 공간을 많이 차지합니다.
VS 프로젝트 및 소스 파일, 헤더 파일 소개
- 프로젝트: VS에서 코드를 작성하려면 프로젝트를 생성해야 합니다. 프로젝트에는 소스 파일과 헤더 파일을 추가할 수 있습니다.
- 소스 파일: .c 파일로 코드 로직을 저장합니다.
- 헤더 파일: 함수 선언, 매크로 정의 등을 저장하는 .h 파일입니다.
- 솔루션 탐색기: 프로젝트 내 파일 구조를 관리합니다.
첫 번째 C 언어 프로그램
#include <stdio.h>
int main()
{
printf("Hello C\n");
return 0;
}
- 실행 단축키: Ctrl+F5 (VS2022에서 직접 실행)
main 함수 상세 설명
- main 함수는 프로그램의 진입점: 프로그램은 main 함수의 첫 번째 문장부터 실행됩니다.
- 유일무이함: 한 프로젝트 내에 여러 .c 파일이 있을 수 있지만 main 함수는 하나만 존재해야 합니다.
- 함수 서명: int main() 앞의 int는 main 함수가 종료될 때 정수 값을 반환함을 나타냅니다. 마지막에 return 0; 을 작성하여 선언과 일치시킵니다.
- 일반적인 오류:
- main을 mian으로 잘못 작성
- main 뒤의 괄호 누락
- 영문 반각 문자가 아닌 한글 문자 사용(괄호, 세미콜론 등은 반드시 영문 반각 문자로 작성)
- 문장 끝에 세미콜론 ; 누락
printf와 라이브러리 함수
printf 함수
- 기능: 표준 출력 장치(화면)에 정보를 출력합니다.
- 사용법:
- 문자열 출력: printf("Hello C\n");
- 정수 출력: printf("%d\n", n); (%d는 정수 플레이스홀더)
- 문자 출력: printf("%c\n", 'q'); (%c는 문자 플레이스홀더)
- 배정도 부동소수점 출력: printf("%lf\n", 3.14); (%lf는 배정도 부동소수점 플레이스홀더)
- 플레이스홀더: 이후 인수가 플레이스홀더를 대체하여 포맷팅된 출력을 생성합니다.
라이브러리 함수와 헤더 파일
- 라이브러리 함수: C 언어 표준에서 규정한 함수 집합으로, 컴파일러 제조사가 구현하여 프로그래머가 직접 사용할 수 있도록 제공합니다.
- 헤더 파일 포함: 라이브러리 함수를 사용하기 전에 해당 헤더 파일을 포함해야 합니다. 예를 들어 printf는 #include <stdio.h>가 필요합니다.
- 공식 문서 참조: cplusplus.com 등에서 자주 사용되는 라이브러리 함수를 확인할 수 있습니다.
키워드 소개
- 정의: C 언어에서 특별한 의미를 가지는 예약어들입니다. 예: int, if, return 등.
- 사용 규칙:
- 프로그래머가 정의한 식별자(변수명, 함수명 등)는 키워드와 이름이 겹치지 않아야 합니다.
- 키워드는 스스로 새로 만들 수 없습니다.
- C 언어의 32개 키워드:
- auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while
- 확장: C99 표준에서는 inline, restrict, _Bool, _Complex, _Imaginary 등의 키워드가 추가되었습니다.
문자와 ASCII 인코딩
문자의 표현
- C 언어에서는 작은따옴표로 문자를 묶어 표현합니다. 예: 'a', '@'
ASCII 인코딩
문자열과 \0
문자열의 표현
- 큰따옴표로 묶인 문자열을 사용합니다. 예: "abcdef"
- 출력 형식으로 %s 또는 직접 전달할 수 있습니다.
문자열 종료 마커 \0
- 문자열 끝에 숨겨진 \0 문자(ASCII 값 0)가 있으며, 이는 문자열의 종료를 나타냅니다.
- 영향:
- printf는 \0를 만나면 출력을 멈춥니다.
- strlen 함수는 \0를 기준으로 문자열 길이를 계산합니다.
문자 배열과 문자열 비교
char arr1[] = {'a', 'b', 'c'}; // \0 없음, 출력 시 임의의 값이 나올 수 있음
char arr2[] = "abc"; // 실제 저장 a b c \0, 올바르게 출력됨
- arr1에는 \0가 없으므로 출력 시 랜덤 값이 나올 수 있습니다.
- 수동으로 '\0'를 추가하면: char arr1[] = {'a', 'b', 'c', '\0'}; 이렇게 하면 올바르게 출력됩니다.
검증 예시
printf("%s\n", "abc\0def"); // abc만 출력되고 \0 이후는 무시됨
이스케이프 문자
개념
- 이스케이프 문자: 백슬래시(\)로 시작하여 일반 문자를 특수 문자로 변환합니다. 예: 'n'은 일반 문자지만 \n은 줄바꿈 문자입니다.
일반적인 이스케이프 문자
| 이스케이프 문자 |
설명 |
| \? |
삼각 문자 조합 방지 (최신 컴파일러에서는 거의 사용되지 않음) |
| \' |
문자 리터럴의 작은 따옴표를 나타냄 |
| \" |
문자열 내 큰 따옴표를 나타냄 |
| \\ |
백슬래시 자체를 나타냄 |
| \a |
경고음 또는 깜빡임 |
| \b |
백스페이스 (커서 한 칸 왼쪽으로 이동) |
| \f |
페이지 피드 |
| \n |
줄바꿈 |
| \r |
캐리지 리턴 (커서 행 처음으로 이동) |
| \t |
수평 탭 (커서 다음 탭 위치로 이동) |
| \v |
수직 탭 |
| \ddd |
1~3자리 8진수 숫자 (예: \130은 ASCII 88의 'X') |
| \xdd |
2자리 16진수 숫자 (예: \x30은 ASCII 48의 '0') |
| \0 |
null 문자, 값이 0이며 문자열 종료를 나타냄 |
코드 예시
printf("%c\n", '\''); // 작은 따옴표 출력
printf("c:\\test\\code\\test.c\n"); // 경로 내 백슬래시는 이스케이프 필요
printf("%c\n", '\130'); // 8진수 130 -> 10진수 88 -> 'X'
printf("%c\n", '\x30'); // 16진수 30 -> 10진수 48 -> '0'
문장과 문장의 분류
- C 언어 코드는 여러 문장으로 구성되며 다음과 같이 분류됩니다:
빈 문장
- 오직 세미콜론 (;)만 포함하며 아무 작업도 수행하지 않습니다.
- 문법적으로 문장이 필요하지만 논리적으로 작업이 필요 없는 경우에 사용됩니다.
표현식 문장
- 표현식 뒤에 세미콜론을 추가하여 만듭니다.
- 예: b = a + 5;
함수 호출 문장
- 함수를 호출할 때 뒤에 세미콜론을 붙입니다.
- 예: printf("hehe\n"); 또는 int ret = Add(2, 3);
복합 문장
- 중괄호({})로 묶인 여러 문장을 코드 블록이라고 합니다.
- 함수 본문, 루프 본문 등이 복합 문장에 해당합니다.
제어 문장
- 프로그램 실행 흐름을 제어하여 순차, 선택, 반복 구조를 구현합니다.
- 조건 판단: if, switch
- 반복 실행: do while, while, for
- 분기 문장: break, goto, continue, return
주석
주석의 목적과 원칙
- 코드를 설명하며 컴파일러는 주석을 무시합니다.
- 좋은 주석은 자신이나 다른 사람에게 코드를 이해하는 데 도움을 줍니다. 그러나 불필요하게 많은 주석은 삼가는 것이 좋습니다.
주석의 두 가지 형태
- 단일 줄 주석: // 주석 내용, // 이후 줄 끝까지 모두 주석 처리(C99 표준 도입)
- 여러 줄 주석: /* 주석 내용 */, 여러 줄에 걸쳐 주석을 작성할 수 있으나 중첩은 불가능합니다.
- 주의사항: 종료 기호 */를 잊으면 그 이후의 코드가 모두 주석 처리됩니다.
/* 주석 1
printf("b"); // 이 줄도 주석 처리됨
printf("c"); */
주의 사항
- 주석 기호가 큰따옴표 안에 있으면 일반 문자로 취급되어 주석 역할을 하지 않습니다.
printf("// hello /* world */"); // 모두 원본대로 출력됨
- 주석은 공백으로 치환: 컴파일 시 주석은 공백으로 대체됩니다. 예를 들어 min/* 주석 */Value는 min Value가 되며, minValue가 아닙니다.