좋아요! 정보처리기사 실기에서 자주 출제되는 기본기를 점검하는 함정 문제는 다음과 같은 특징을 가집니다:
다음 코드를 보고 출력 결과를 맞히시오.
#include <stdio.h>
void update(int a[], int n) {
for (int i = 0; i < n; i++) {
if (i % 2 == 0)
a[i] += 5;
else
a[i] *= 2;
}
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
update(arr, 3);
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
return 0;
}
update(arr, 3)는 배열의 앞 3개 원소만 수정함arr[]의 실제 값이 변경됨i % 2 == 0일 때는 += 5, 홀수 인덱스일 때는 *= 2초기 arr:
Index: 0 1 2 3 4
Value: 1 2 3 4 5
update(arr, 3) 실행 시:
6 4 8 4 5
update에서 배열 전체가 아니라 n = 3만 변경된다는 점 놓치기 쉬움main()의 arr[]가 직접 변경됨i % 2 == 0 조건문이 의미하는 바를 명확히 이해하고 있어야 함다음 C 코드를 보고 출력 결과를 예측하시오.
#include <stdio.h>
void func(int x, int y) {
x += 5;
y *= 2;
printf("func 내부: x = %d, y = %d\n", x, y);
}
int main() {
int a = 10, b = 20;
func(a, b);
printf("main 내부: a = %d, b = %d\n", a, b);
return 0;
}
func(a, b) 호출 시:
함수 내부에서 x = 10 + 5 = 15, y = 20 * 2 = 40
→ 출력: func 내부: x = 15, y = 40
하지만 main 함수의 a, b는 그대로!
왜? **값 전달(pass-by-value)**이기 때문
func 내부: x = 15, y = 40
main 내부: a = 10, b = 20
| 개념 | 전달 방식 | 원본 변경 여부 |
|---|---|---|
| int, float, char 등 기본형 | 값 전달 | X |
| 배열 | 참조 전달 | O |
아주 좋은 질문이에요!
"값이 메인에도 영향을 미치는 경우가 있느냐?"
답은 있습니다.
언제? → ‘참조(주소)’가 전달되거나, '포인터(pointer)'를 통해 접근할 때입니다.
| 전달 방식 | 변수 타입 | main 함수의 값 변경됨? | 예시 |
|---|---|---|---|
| 값 전달 | int, char, float 등 기본형 | ❌ 안 바뀜 | func(int x) |
| 참조 전달 | 배열, 포인터, 구조체 포인터 | ✅ 바뀜 | func(int arr[]), func(int* p) |
#include <stdio.h>
void add(int x) {
x += 10;
}
int main() {
int a = 5;
add(a);
printf("main: a = %d\n", a); // 🔸결과: 5 (안 바뀜)
}
x는 a의 복사본x += 10은 main()의 a와 무관#include <stdio.h>
void add(int *x) {
*x += 10;
}
int main() {
int a = 5;
add(&a);
printf("main: a = %d\n", a); // 🔸결과: 15 (바뀜!)
}
x는 a의 주소를 가리킴*x += 10은 a 자체에 영향을 줌#include <stdio.h>
void modify(int arr[]) {
arr[0] = 99;
}
int main() {
int nums[3] = {1, 2, 3};
modify(nums);
printf("main: nums[0] = %d\n", nums[0]); // 🔸결과: 99
}
arr[0] = 99는 nums[0]을 직접 바꿈#include <stdio.h>
typedef struct {
int score;
} Student;
void update(Student *s) {
s->score = 100;
}
int main() {
Student stu = {50};
update(&stu);
printf("main: stu.score = %d\n", stu.score); // 🔸결과: 100
}
| 상황 | main 값 영향 받는가? |
|---|---|
기본형 변수 int x | ❌ 안 바뀜 |
배열 int[] | ✅ 바뀜 |
포인터 int* | ✅ 바뀜 |
| 구조체 | ❌ 안 바뀜 (단, 포인터 넘기면 ✅) |
좋습니다!
이번엔 다른 유형으로,
조건문 + 반복문 흐름을 꼬아놓은 문제를 드릴게요.
즉, 실행 순서를 잘못 이해하면 틀리게 되는 문제 유형입니다.
#include <stdio.h>
int main() {
int i = 0, sum = 0;
while (i < 5) {
if (i % 2 == 0)
continue;
sum += i;
i++;
}
printf("sum = %d\n", sum);
return 0;
}
A. sum = 4
B. sum = 6
C. sum = 8
D. 무한 루프에 빠진다
i = 0, sum = 0조건: i < 5 → OK
i % 2 == 0 → 0 % 2 == 0 → 참continue 실행 → 바로 while 조건으로 돌아감continue 때문에 i++로 못 감| 코드 위치 | 설명 |
|---|---|
continue; | 조건만 참이면 바로 반복문 처음으로 넘어감 |
i++; | continue가 실행되면 도달하지 않음 |
| 결과 | i가 계속 0 → i < 5는 항상 참 → 무한 루프 |
i++을 조건문 안/밖 어디에 둘지 명확히 제어해야 함while (i < 5) {
if (i % 2 == 0) {
i++;
continue;
}
sum += i;
i++;
}
이러면 다음과 같은 순서로 진행됨:
👉 sum = 4
아주 좋아요!
이번에는 **“변수 초기화 위치를 헷갈리게 만든 문제”**를 드릴게요.
이 유형은 지역 변수 vs 전역 변수, 블록 내 초기화, 반복문 안에서의 초기화, 초기화 시점 누락 등이 함정입니다.
#include <stdio.h>
int main() {
int sum = 0;
for (int i = 0; i < 3; i++) {
int temp = 0;
temp += i;
sum += temp;
}
printf("sum = %d\n", sum);
return 0;
}
A. sum = 0
B. sum = 3
C. sum = 6
D. 컴파일 오류
int temp = 0; → temp는 매 반복마다 초기화됨temp는 0부터 시작해서 temp += i됨| i | temp 초기화 | temp += i 결과 | sum 누적 |
|---|---|---|---|
| 0 | temp = 0 | 0 | 0 |
| 1 | temp = 0 | 1 | 1 |
| 2 | temp = 0 | 2 | 3 |
sum = 3
| 함정 | 설명 |
|---|---|
temp가 for문 밖에서 선언된다고 착각 | → 매 반복마다 초기화되기 때문에 누적되지 않음 |
temp += i;가 계속 누적된다고 착각 | → 실제로는 temp가 매번 0부터 시작 |
sum += temp;가 복잡하게 느껴질 수 있음 | → 실은 그냥 i를 sum에 더하는 것과 같음 |
temp를 반복문 밖에서 선언했다면?#include <stdio.h>
int main() {
int sum = 0;
int temp = 0;
for (int i = 0; i < 3; i++) {
temp += i;
sum += temp;
}
printf("sum = %d\n", sum);
return 0;
}
sum = 4| temp 선언 위치 | 누적됨? | 결과 |
|---|---|---|
| for문 안 | ❌ 안 누적 | sum = 3 |
| for문 밖 | ✅ 누적됨 | sum = 4 |