2025.03.08 - [Core Java/Chapter 4] - 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.4 정적 필드와 메소드
코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.4 정적 필드와 메소드
2025.03.08 - [Core Java/Chapter 4] - 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.3 자신만의 클래스 정의하기 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.3 자신만의 클래스 정의하기2025.03.08 - [Core Java/Chapter 4] - 코
choosla.tistory.com
[ 자바의 메소드 파라미터 전달 방식 (Call by Value vs Reference) ]
4.5 메소드 매개변수 (Method Parameters)
자바와 같은 프로그래밍 언어에서 메소드(또는 함수)의 매개변수가 호출될 때 어떻게 전달되는지 살펴보자. 이것을 이해하기 위해서는 call by value와 call by reference라는 두 가지 컴퓨터 과학 용어를 먼저 알아야 한다.
- call by value: 호출자(caller)가 제공하는 값 자체를 메소드에게 전달하는 방식이다. 즉, 메소드는 전달받은 값의 복사본을 사용한다.
- call by reference: 호출자가 제공하는 변수의 ‘주소값’을 메소드에게 전달하는 방식이다. 즉, 메소드는 원본 변수(메모리 주소)에 직접 접근하여 그 값을 수정할 수 있다.
call by value로 전달된 변수는 복사본이 넘어가기 때문에 원본에 영향을 줄 수 없고, call by reference 방식이라면 메소드 내부에서 원본 변수를 직접 수정할 수 있다.
자바의 메소드 매개변수 전달 방식
자바 언어는 항상 call by value 방식을 사용한다. 메소드는 매개변수로 넘어온 값을 복사해서 사용하기 때문에, 원본 변수 자체를 메소드가 수정할 수 없다.
예를 들어 아래 코드를 보자.
double percent = 10;
harry.raiseSalary(percent);
위 코드에서 raiseSalary 메소드를 호출해도, 메소드가 어떻게 구현되어 있든 상관없이 percent 변수 자체는 여전히 10인 상태를 유지한다. 왜냐하면 자바에서는 call by value 방식을 사용하기 때문에, raiseSalary 메소드가 받은 것은 percent 값의 복사본(10)일 뿐이다.
기본 타입에 대한 예시
public static void tripleValue(double x) // 작동하지 않는다.
{
x = x * 3;
}
위 메소드는 x 값을 세 배로 만들지만, 매개변수 x는 호출 시 전달된 원본의 복사본이므로 원본 변수에는 전혀 영향을 주지 않는다. 실제 호출 예시는 다음과 같다.
double percent = 10;
tripleValue(percent);
- 메소드가 실행되면
x는percent값(10)의 복사본으로 초기화됨. - 메소드 내부에서
x가 30이 되지만, 이는 복사본에만 해당. - 메소드가 종료되면
x는 사라지고,percent는 여전히 10.
결국 percent 값 자체는 변화하지 않는다.
객체 참조의 경우
자바에서 메소드 파라미터는 크게 두 가지 유형으로 나눌 수 있다.
- 기본 타입 (숫자,
boolean등) - 객체 참조 (클래스 타입 등)
위에서 살펴보았듯이, 기본 타입 매개변수의 원본 값을 변경할 수는 없다. 하지만 객체 참조의 경우, 객체가 저장된 주소값(참조)을 복사해서 넘기므로, 그 참조가 가리키는 객체 자체의 상태를 수정할 수 있다.
예를 들어, Employee 객체의 급여를 세 배로 인상하는 메소드를 작성해 보자.
public static void tripleSalary(Employee x) {
x.raiseSalary(200); // 급여를 200% 인상 -> 결과적으로 3배가 됨
}
아래와 같이 호출한다고 가정하면,
Employee harry = new Employee(...);
tripleSalary(harry);
x는harry가 가지고 있는 객체 참조(주소)의 복사본으로 초기화됨.x.raiseSalary(200)를 호출하면,x와harry가 동일한Employee객체를 참조하고 있으므로 해당 객체의 급여가 3배로 인상됨.- 메소드가 종료되면
x는 사라지지만,harry가 참조하는 객체는 이미 수정된 상태를 유지.

즉, 객체의 상태는 수정 가능하지만, 원본 변수(harry)가 다른 객체를 가리키도록 만드는 것은 불가능하다.
자바는 call by reference를 지원하지 않는다
자바가 객체 참조를 매개변수로 넘길 때, 이를 “자바는 call by reference를 사용한다”고 오해하기 쉽다. 그러나 자바는 언제나 call by value 방식이다. 다만, 값으로 넘어가는 것이 객체의 주소이기 때문에, 객체 내부 상태가 수정되는 효과가 나타날 뿐이다.
swap 메소드 예시
아래 예시는 두 Employee 객체를 서로 교환(swap)하는 메소드를 작성해 보려는 상황이다.
public static void swap(Employee x, Employee y) {
Employee tmp = x;
x = y;
y = tmp;
}
이 메소드를 다음과 같이 호출한다고 해보자.
var a = new Employee("Alice", ...);
var b = new Employee("Bob", ...);
swap(a, b);

만약 자바가 진짜 call by reference를 사용했다면 a와 b의 값이 바뀌어야 한다. 하지만 실제로는 바뀌지 않는다.
이는 x와 y가 a와 b의 객체 참조를 복사해 온 것이기 때문이다. swap 메소드 내부에서는 x와 y가 가리키는 객체 참조를 교환할 뿐, 원본 변수 a와 b는 아무런 영향을 받지 않는다.
정리: 자바에서 메소드 매개변수로 할 수 있는 것과 없는 것
- 할 수 없는 것(기본 타입 변경): 기본 타입(숫자,
boolean등) 매개변수를 변경해도 원본 변수에 영향을 줄 수 없다. - 할 수 있는 것(객체 상태 변경): 객체 매개변수라면, 객체의 내부 상태를 변경할 수 있다(같은 객체를 참조하므로).
- 할 수 없는 것(참조 변경): 메소드 내부에서 파라미터를 다른 객체로 가리키도록 변경해도, 원본 변수는 그대로다.
즉, 자바에서는 매개변수로 값을 넘긴다. 기본 타입이면 값(예: 10) 자체가 복사되고, 객체 타입이면 객체의 주소값이 복사되어 전달된다.
2025.03.08 - [Core Java/Chapter 4] - 4.6 객체 생성
4.6 객체 생성
4.6 객체 생성(Object Construction)객체(object)가 생성될 때, 자바(Java)에서는 다양한 방법으로 필드 초기화와 생성자 호출이 이루어진다. 어떤 경우든 객체가 만들어질 때 내부 상태가 어떻게 결정되는
choosla.tistory.com
'Core Java > Chapter 4' 카테고리의 다른 글
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.7 레코드(Records) (0) | 2025.03.08 |
|---|---|
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.6 객체 생성 (0) | 2025.03.08 |
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.4 정적 필드와 메소드 (0) | 2025.03.08 |
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.3 자신만의 클래스 정의하기 (0) | 2025.03.08 |
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.2 표준 라이브러리 클래스 사용하기 (0) | 2025.03.08 |