자바의 변수에는 두 가지 종류가 있다.
- 기본 타입 변수(Primitive type) : int, double, boolean 등과 같은 기본 데이터 유형, 실제 값(value)을 저장한다.
- 참조 타입 변수(Reference type) : 클래스, 인터페이스, 배열 등의 참조 타입을 가지는 변수, 객체가 저장된 실제 메모리 위치를 가리키는 값이 저장된다.
메서드를 호출할 때 파라미터를 전달하는 방법에는 두 가지가 있다.
- Call by Value (값에 의한 호출)
- Call by Reference (참조에 의한 호출)
자바에서 Call by Reference는 없다. Call by Value만 존재한다.
Call by Reference (참조에 의한 호출)
메서드 호출 시에 파라미터로 변수를 직접 전달하는 데, 메서드 내부에서 파라미터 수정이 필요한 경우 원본에도 동일하게 적용된다. 하지만 자바에는 이와 같은 방법이 적용되지 않는다.
Call by Value (값에 의한 호출) → 자바에서 파라미터를 전달하는 방식
메서드 호출 시 파라미터로 변수의 '값'을 복사하여 전달한다. 파라미터에 대한 수정이 발생할 경우 원본에는 반영되지 않고 값만 복사한다.
public class CallByValue {
public static void swap(int x, int y){
int temp = x;
x = y;
y = temp;
}
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(" 호출 전 : a = " + a + " b = " + b);
swap(a,b);
System.out.println(" 호출 후 : a = " + a + " b = " + b);
}
}
swap 메서드는 두 개의 변수를 파라미터 인자로 받았고, main 메서드에서 swap(a, b) 호출을 했다. 이때, a와 b의 값을 변경하는 것이 아니라 a와 b의 값의 복사본을 변경한 것이다.
다음과 같이 출력된다.
호출 전 : a = 10 b = 20
호출 후 : a = 10 b = 20
'The Java Programming' 책의 저자인 제임스 고슬링이 다음과 같이 말했다.
Some people will say incorrectly that objects are passed "by referece." In programming language design, the term pass by reference properly means that when an argument is passed to a function, the invoked function gets a reference to the original value, not a copy of its value. If the function modifies its parameter, the value in the calling code will be changed because the argument and parameter use the same slot in memory.
The Java programming language does not pass objects by reference; it passes object references by value.
어떤 사람들은 객체가 참조로 전달(by reference)된다고 잘못 말한다. 프로그래밍 언어 설계에서 참조 전달(pass by reference)은 인수가 함수에 전달될 때 그 값의 복사본이 아니라 원래 값의 참조를 전달받음을 의미한다. 만약 함수가 전달받은 매개변수를 변경하면 함수를 호출한 코드도 동일한 메모리 슬롯을 사용하므로 값이 변경되어야 한다.
자바는 객체를 참조로 전달하지 않는다. 대신 객체에 대한 참조를 값으로 전달한다.
참고
https://bcp0109.tistory.com/360
Java 의 Call by Value, Call by Reference
Overview Java 에서 메서드를 호출 시 파라미터를 전달하는 방법에 대해 알아봅니다. 순서는 다음과 같이 진행합니다. Call by Value, Call by Reference 차이 Java 에서의 파라미터 전달 방법 JVM 메모리에 변
bcp0109.tistory.com
https://mangkyu.tistory.com/322
[Java] 자바는 Call By Value(Pass By Value) 방식으로만 동작한다
1. 자바는 Call By Value(Pass By Value) 방식으로만 동작한다 [ 자바 개발자 제임스 고슬링의 얘기 ] 아래의 내용은 자바 언어의 창시자인 제임스 고슬링(James Gosling)이 집필한 “The Java Programming Language”
mangkyu.tistory.com
https://loosie.tistory.com/486
[Java] 자바가 언제나 Call By Value인 이유 (Call By Reference X)
Intro 시작하기 앞서 CS이론에서는 "Call by value"와 "Call by reference"를 구분하는 것은 더 이상 쓸모없다고 한다. 왜냐하면 "Call By Reference"은 이제 트렌드에 뒤쳐진 기술로 선호도 굉장히 낮아져 최신
loosie.tistory.com
https://stackoverflow.com/questions/6029012/how-to-do-call-by-reference-in-java
How to do "call by reference" in Java?
How to do "call by reference" in Java? (Assume that we are using that term in the same way that it has been used in peer-reviewed CS literature since the 1960's; see this Wikipedia page ...
stackoverflow.com
'Java' 카테고리의 다른 글
[Java] equals()와 hashCode() 메서드 알아보기 (1) | 2024.05.15 |
---|---|
[Java] JVM 메모리 구조 및 실행 단계 (0) | 2024.05.09 |