정처기 감자정처기 감자
공통 기초함수

검색

검색어를 입력해 개념, 문제, 필기를 찾습니다.

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

코딩C언어Java
읽는데 14분 소요
처음 쓰인 날: 2026-02-03
마지막 수정일: 2026-10-02
조회수: —
선수학습(2개)
  • 변수 스코프 - 지역 변수와 전역 변수의 탐색 순서
  • 함수의 기초

요약

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

함수 호출 방식 핵심 정리

개념설명원본 변경
Call by Value값을 복사해서 전달X (불가)
Call by Reference주소를 전달O (가능)
배열 전달배열 이름 자체가 주소이므로 & 없이 자동 전달O (가능)

Call by Value (값에 의한 호출)

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

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

c
코드 하이라이팅 중…
출력
코드 하이라이팅 중…
Call by Value
Call by Value는 값을 복사하므로 원본 변수에 영향을 주지 않습니다.

동작 원리

text
코드 하이라이팅 중…
단계main의 achange의 x
호출 전10-
함수 진입1010 (복사)
x = 100 실행10100
함수 종료 후10(소멸2)
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로 구현하면 교환이 되지 않습니다.

swap의 a, b와 main의 a, b는 이름만 같은 별개의 변수입니다
같은 이름이라도 함수마다 독립적인 변수 공간을 가지기 때문에, swap의 a와 main의 a는 서로 다른 변수입니다.
c
코드 하이라이팅 중…
출력
코드 하이라이팅 중…

왜 교환이 안 될까?

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

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

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

포인터란 다른 변수의 메모리 주소를 저장하는 변수입니다. 아래 코드에서 핵심 기호 3가지를 먼저 알아둡시다.

  • int *x — 선언: x는 int형 변수의 주소를 저장하는 포인터
  • *x — 사용: x가 가리키는 곳의 값 (역참조)
  • &a — a가 저장된 메모리 주소
c
코드 하이라이팅 중…
출력
코드 하이라이팅 중…

동작 원리

예를 들어 변수 a가 메모리의 100번지에 저장되어 있다고 가정하면:

text
코드 하이라이팅 중…
단계main의 a (100번지)change의 x
호출 전10-
함수 진입10100번지 (a의 주소)
*x = 100 실행100100번지
함수 종료 후100(소멸)

swap 함수 (Call by Reference)

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

c
코드 하이라이팅 중…
출력
코드 하이라이팅 중…

동작 과정

main의 a가 100번지, b가 200번지에 있다고 가정하면:

단계main의 a (100번지)main의 b (200번지)*a (100번지 값)*b (200번지 값)
swap 호출 전1119--
swap 진입11191119
t = *a (t=11)11191119
*a = *b19191919
*b = t19111911
swap 종료 후1911--

포인터가 main 변수의 주소를 직접 가리키고 있으므로, *a와 *b를 통해 main의 값이 실제로 교환됩니다.

비교 정리

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

배열을 함수에 전달하면?

C에서 배열 이름 arr은 배열의 첫 번째 칸(arr[0])이 저장된 메모리 주소를 나타냅니다. 이것은 C언어의 특수한 규칙입니다. 따라서 함수에 배열을 전달하면 &를 붙이지 않아도 자동으로 주소가 전달되어, 함수 내에서 배열 요소를 변경하면 원본도 변경됩니다.

c
코드 하이라이팅 중…
출력
코드 하이라이팅 중…
text
코드 하이라이팅 중…
배열은 항상 주소가 전달됩니다
배열을 함수에 전달하면 &를 붙이지 않아도 자동으로 주소가 전달됩니다. 포인터 매개변수(int *a)가 아닌 배열 매개변수(int arr[])로 받아도 동일하게 원본이 변경됩니다.

시험 출제 포인트

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

  1. 매개변수가 int a, int b 형태인지 int *a, int *b 형태인지 확인
  2. int a, int b면 값 복사이므로 원본 변경 불가
  3. 함수 내부에서 교환해도 main의 변수는 그대로
  4. 배열을 전달하면 & 없이도 주소가 전달되어 원본 변경 가능
