자바에서는 메소드를 호출할 때 매개변수로 지정한 값을 메소드의 매개변수에 복사해 넘겨준다. 매개변수의 타입이 기본형일 땐 값이 복사되지만, 참조형을 땐 인스턴스의 주소가 복사된다.
기본형 매개변수: 변수의 값을 읽기만 가능
참조형 매개변수: 변수의 값을 읽고 변경 가능
기본형 매개변수 예제)
class Data { int x; }
class PrimitiveParamEx {
public static void main(String[] args) {
Data d = new Data();
d.x = 10;
System.out.println("main() : x = " + d.x);
change(d.x);
System.out.println("After change(d.x)");
System.out.println("main() : x = " + d.x);
}
static void change(int x) { // 기본형 매개변수
x = 1000;
System.out.println("change() : x = " + x);
}
}
--------------------------------
main() : x = 10
change() : x = 1000
After change(d.x)
main() : x = 10
코드를 보면 기본형은 값만 가져오기 때문에 같은 참조변수라도 매개변수의 값에 따라 다른 값이 저장된다.
① change메소드가 호출되면서 d.x가 change메소드의 매개변수 x에 복사
② change메소드에서 x의 값을 1000으로 변경
③ change메소드가 종료되면서 매개변수 x는 스택에서 제거
참조형 매개변수 예제)
class Data { int x; }
class ReferenceParamEx {
public static void main(String[] args) {
Data d = new Data();
d.x = 10;
System.out.println("main() : x = " + d.x);
change(d);
System.out.println("After change(d)");
System.out.println("main() : x = " + d.x);
}
static void change(Data d) { // 참조형 매개변수
d.x = 1000;
System.out.println("change() : x = " + d.x);
}
}
-------------------------------------
main() : x = 10
change() : x = 1000
After change(d)
main() : x = 1000
기본형 매개변수와는 다르게 참조형은 주소를 가져오기 때문에 같은 주소값을 가지고 있는 참조변수가 change 메소드의 매개 변수의 주소를 참조했을 때 함께 값이 변경됐다.
① change 메소드가 호출되면서 참조변수 d의 값(주소)이 매개변수 d에 복사. 이제 매개변수 d에 저장된 주소값으로 x에 접근 가능
② change메소드에서 매개변수 d로 x의 값을 1000으로 변경
③ change 메소드가 종료되면서 매개변수 d는 스택에서 제거
'Java > Basic' 카테고리의 다른 글
생성자(Constructor) (0) | 2021.03.23 |
---|---|
클래스 메소드와 인스턴스 메소드 (1) | 2021.03.19 |
JVM의 메모리 구조 (0) | 2021.03.19 |
객체지향 (0) | 2021.03.03 |
2차원 배열, Arrays클래스 (0) | 2021.02.25 |
댓글