자바(Java)는 프로그래밍 언어 중 하나로 객체 지향 프로그래밍(Object-Oriented Programming, OOP)을 지원합니다. 자바에서 메서드에 인수를 전달하는 방식에 대한 논쟁은 꽤 오래되었습니다. 이 블로그 글에서는 자바가 Call by Value인지 Call by Reference인지에 대해 자세히 살펴보겠습니다.
- Call by Value와 Call by Reference의 개념
먼저 이 두 용어의 개념을 이해해야 합니다.
- Call by Value: 메서드에 인수를 전달할 때 값(value)만 전달되고, 원래 변수의 주소가 전달되지 않습니다. 이 경우 메서드 내에서 인수의 값이 변경되더라도 원래 변수의 값은 변하지 않습니다.
- Call by Reference: 메서드에 인수를 전달할 때 참조(reference)를 전달하게 됩니다. 즉, 원래 변수의 주소가 전달되어 메서드 내에서 인수의 값이 변경되면 원래 변수의 값도 함께 변경됩니다.
2. Java에서 메서드 호출 방식
자바에서는 기본 데이터 타입(Primitive Data Types)과 객체 데이터 타입(Objects)이 존재합니다. 기본 데이터 타입에는 int, float, char 등이 있고, 객체 데이터 타입에는 String, List, 사용자 정의 클래스 등이 포함됩니다.
자바는 기본적으로 Call by Value 방식을 사용합니다. 하지만 여기서 혼동이 발생할 수 있는데, 객체의 경우에는 참조 변수의 값(즉, 객체의 메모리 주소)이 전달되기 때문에 Call by Reference처럼 보일 수 있습니다. 하지만 결국 전달되는 것은 객체의 주소값이고, 정확히 말하면 원본 객체의 참조 주소를 사용하는 것이 아닌 복사본 참조 주소를 사용하는 것이기 때문에 원초적으로는 Call by Value 방식을 따르는 것입니다.
3. 예제 코드
public class CallByValueExample {
public static void main(String[] args) {
int a = 10;
System.out.println("Before: " + a); // 출력: Before: 10
changePrimitive(a);
System.out.println("After: " + a); // 출력: After: 10
StringBuilder sb = new StringBuilder("Hello");
System.out.println("Before: " + sb); // 출력: Before: Hello
changeObject(sb);
System.out.println("After: " + sb); // 출력: After: Hello, World!
}
public static void changePrimitive(int number) {
number += 10;
}
public static void changeObject(StringBuilder sb) {
sb.append(", World!");
}
}
위 예제에서는 기본 데이터 타입인 int와 객체 데이터 타입인 StringBuilder를 사용합니다. changePrimitive 메서드는 int 값을 변경하려고 하려고 시도하지만, 메서드 호출이 끝나면 원래 값이 유지됩니다. 이것은 Call by Value 방식으로 인해 메서드 내에서 값이 변경되더라도 원본 변수의 값은 변하지 않기 때문입니다.
반면에 changeObject 메서드는 StringBuilder 객체를 전달받습니다. 여기서 객체의 참조 변수 값(즉, 메모리 주소)이 전달되기 때문에, 메서드 내에서 객체를 수정하면 원본 객체에도 영향을 줍니다. 그러나 이것도 결국 참조 변수의 값이 전달된 것이므로 Call by Value 방식입니다.
이 예제를 통해 자바는 기본 데이터 타입과 객체 데이터 타입 모두 Call by Value 방식으로 동작함을 알 수 있습니다. 그러나 객체의 경우 참조 변수의 값(메모리 주소)이 전달되기 때문에, 메서드 내에서 객체를 수정하면 원본 객체에도 영향을 미칩니다. 이 점 때문에 Call by Reference처럼 보이지만, 실제로는 Call by Value 방식을 따릅니다.
결론: 자바는 Call by Value인가, Call by Reference인가?
자바는 기본적으로 Call by Value 방식을 사용합니다. 기본 데이터 타입의 경우 값 자체가 전달되며, 객체 데이터 타입의 경우 참조 변수의 값(메모리 주소)이 전달됩니다. 따라서 객체 데이터 타입의 경우 메서드 내에서 객체를 수정하면 원본 객체에도 영향을 미치지만, 이것은 여전히 Call by Value 방식을 따르는 것입니다.
이러한 이해를 바탕으로 자바 프로그래밍을 할 때 메서드 호출 및 인수 전달 방식에 대한 혼동을 줄일 수 있습니다. 이제 자바에서 메서드 호출이 어떻게 동작하는지 명확하게 이해하고, 코드를 작성할 때 이를 고려하시기 바랍니다.
'Java' 카테고리의 다른 글
자바 11과 17 버전의 차이점 (0) | 2023.05.03 |
---|---|
가비지 컬렉션(Garbage Collection) 이해하기 (0) | 2023.05.02 |
JVM(Java Virtual Machine) 이해하기 - 동작 원리 및 구성 요소 (0) | 2023.04.30 |
ClassNotFoundException과 NoClassDefFoundError (0) | 2018.03.22 |
자바 소켓 프로그래밍 예제(채팅 프로그램) (1) | 2018.03.08 |