c
코드 하이라이팅 중…

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

개념설명예시
Call by Value값의 복사본을 전달change(s) → s의 복사본 전달
배열 전달참조(주소)의 복사본 전달, 같은 배열을 가리킴data[0] = "B" → 원본 변경됨
String 재할당참조를 새 객체로 변경, 원본에 영향 없음s = "Z" → 로컬 변수만 변경

Java는 항상 Call by Value

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

java
코드 하이라이팅 중…
출력
코드 하이라이팅 중…
change(a) 호출 시 main의 a(int, 10)가 change의 x로 복사되고, x = 100 실행 후에도 a는 10 그대로인 다이어그램
x는 a의 값 10을 복사한 별도 변수라서, x를 100으로 바꿔도 a는 그대로 10입니다.

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

Call by Value와 Call by Reference
Call by Value는 '값을 복사해서 전달'하는 방식이고, Call by Reference는 '변수의 주소를 전달'하는 방식입니다. Java는 모든 타입에 대해 Call by Value를 사용합니다. 배열·String 같은 참조 타입도 변수에 든 참조값(주소)이 복사될 뿐, 변수 자체의 주소를 넘기는 Call by Reference는 아닙니다.

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

배열은 참조 타입입니다.

참조 타입이란?
변수에 실제 데이터가 직접 들어있는 것이 아니라, 데이터가 있는 곳을 가리키는 화살표(주소)가 들어있는 타입입니다.

배열 {"원본"}처럼 메모리에 실제로 만들어진 데이터 덩어리를 객체라고 합니다.

배열을 매개변수로 전달하면, 주소의 복사본이 전달됩니다. 같은 집 주소가 적힌 메모지를 두 장 만든 것과 같습니다. 복사본이지만 같은 배열 객체를 가리키기 때문에, 어느 쪽에서든 배열의 요소를 수정하면 원본에도 반영됩니다.

java
코드 하이라이팅 중…
출력
코드 하이라이팅 중…

왜 원본이 변경될까?

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

change(data) 호출 시 main의 data 주소100이 change의 data로 복사되어 하나의 String[] 배열을 함께 가리키고, data[0] = 변경됨 실행 후 main에서도 변경됨이 보이는 다이어그램
복사되는 것은 배열의 주소(주소100)입니다. 배열은 하나뿐이라 change에서 [0] 칸을 바꾸면 main에서도 바뀐 값이 보입니다.

String 변수를 재할당하면?

배열은 참조 타입이라 원본이 변경되었습니다. 그런데 참조 타입이라도 하는 행동에 따라 결과가 달라집니다. String도 참조 타입이지만, 변수에 새 값을 대입(재할당)하면 원본에 영향을 주지 않습니다.

java
코드 하이라이팅 중…
출력
코드 하이라이팅 중…
change(s) 호출 시 main의 s 주소300이 change의 s로 복사되고, s = Z 실행 후 change의 s만 Z 객체 주소400으로 바뀌며 main의 s는 B 객체 주소300 그대로인 다이어그램
s = 'Z'는 change의 s가 가리키는 대상만 바꿉니다. main의 s는 그대로 'B'를 가리킵니다.

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

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

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

왼쪽: main과 change의 data가 같은 배열(주소100)을 가리키고 data[0]이 A에서 B로 바뀌어 main에서도 보인다. 오른쪽: s = Z 실행 후 change의 s만 Z 객체(주소400)를 가리키고 main의 s는 B 객체(주소300) 그대로다.
배열 요소 변경은 두 변수가 함께 가리키는 객체의 내용을 바꾸고, 변수 재할당은 change의 변수가 가리키는 대상만 바꿉니다.
핵심 구분: 객체 수정 vs 참조 재할당
data[0] = 'B'는 객체 안의 내용을 수정하므로 원본에 반영됩니다. s = 'Z'는 변수가 가리키는 대상을 바꾸는 것이므로 원본에 영향이 없습니다. 이 차이가 시험에서 가장 중요한 포인트입니다.

