'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) 영역에서 필요한 만큼 메모리를 할당받는 기법입니다.

가. 주요 함수

  1. malloc(size_t size): 지정된 바이트 크기만큼 메모리 할당. 초기화되지 않아 쓰레기 값이 들어있음.
  2. calloc(size_t n, size_t size): n * size 만큼 할당하고, 모든 비트를 0으로 초기화.
  3. realloc(void *ptr, size_t size): 이미 할당된 메모리의 크기를 변경.
  4. free(void *ptr): 할당된 메모리를 해제.

나. 메모리 관리 이슈

  • 메모리 누수(Memory Leak): malloc 후 free를 하지 않아 힙 메모리가 낭비되는 현상.
  • 댕글링 포인터(Dangling Pointer): free된 메모리 주소를 여전히 가리키고 있는 포인터.

5. 컴퓨터시스템기사 필기 대비 핵심 요약

구분 핵심 내용
포인터 관계 $arr[i] == *(arr + i)$ 공식을 활용한 코드 해석
구조체 크기 멤버 중 최대 크기 자료형의 배수로 정렬됨 (Padding 주의)
공용체 크기 가장 큰 멤버의 크기만 할당됨
동적 할당 할당은 malloc, 초기화 포함은 calloc, 해제는 free
메모리 영역 지역 변수는 Stack, 동적 할당은 Heap, 전역 변수는 Static

+ Recent posts