C 언어 포인터·구조체·재귀함수·비트연산자를 이해하고 기출 코드 출력 추적 패턴 5가지를 완벽히 정복합니다.
🔗 포인터 — C 언어의 핵심
이 섹션에서는 C 언어 기출에서 가장 많이 나오는 포인터의 선언, 역참조, 포인터 연산을 살펴보겠습니다.
포인터(Pointer)는 다른 변수의 메모리 주소를 저장하는 변수입니다. C 언어 기출의 약 40%가 포인터 관련 문제이므로 반드시 정복해야 합니다.
포인터 선언과 기본 연산에서 &는 주소 연산자(변수의 주소를 얻음)이고, *는 역참조 연산자(포인터가 가리키는 값을 얻음)입니다. int *p = &a; 라면 p는 a의 주소, *p는 a의 값을 의미합니다.
포인터 연산(Pointer Arithmetic): 포인터에 정수를 더하면 가리키는 자료형의 크기만큼 주소가 이동합니다. int *p가 주소 100을 가리킬 때, p+1은 104(int=4바이트)를 가리킵니다. char *p가 100이면 p+1은 101(char=1바이트)입니다.
배열과 포인터의 관계: 배열 이름은 배열의 첫 번째 원소 주소입니다. int arr[5]에서 arr은 &arr[0]과 동일합니다. arr[i]는 *(arr+i)와 동일하게 처리됩니다.
기출 함정: "포인터에 int를 더하면 1바이트씩 이동한다" → 틀림. int 포인터는 4바이트(또는 시스템에 따라 다름)씩 이동합니다. "배열 이름은 변수이므로 값을 바꿀 수 있다" → 틀림. 배열 이름은 상수 포인터입니다.
🏗️ 구조체 vs 공용체 — 메모리 크기
이 섹션에서는 구조체와 공용체의 차이, 특히 메모리 크기 계산 방식을 살펴보겠습니다.
구조체(struct)는 서로 다른 자료형의 변수를 묶은 사용자 정의 자료형입니다. 각 멤버가 독립적인 메모리 공간을 가집니다. 구조체의 크기는 모든 멤버 크기의 합(정렬 패딩 포함)입니다.
공용체(union)는 구조체와 유사하지만 모든 멤버가 같은 메모리 공간을 공유합니다. 공용체의 크기는 멤버 중 가장 큰 자료형의 크기입니다. 한 번에 하나의 멤버만 유효한 값을 가집니다.
| 구분 | struct (구조체) | union (공용체) |
|---|---|---|
| 메모리 | 멤버 각각 독립 공간 | 모든 멤버가 같은 공간 공유 |
| 크기 | 모든 멤버 크기의 합 | 가장 큰 멤버의 크기 |
| 동시 사용 | 모든 멤버 동시 사용 가능 | 한 번에 하나만 유효 |
| 용도 | 복합 데이터 표현 | 메모리 절약, 같은 데이터 다른 해석 |
예시: struct {int a; char b; double c;}의 크기는 4+1+8=13바이트(실제로는 패딩으로 16바이트)이고, union {int a; char b; double c;}의 크기는 max(4,1,8)=8바이트입니다.
🔄 재귀함수 호출 추적
이 섹션에서는 재귀함수의 호출 스택을 단계별로 추적하는 방법을 살펴보겠습니다.
재귀함수 기출 문제는 팩토리얼과 피보나치가 가장 많이 나옵니다. 추적할 때는 호출 스택을 순서대로 써나가는 것이 핵심입니다.
팩토리얼 f(4) 추적: f(4) = 4 × f(3), f(3) = 3 × f(2), f(2) = 2 × f(1), f(1) = 1(기저 사례). 복귀 시: f(1)=1, f(2)=2, f(3)=6, f(4)=24.
피보나치 fib(5) 추적: fib(5) = fib(4)+fib(3), fib(4) = fib(3)+fib(2) ... 기저 사례 fib(0)=0, fib(1)=1로 시작. 결과: fib(5)=5. 피보나치는 중복 호출이 많아 단순 재귀는 비효율적이며 기출에서 중복 계산 횟수를 묻기도 합니다.
재귀 추적 방법: 1) 기저 사례(Base Case) 먼저 확인. 2) 재귀 호출 나무 그리기. 3) 반환값을 역방향으로 계산. 기출에서 재귀 코드가 나오면 반드시 예제값으로 손 추적을 해봐야 합니다.
⚡ 비트 연산자와 전처리기
이 섹션에서는 C 언어의 비트 연산자 계산 방법과 전처리기 지시자를 살펴보겠습니다.
비트 연산자는 정수를 이진수로 변환하여 각 비트에 연산을 수행합니다. 기출에서 결과값을 직접 계산하는 문제가 나옵니다.
| 연산자 | 기호 | 의미 | 예 (5와 3) |
|---|---|---|---|
| AND | & | 둘 다 1이면 1 | 0101 & 0011 = 0001 (1) |
| OR | | | 하나라도 1이면 1 | 0101 | 0011 = 0111 (7) |
| XOR | ^ | 서로 다르면 1 | 0101 ^ 0011 = 0110 (6) |
| NOT | ~ | 반전 | ~0101 = 1010... (음수) |
| 왼쪽 쉬프트 | << | 비트를 왼쪽으로 n칸 이동 | 1 << 3 = 8 (×2^3) |
| 오른쪽 쉬프트 | >> | 비트를 오른쪽으로 n칸 이동 | 8 >> 2 = 2 (÷2^2) |
암기법: "<< N은 2^N 곱하기, >> N은 2^N 나누기". 예: 3 << 4 = 3×16 = 48.
전처리기(Preprocessor)는 컴파일 이전 단계에서 처리되는 지시자입니다. #define: 매크로 상수·함수 정의. #include: 헤더 파일 포함. #ifdef / #ifndef: 조건부 컴파일 — 특정 심볼이 정의된 경우/정의되지 않은 경우에만 컴파일. #endif: #if 계열 지시자 종료. #pragma: 컴파일러 특정 지시.
기출 함정: "#define MAX 10"에서 MAX는 변수가 아니라 상수입니다. 전처리기 처리 후 MAX는 10으로 텍스트 치환됩니다. "비트 AND(&)와 논리 AND(&&)는 같다" → 틀림. 비트 AND는 각 비트에 연산하고, 논리 AND는 조건 전체를 평가합니다.
📝 기출 코드 5대 유형 패턴
이 섹션에서는 C 언어 기출 코드에서 반복적으로 나타나는 5가지 유형을 살펴보겠습니다.
유형 1 — 포인터 출력 추적: 포인터가 가리키는 값과 주소를 구분하여 출력 결과를 계산합니다. *p와 p의 차이, 포인터 연산 후 값을 추적합니다.
유형 2 — 재귀함수 반환값: 재귀 호출 스택을 단계별로 추적하여 최종 반환값을 구합니다. 팩토리얼, 피보나치, 거듭제곱이 대표 유형입니다.
유형 3 — 비트 연산 계산: 주어진 정수를 이진수로 변환하고 비트 연산 수행 후 결과를 십진수로 변환합니다. 쉬프트 연산과의 조합이 자주 나옵니다.
유형 4 — 구조체 멤버 접근: 구조체 변수에서 .으로 멤버 접근, 포인터에서 ->로 멤버 접근하는 코드의 출력을 추적합니다.
유형 5 — 전처리기 매크로 치환: #define으로 정의된 매크로가 치환된 결과 코드를 분석하여 출력값을 계산합니다. 함수형 매크로에서 부작용에 주의합니다.
암기법: "포재비구전(포재비구에 전달)" — 포인터·재귀·비트·구조체·전처리기 5대 유형. 이 5가지 패턴을 익히면 C 언어 기출 대부분에 대응할 수 있습니다.
📌 16강 핵심 요약과 17강 예고
이 섹션에서는 16강 핵심 내용을 압축 정리합니다.
포인터: &=주소, *=역참조. 포인터+n = 자료형 크기×n 이동. 배열이름=첫 원소 주소. 구조체=독립메모리(합), 공용체=공유메모리(최대). 재귀: 기저사례 확인→호출스택 추적→역방향 계산.
비트연산: &(AND)·|(OR)·^(XOR)·~(NOT)·<<(×2^n)·>>(÷2^n). 전처리기: #define(매크로)·#include·#ifdef/#ifndef·#endif. 기출 5패턴: 포재비구전.
다음 17강에서는 Java 기초 — OOP와 기출 추적 — 상속·인터페이스·추상클래스·오버로딩vs오버라이딩·접근제어자 범위와 다형성 코드 추적을 완벽히 정리합니다.
관련 주제
- 포인터 역참조
- 포인터 연산
- 배열과 포인터 관계
- 구조체 공용체 열거형
- 재귀함수 호출 스택 추적
- 비트 연산자
- 전처리기 define
- 자격증
- 자격증 강의
- 정보처리기사 필기 25강 — 핵심이론·기출 완전정복
- 무료강의
- 무료 온라인 강의
- NUGUNA
- 누구나
📚 시리즈 전체 공유
정보처리기사 필기 25강 — 핵심이론·기출 완전정복
이 강의가 속한 시리즈는 총 16강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.
댓글
불러오는 중...