정리

전달 방식동작원본 영향예시
기본 타입 (int 등)값 복사없음x = 100 → 원본 유지
배열 요소 수정같은 객체의 내용 수정있음data[0] = "B" → 원본 변경
참조 변수 재할당로컬 변수만 변경없음s = "Z" → 원본 유지
시험 팁
메서드 안에서 배열[인덱스] = 값 형태로 수정하면 원본이 변경되고, 변수 = 새값 형태로 재할당하면 원본은 그대로입니다. 이 패턴만 기억하면 이 유형의 문제를 풀 수 있습니다.

C 배열과 Java 배열의 차이

C언어와 Java에서 배열을 함수에 전달하면 둘 다 원본 배열을 수정할 수 있습니다. 하지만 내부 동작 방식은 다릅니다.

C언어: 배열 이름 = 포인터

C에서 배열 이름은 배열의 첫 번째 요소의 메모리 주소입니다. 배열 이름 자체가 주소이므로, 포인터 연산이 가능합니다. 자세한 내용은 배열 이름은 주소다를 참고하세요.

c
코드 하이라이팅 중…

Java: 배열 변수 = 객체의 참조

Java에서 배열 변수는 힙 메모리에 생성된 배열 객체의 참조(reference)를 저장합니다. 개념적으로 "주소를 담고 있다"고 이해할 수 있지만, C의 포인터와는 다릅니다.

java
코드 하이라이팅 중…

비교

구분C언어Java
배열 변수의 정체첫 번째 요소의 메모리 주소 (포인터)배열 객체의 참조 (reference)
포인터 연산가능 (arr + 1, *(arr + 2))불가능 (컴파일 에러)
주소 직접 확인가능 (printf("%p", arr))불가능
배열 크기 확인직접 추적 필요arr.length로 확인 가능
함수에 전달 시첫 번째 요소의 주소가 전달됨배열 객체의 참조 복사본이 전달됨
함수 안에서 원본 수정가능가능
시험에서는 동일하게 동작합니다
C와 Java 모두 배열을 함수에 전달하면 원본 배열을 수정할 수 있습니다. 시험 풀이에서는 '배열 변수는 주소를 담고 있다'고 이해하면 충분합니다.

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

문제를 불러오는 중이에요.
문제를 불러오는 중이에요.

Footnotes

  1. 매개변수란 함수가 호출될 때 전달받는 값을 담는 변수입니다. void change(int x)에서 x가 매개변수입니다. ↩

  2. 함수가 끝나면 그 함수 안에서 사용하던 매개변수와 지역 변수는 메모리에서 사라집니다. 이것을 소멸이라고 합니다. ↩


메가커피와 함께, 홈페이지 개선에 참여하세요! ☕
혹시 이용에 불편한 점이나 개선이 필요한 부분을 발견하셨나요? 댓글로 알려주시면 더 나은 감자가 될 수 있어요! 🥔 제보해주신 모든 분께 메가커피 기프티콘을 드립니다! (본인 이메일로 댓글 달아주셔야해요~)
후수학습(1개)
  • C언어 포인터의 기초
정처기 감자정처기 감자

정보처리기사 합격
도와줄라고 하는 감자

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매
© 2025 재현기획개발. All rights reserved.
  • 정처기 감자의 시작
  • 업데이트 로그
  • 개인정보 처리방침
  • 이용약관
상호명 : 재현기획개발 / 주소: 서울특별시 영등포구 영등포로 150, 지하1층 108호 L145 가라지(당산동1가, 생각공장 당산) / 대표: 김재현 / 전화: 010-8158-7127 / 통신판매업신고: 제2025-서울영등포-1569호 / 이메일: contact@edugamja.com / 사업자등록번호: 573-51-00999