매개변수 전달 방식 (Call by Value)
요약
함수 호출 시 매개변수 전달 방식인 Call by Value와 Call by Reference를 알아봅니다. 정보처리기사 실기에 자주 출제되는 swap 함수 예제와 배열 참조 전달 문제를 풀기 위한 핵심 개념을 정리합니다.
함수 호출 방식 핵심 정리
| 개념 | 설명 | 원본 변경 |
|---|---|---|
| Call by Value | 값을 복사해서 전달 | X (불가) |
| Call by Reference | 주소를 전달 | O (가능) |
Call by Value (값에 의한 호출)
값에 의한 호출은 함수를 호출할 때 변수의 값을 복사해서 전달하는 방식입니다.
함수 내부에서 매개변수를 변경해도 원본 변수에는 영향이 없습니다.
동작 원리
| 단계 | main의 a | change의 x |
|---|---|---|
| 호출 전 | 10 | - |
| 함수 진입 | 10 | 10 (복사) |
| x = 100 실행 | 10 | 100 |
| 함수 종료 후 | 10 | (소멸) |

return을 사용한 값 변경
Call by Value로도 return을 사용하면 결과를 받아올 수 있습니다.
| 방식 | 원본 변경 방법 |
|---|---|
| Call by Value + return | a = change(a); 반환값을 대입 |
| Call by Reference | 포인터로 직접 변경 |
swap 함수 예제 (Call by Value)
swap 함수는 두 변수의 값을 교환하는 함수입니다. Call by Value로 구현하면 교환이 되지 않습니다.
왜 교환이 안 될까?
| 시점 | main의 a | main의 b | swap의 a | swap의 b |
|---|---|---|---|---|
| swap 호출 전 | 11 | 19 | - | - |
| swap 진입 | 11 | 19 | 11 | 19 |
| swap 내부 교환 후 | 11 | 19 | 19 | 11 |
| swap 종료 후 | 11 | 19 | (소멸) | (소멸) |
Call by Reference (참조에 의한 호출)
참조에 의한 호출은 변수의 주소를 전달하는 방식입니다. 포인터를 사용하여 원본 변수에 직접 접근할 수 있습니다.
동작 원리
swap 함수 (Call by Reference)
포인터를 사용하면 진짜 교환이 가능합니다.
비교 정리
| 구분 | Call by Value | Call by Reference |
|---|---|---|
| 전달 방식 | 값 복사 | 주소 전달 |
| 매개변수 | int a | int *a |
| 호출 방법 | swap(a, b) | swap(&a, &b) |
| 원본 변경 | 불가 | 가능 |
시험 출제 포인트
정보처리기사 실기에서는 Call by Value로 작성된 swap 함수가 자주 출제됩니다. 핵심은 다음과 같습니다.
- 매개변수가
int a, int b형태인지int *a, int *b형태인지 확인 int a, int b면 값 복사이므로 원본 변경 불가- 함수 내부에서 교환해도 main의 변수는 그대로
매개변수 전달 방식 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| Call by Value | 값의 복사본을 전달 | change(s) -> s의 복사본 전달 |
| 배열 전달 | 참조(주소)의 복사본 전달, 같은 배열을 가리킴 | data[0] = "B" -> 원본 변경됨 |
| String 재할당 | 참조를 새 객체로 변경, 원본에 영향 없음 | s = "Z" -> 로컬 변수만 변경 |
| 변수 스코프 | 메서드마다 독립적인 변수 공간을 가짐 | main의 s와 change의 s는 다른 변수 |
Java는 항상 Call by Value
Java에서 메서드에 매개변수를 전달할 때, 항상 값을 복사하여 전달합니다. 이것을 Call by Value(값에 의한 호출) 라고 합니다.
change(a)를 호출하면 a의 값 10이 복사되어 매개변수 x에 전달됩니다. x = 100은 복사본 x만 변경하므로, 원본 a는 그대로 10입니다.

배열을 매개변수로 전달하면?
배열은 참조 타입입니다. 참조 타입이란, 변수에 실제 데이터가 아닌 데이터가 저장된 메모리 주소(참조) 가 들어있는 타입입니다.
배열을 매개변수로 전달하면, 참조(주소)의 복사본이 전달됩니다. 복사본이지만 같은 배열 객체를 가리키기 때문에, 배열의 요소를 수정하면 원본에도 반영됩니다.
왜 원본이 변경될까?
main의 data와 change의 data는 서로 다른 변수이지만, 같은 배열 객체의 주소를 담고 있습니다. 같은 집 주소를 가진 두 장의 메모지와 같습니다. 어느 쪽에서든 그 주소의 집 안 가구(배열 요소)를 바꾸면, 같은 집이므로 변경이 반영됩니다.
String 변수를 재할당하면?
String도 참조 타입이지만, 변수에 새 값을 대입(재할당)하면 원본에 영향을 주지 않습니다.
배열 요소 변경과 뭐가 다를까?
배열 요소 변경 (data[0] = "B")은 배열 객체 안의 내용을 수정하는 것입니다. 같은 객체를 가리키는 모든 변수에서 변경이 보입니다.
변수 재할당 (s = "Z")은 변수가 다른 객체를 가리키도록 바꾸는 것입니다. 해당 변수만 변경되고, 원래 객체를 가리키는 다른 변수에는 영향이 없습니다.
변수 스코프
스코프(Scope) 란 변수가 존재하는 범위를 말합니다. 각 메서드는 자신만의 변수 공간을 가집니다.
main의 s와 change의 s는 이름만 같을 뿐 완전히 다른 변수입니다. change에서 s = "Z"로 바꿔도 main의 s는 여전히 "B"입니다.
변수 상태 추적
| 시점 | main의 data[0] | main의 s | change의 data | change의 s |
|---|---|---|---|---|
| change 호출 전 | "A" | "B" | - | - |
| change 진입 시 | "A" | "B" | 같은 배열 | "B" (복사본) |
data[0] = s 후 | "B" | "B" | 같은 배열 | "B" |
s = "Z" 후 | "B" | "B" | 같은 배열 | "Z" |
| change 종료 후 | "B" | "B" | - | - |
최종 출력: data[0] + s = "B" + "B" = BB
정리
| 전달 방식 | 동작 | 원본 영향 | 예시 |
|---|---|---|---|
| 기본 타입 (int 등) | 값 복사 | 없음 | x = 100 -> 원본 유지 |
| 배열 요소 수정 | 같은 객체의 내용 수정 | 있음 | data[0] = "B" -> 원본 변경 |
| 참조 변수 재할당 | 로컬 변수만 변경 | 없음 | s = "Z" -> 원본 유지 |