값 전달

류한선·2025년 6월 28일

실기연습-2

목록 보기
53/95

좋아요! 정보처리기사 실기에서 자주 출제되는 기본기를 점검하는 함정 문제는 다음과 같은 특징을 가집니다:

  • 변수 범위(scope) 함정
  • 값 전달/참조 전달 착각
  • 배열/인덱스 오류
  • 연산자 우선순위 오류
  • 조건문/반복문 흐름 착각
  • 초기화 누락
  • 함수 호출 시 부작용 (side-effect)

✅ 문제 1: 출력 결과 맞히기 (기본 변수, 조건문, 배열, 함수 전달 개념 포함)

다음 코드를 보고 출력 결과를 맞히시오.

#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개 원소만 수정
  • 배열은 C에서 참조(주소)로 전달되기 때문에 arr[]의 실제 값이 변경됨
  • i % 2 == 0일 때는 += 5, 홀수 인덱스일 때는 *= 2

✅ 예제 흐름 해설:

초기 arr:

Index:   0   1   2   3   4  
Value:   1   2   3   4   5

update(arr, 3) 실행 시:

  • i = 0 (짝수) → arr[0] += 5 → 1 + 5 = 6
  • i = 1 (홀수) → arr[1] *= 2 → 2 * 2 = 4
  • i = 2 (짝수) → arr[2] += 5 → 3 + 5 = 8
    → arr = {6, 4, 8, 4, 5}

✅ 정답 출력:

6 4 8 4 5

🧪 함정 포인트 요약:

  • update에서 배열 전체가 아니라 n = 3만 변경된다는 점 놓치기 쉬움
  • 배열은 참조(주소)로 전달되므로 main()arr[]직접 변경됨
  • i % 2 == 0 조건문이 의미하는 바를 명확히 이해하고 있어야 함

✍️ 연습 문제 2: 또 다른 대표 함정

문제

다음 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 (복사된 값)
  • y = 20 (복사된 값)

함수 내부에서 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)**는 값으로 전달되어 원본은 변경되지 않음
  • 이런 기본 원리를 모르고 변수 값이 바뀌었다고 착각하기 쉬움

🔁 요약 정리:

개념전달 방식원본 변경 여부
int, float, char 등 기본형값 전달X
배열참조 전달O

아주 좋은 질문이에요!
"값이 메인에도 영향을 미치는 경우가 있느냐?"
답은 있습니다.
언제? → ‘참조(주소)’가 전달되거나, '포인터(pointer)'를 통해 접근할 때입니다.


📌 핵심 정리

전달 방식변수 타입main 함수의 값 변경됨?예시
값 전달int, char, float 등 기본형❌ 안 바뀜func(int x)
참조 전달배열, 포인터, 구조체 포인터✅ 바뀜func(int arr[]), func(int* p)

✅ 예제 1: main 변수 값이 바뀌지 않는 경우 (값 전달)

#include <stdio.h>

void add(int x) {
    x += 10;
}

int main() {
    int a = 5;
    add(a);
    printf("main: a = %d\n", a);  // 🔸결과: 5 (안 바뀜)
}
  • xa복사본
  • x += 10main()a와 무관

✅ 예제 2: main 변수 값이 바뀌는 경우 (참조 전달)

#include <stdio.h>

void add(int *x) {
    *x += 10;
}

int main() {
    int a = 5;
    add(&a);
    printf("main: a = %d\n", a);  // 🔸결과: 15 (바뀜!)
}
  • xa의 주소를 가리킴
  • *x += 10은 a 자체에 영향을 줌

✅ 예제 3: 배열은 왜 main에서 바뀌는가?

#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] = 99nums[0]을 직접 바꿈

✅ 예제 4: 구조체 포인터를 통한 참조 전달

#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*✅ 바뀜
구조체❌ 안 바뀜 (단, 포인터 넘기면 ✅)

좋습니다!
이번엔 다른 유형으로,
조건문 + 반복문 흐름을 꼬아놓은 문제를 드릴게요.
즉, 실행 순서를 잘못 이해하면 틀리게 되는 문제 유형입니다.


✅ 문제 2. 다음 코드의 출력 결과는?

#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. 무한 루프에 빠진다


🧠 문제 풀이 흐름

1. while문 시작: i = 0, sum = 0

조건: i < 5 → OK

  • i % 2 == 00 % 2 == 0 → 참
  • continue 실행 → 바로 while 조건으로 돌아감
  • i++ 안 됨!
  • 즉, i는 여전히 0

→ 무한히 0에서 빠져나오지 못함 → continue 때문에 i++로 못 감


✅ 정답: D. 무한 루프에 빠진다


🪤 함정 포인트 설명:

코드 위치설명
continue;조건만 참이면 바로 반복문 처음으로 넘어감
i++;continue가 실행되면 도달하지 않음
결과i가 계속 0 → i < 5는 항상 참 → 무한 루프

✅ 수정하려면?

  1. i++을 조건문 안/밖 어디에 둘지 명확히 제어해야 함
  2. 예시 수정 코드:
while (i < 5) {
    if (i % 2 == 0) {
        i++;
        continue;
    }
    sum += i;
    i++;
}

이러면 다음과 같은 순서로 진행됨:

  • i=0 → continue (i=1)
  • i=1 → sum=1, i=2
  • i=2 → continue (i=3)
  • i=3 → sum=1+3=4, i=4
  • i=4 → continue (i=5) → 종료

👉 sum = 4


아주 좋아요!
이번에는 **“변수 초기화 위치를 헷갈리게 만든 문제”**를 드릴게요.
이 유형은 지역 변수 vs 전역 변수, 블록 내 초기화, 반복문 안에서의 초기화, 초기화 시점 누락 등이 함정입니다.


✅ 문제 3. 다음 코드의 출력 결과는?

#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

🔍 한 줄씩 흐름 따라가기:

itemp 초기화temp += i 결과sum 누적
0temp = 000
1temp = 011
2temp = 023

✅ 최종 결과:

sum = 3

정답: B. sum = 3


🪤 함정 포인트 요약:

함정설명
tempfor문 밖에서 선언된다고 착각→ 매 반복마다 초기화되기 때문에 누적되지 않음
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;
}

흐름:

  • i = 0 → temp += 0 → 0, sum = 0
  • i = 1 → temp += 1 → 1, sum = 1
  • i = 2 → temp += 2 → 3, sum = 1+3 = 4
    → 최종 sum = 4

✅ 요약:

temp 선언 위치누적됨?결과
for문 안❌ 안 누적sum = 3
for문 밖✅ 누적됨sum = 4

0개의 댓글