main 함수 이해하기
C 언어 프로그램의 실행은 항상 main 함수에서 시작됩니다. 하나의 프로젝트 내에는 반드시 단 하나의 main 함수만 존재해야 합니다.
int main()
{
// 실행 코드
return 0;
}
int: 함수의 반환 타입을 의미하며, 정수형 값을 반환합니다.return 0: 프로그램이 정상적으로 종료되었음을 운영체제에 알리는 관습적인 표현입니다.void main()과 같은 형태는 표준이 아니므로int main()사용을 권장합니다.
sizeof 연산자
sizeof는 데이터 타입이나 변수가 메모리에서 차지하는 크기를 바이트(byte) 단위로 계산하는 단항 연산자입니다.
#include <stdio.h>
int main()
{
printf("char: %zu\n", sizeof(char)); // 1
printf("int: %zu\n", sizeof(int)); // 4
printf("double: %zu\n", sizeof(double)); // 8
return 0;
}
sizeof의 결과값은 플랫폼에 따라 다를 수 있으며, 보통 %zu 또는 %d 형식을 사용하여 출력합니다.
전역 변수와 지역 변수
변수는 선언된 위치에 따라 사용 범위와 생명 주기가 달라집니다.
int global_val = 100; // 전역 변수
int main()
{
int local_val = 10; // 지역 변수
return 0;
}
- 지역 변수: 중괄호
{}내부에서 선언되며, 해당 블록을 벗어나면 메모리에서 소멸됩니다. - 전역 변수: 함수 외부에서 선언되며, 프로그램 종료 시까지 유지됩니다.
- 우선순위: 전역 변수와 지역 변수의 이름이 같을 경우, 지역 변수가 우선적으로 사용됩니다.
extern 키워드
다른 소스 파일(.c)에 정의된 전역 변수나 함수를 참조할 때 사용합니다.
// file1.c
int shared_data = 50;
// file2.c
extern int shared_data;
int main() {
printf("%d", shared_data);
return 0;
}
상수의 종류
값이 변하지 않는 데이터를 상수라고 하며, C 언어에서는 다음과 같은 방식으로 정의합니다.
- 리터럴 상수: 3.14, 'A', "Hello"와 같이 직접 적는 값.
- const 상변수: 변수 선언 시
const를 붙여 값을 수정할 수 없게 만듭니다. - #define 매크로 상수: 전처리기 지시자를 사용하여 특정 식별자를 상수로 치환합니다.
- 열거형(enum) 상수: 연관된 정수 집합에 이름을 부여합니다.
문자열과 널 문자('\0')
C 언어에서 문자열은 항상 마지막에 \0(널 문자)가 포함되어 끝을 나타냅니다.
char str1[] = {'a', 'b', 'c', '\0'};
char str2[] = "abc"; // 자동으로 \0 포함
strlen() 함수는 이 널 문자를 만날 때까지의 길이를 계산합니다. 만약 널 문자가 없다면 메모리 내에서 널 문자를 만날 때까지 임의의 영역을 읽어 쓰레기 값이 반환될 수 있습니다.
제어문: 선택과 반복
조건문 (if-else)
int score = 85;
if (score >= 90) {
printf("A\n");
} else if (score >= 80) {
printf("B\n");
} else {
printf("C\n");
}
반복문 (while, for, do-while)
- for: 반복 횟수가 명확할 때 주로 사용합니다.
- while: 조건이 참인 동안 반복합니다.
- do-while: 조건 검사 전 최소 한 번은 코드를 실행합니다.
break와 continue
break: 가장 가까운 반복문을 즉시 탈출합니다.continue: 현재 반복의 남은 코드를 건너뛰고 다음 반복 조건 검사로 이동합니다.
scanf 함수의 반환값
scanf는 성공적으로 읽어들인 데이터의 개수를 반환합니다. 입력 오류가 발생하거나 파일 끝에 도달하면 EOF(-1)를 반환합니다.
int x, y;
int count = scanf("%d %d", &x, &y);
// 두 개의 정수를 정상 입력하면 count는 2가 됨
static 키워드
- 정적 지역 변수: 함수가 종료되어도 값이 초기화되지 않고 유지됩니다. 메모리의 정적 영역에 저장됩니다.
- 정적 전역 변수: 해당 소스 파일 내부에서만 접근이 가능하도록 범위를 제한합니다(외부 파일에서
extern으로 참조 불가). - 정적 함수: 해당 소스 파일 내에서만 호출할 수 있는 내부 함수가 됩니다.
포인터 기초
포인터는 메모리의 주소값을 저장하는 변수입니다.
int target = 20;
int *ptr = ⌖ // &는 주소 연산자
*ptr = 40; // *는 역참조 연산자. target의 값이 40으로 변경됨
- 포인터의 크기: 저장하는 데이터 타입과 상관없이, 주소 체계에 따라 결정됩니다. (32비트 환경에서는 4바이트, 64비트 환경에서는 8바이트)