매개변수 전달 방식 (Call by Value)

코딩C언어Java
읽는데 9분 소요
처음 쓰여진 날: 2026-02-03
마지막 수정일: 2026-02-18
조회수: 0

요약

함수 호출 시 매개변수 전달 방식인 Call by Value와 Call by Reference를 알아봅니다. 정보처리기사 실기에 자주 출제되는 swap 함수 예제와 배열 참조 전달 문제를 풀기 위한 핵심 개념을 정리합니다.

함수 호출 방식 핵심 정리

개념설명원본 변경
Call by Value값을 복사해서 전달X (불가)
Call by Reference주소를 전달O (가능)

Call by Value (값에 의한 호출)

값에 의한 호출은 함수를 호출할 때 변수의 값을 복사해서 전달하는 방식입니다.

함수 내부에서 매개변수를 변경해도 원본 변수에는 영향이 없습니다.

c
코드 하이라이팅 중...

동작 원리

text
코드 하이라이팅 중...
단계main의 achange의 x
호출 전10-
함수 진입1010 (복사)
x = 100 실행10100
함수 종료 후10(소멸)
Call by Value
Call by Value는 값을 복사하므로 원본 변수에 영향을 주지 않습니다.

return을 사용한 값 변경

Call by Value로도 return을 사용하면 결과를 받아올 수 있습니다.

c
코드 하이라이팅 중...
방식원본 변경 방법
Call by Value + returna = change(a); 반환값을 대입
Call by Reference포인터로 직접 변경


swap 함수 예제 (Call by Value)

swap 함수는 두 변수의 값을 교환하는 함수입니다. Call by Value로 구현하면 교환이 되지 않습니다.

c
코드 하이라이팅 중...

왜 교환이 안 될까?

text
코드 하이라이팅 중...
시점main의 amain의 bswap의 aswap의 b
swap 호출 전1119--
swap 진입11191119
swap 내부 교환 후11191911
swap 종료 후1119(소멸)(소멸)

Call by Reference (참조에 의한 호출)

참조에 의한 호출은 변수의 주소를 전달하는 방식입니다. 포인터를 사용하여 원본 변수에 직접 접근할 수 있습니다.

c
코드 하이라이팅 중...

동작 원리

text
코드 하이라이팅 중...

swap 함수 (Call by Reference)

포인터를 사용하면 진짜 교환이 가능합니다.

c
코드 하이라이팅 중...

비교 정리

구분Call by ValueCall by Reference
전달 방식값 복사주소 전달
매개변수int aint *a
호출 방법swap(a, b)swap(&a, &b)
원본 변경불가가능

시험 출제 포인트

정보처리기사 실기에서는 Call by Value로 작성된 swap 함수가 자주 출제됩니다. 핵심은 다음과 같습니다.

  1. 매개변수가 int a, int b 형태인지 int *a, int *b 형태인지 확인
  2. int a, int b값 복사이므로 원본 변경 불가
  3. 함수 내부에서 교환해도 main의 변수는 그대로
c
코드 하이라이팅 중...

매개변수 전달 방식 핵심 정리

개념설명예시
Call by Value값의 복사본을 전달change(s) -> s의 복사본 전달
배열 전달참조(주소)의 복사본 전달, 같은 배열을 가리킴data[0] = "B" -> 원본 변경됨
String 재할당참조를 새 객체로 변경, 원본에 영향 없음s = "Z" -> 로컬 변수만 변경
변수 스코프메서드마다 독립적인 변수 공간을 가짐main의 s와 change의 s는 다른 변수

Java는 항상 Call by Value

Java에서 메서드에 매개변수를 전달할 때, 항상 값을 복사하여 전달합니다. 이것을 Call by Value(값에 의한 호출) 라고 합니다.

java
코드 하이라이팅 중...

change(a)를 호출하면 a의 값 10이 복사되어 매개변수 x에 전달됩니다. x = 100은 복사본 x만 변경하므로, 원본 a는 그대로 10입니다.

Java Call by Value 개념
main()의 data와 change()의 data는 같은 배열을 가리키지만, s는 각각 독립적인 변수입니다.

배열을 매개변수로 전달하면?

배열은 참조 타입입니다. 참조 타입이란, 변수에 실제 데이터가 아닌 데이터가 저장된 메모리 주소(참조) 가 들어있는 타입입니다.

배열을 매개변수로 전달하면, 참조(주소)의 복사본이 전달됩니다. 복사본이지만 같은 배열 객체를 가리키기 때문에, 배열의 요소를 수정하면 원본에도 반영됩니다.

java
코드 하이라이팅 중...

왜 원본이 변경될까?

main의 data와 change의 data는 서로 다른 변수이지만, 같은 배열 객체의 주소를 담고 있습니다. 같은 집 주소를 가진 두 장의 메모지와 같습니다. 어느 쪽에서든 그 주소의 집 안 가구(배열 요소)를 바꾸면, 같은 집이므로 변경이 반영됩니다.

text
코드 하이라이팅 중...


String 변수를 재할당하면?

String도 참조 타입이지만, 변수에 새 값을 대입(재할당)하면 원본에 영향을 주지 않습니다.

java
코드 하이라이팅 중...

배열 요소 변경과 뭐가 다를까?

배열 요소 변경 (data[0] = "B")은 배열 객체 안의 내용을 수정하는 것입니다. 같은 객체를 가리키는 모든 변수에서 변경이 보입니다.

변수 재할당 (s = "Z")은 변수가 다른 객체를 가리키도록 바꾸는 것입니다. 해당 변수만 변경되고, 원래 객체를 가리키는 다른 변수에는 영향이 없습니다.

text
코드 하이라이팅 중...

변수 스코프

스코프(Scope) 란 변수가 존재하는 범위를 말합니다. 각 메서드는 자신만의 변수 공간을 가집니다.

java
코드 하이라이팅 중...

main의 s와 change의 s이름만 같을 뿐 완전히 다른 변수입니다. change에서 s = "Z"로 바꿔도 main의 s는 여전히 "B"입니다.

변수 상태 추적

시점main의 data[0]main의 schange의 datachange의 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" -> 원본 유지

정보처리기사 실기 기출 문제