'3.2.1. 구조적 프로그래밍 언어(C언어)'는 단순히 문법을 아는 것을 넘어, 메모리의 물리적 구조와 주소 계산을 얼마나 정확히 이해하고 있는지를 평가합니다.
1. C언어 기본 문법 및 자료형 (Data Types)
C언어는 하드웨어 제어에 최적화된 저수준 제어가 가능한 고수준 언어입니다.
가. 기본 자료형과 메모리 크기
컴퓨터 시스템의 아키텍처(32bit vs 64bit)에 따라 달라질 수 있으나, 표준적인 시험 기준 크기는 다음과 같습니다.
- char: 1 Byte (문자 및 작은 정수)
- int: 4 Byte (기본 정수형)
- float: 4 Byte (단정밀도 실수)
- double: 8 Byte (배정밀도 실수)
나. 산술 및 증감 연산자
- 전위 연산 (++a): 변수의 값을 먼저 1 증가시킨 후 연산에 사용.
- 후위 연산 (a++): 변수의 현재 값을 연산에 사용한 후 1 증가. (코드 해석 문제에서 가장 많이 틀리는 부분)
2. 배열(Array)과 포인터(Pointer)
메모리 주소 직접 참조는 C언어의 핵심입니다.
가. 배열의 메모리 레이아웃
- 배열은 동일한 자료형이 연속된 메모리 공간에 배치됩니다.
- 배열명 그 자체는 배열의 첫 번째 요소의 주소값($\&arr[0]$)을 가진 상수 포인터입니다.
나. 포인터 변수와 연산자
- * (역참조 연산자): 포인터가 가리키는 주소에 저장된 실제 '값'을 가져옵니다.
- & (주소 연산자): 변수가 저장된 '메모리 주소'를 반환합니다.
다. 포인터 연산 (Pointer Arithmetic)
포인터에 정수를 더하거나 뺄 때, 실제 주소값은 (더하는 정수 * 자료형의 크기)만큼 이동합니다.
예: int *p; 일 때 p + 1은 주소값이 1 증가하는 것이 아니라, int 크기인 4 Byte만큼 증가합니다.
3. 구조체(Structure)와 공용체(Union)
사용자가 다양한 자료형을 묶어 새로운 데이터 타입을 정의하는 방식입니다.
가. 구조체 (struct)
- 각 멤버가 서로 다른 메모리 영역을 점유합니다.
- 메모리 정렬(Padding): CPU의 처리 효율을 위해 멤버 사이에 빈 공간(Padding Byte)이 삽입되어 전체 크기가 멤버들의 단순 합보다 클 수 있습니다.
- 크기 계산: 모든 멤버의 크기 합 + 패딩 바이트.
나. 공용체 (union)
- 모든 멤버가 가장 큰 멤버의 메모리 공간을 공유합니다.
- 한 번에 하나의 멤버만 의미 있는 값을 가질 수 있습니다.
- 크기 계산: 멤버 중 가장 큰 자료형의 크기와 동일.
4. 메모리 동적 할당 (Dynamic Memory Allocation)
프로그램 실행 중(Runtime)에 힙(Heap) 영역에서 필요한 만큼 메모리를 할당받는 기법입니다.
가. 주요 함수
- malloc(size_t size): 지정된 바이트 크기만큼 메모리 할당. 초기화되지 않아 쓰레기 값이 들어있음.
- calloc(size_t n, size_t size): n * size 만큼 할당하고, 모든 비트를 0으로 초기화.
- realloc(void *ptr, size_t size): 이미 할당된 메모리의 크기를 변경.
- free(void *ptr): 할당된 메모리를 해제.
나. 메모리 관리 이슈
- 메모리 누수(Memory Leak): malloc 후 free를 하지 않아 힙 메모리가 낭비되는 현상.
- 댕글링 포인터(Dangling Pointer): free된 메모리 주소를 여전히 가리키고 있는 포인터.
5. 컴퓨터시스템기사 필기 대비 핵심 요약
| 구분 | 핵심 내용 |
| 포인터 관계 | $arr[i] == *(arr + i)$ 공식을 활용한 코드 해석 |
| 구조체 크기 | 멤버 중 최대 크기 자료형의 배수로 정렬됨 (Padding 주의) |
| 공용체 크기 | 가장 큰 멤버의 크기만 할당됨 |
| 동적 할당 | 할당은 malloc, 초기화 포함은 calloc, 해제는 free |
| 메모리 영역 | 지역 변수는 Stack, 동적 할당은 Heap, 전역 변수는 Static |
'study > 컴퓨터시스템기사' 카테고리의 다른 글
| 3.2.3. 스크립트 활용: 스크립트 언어의 종류, 특징 및 애플리케이션 작성 (1) | 2026.01.27 |
|---|---|
| 3.2.2. 객체지향 프로그래밍 언어: 객체지향 개념 및 애플리케이션 작성 (0) | 2026.01.27 |
| 3.1.4. 인덱스와 해싱 활용: 인덱스 원리, 해시 함수 및 해싱 활용 (0) | 2026.01.27 |
| 3.1.3. 그래프 활용: 그래프의 이해, 구현 및 탐색 (0) | 2026.01.27 |
| 3.1.2. 정렬 및 탐색: 각종 정렬 및 탐색 알고리즘 구현 (0) | 2026.01.27 |