o 기본형 매개변수와 참조형 매개변수
자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다.
매개변수의 타입이 기본형일 때는 기본형 값이 복사되겠지만, 참조형이면 인스턴스의 주소가 복사된다.
메서드의 매개변수를 기본형으로 선언하면 단순히 저장된 값만 얻지만, 참조형으로 선언하면 값이 저장된 곳의 주소를 알 수 있기 때문에 값을 잃어오는 것은 물론 값을 변경할 수 있다.
기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. (read only)
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (read & write)
기본형 매개변수 예제
class Data { int x ;}
public class Thisisjava {
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("change() : x = " + d.x);
}
static void change(int x){ //기본형 매개변수
x = 10000;
System.out.println("change() : x = " + x);
}
}
위 결과를 보면 change 메서드에서 값을 변경했는데도 main 메서드에서는 값이 그대로이다.
단계를 보면 1. change 메서드가 호출되면서 'd.x'가 change 메서드의 매개변수 x에 복사된다.
2. change 메서드에서 x의 값을 1000으로 변경
3. change 메서드가 종료되면서 매개변수 x는 스택에서 제거됨
결론적으로 'd.x'의 값이 변경된 게 아니라 change 메서드의 매개변수 x의 값이 변경된 것이다.
즉, 원본이 아닌 복사본만 변경된 것이라 원본에는 아무런 영향을 미치지 못한다.
이처럼 기본형 매개변수는 변수에 저장된 값만 읽을 수 있을 뿐 변경하지 못한다.
참조형 매개변수 예제
class Data { int x ;}
public class Thisisjava {
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("change() : x = " + d.x);
}
static void change(Data d){ //기본형 매개변수
d.x = 10000;
System.out.println("change() : x = " + d.x);
}
}
기본형 매개변수와 달리 d.x의 값이 변경되었다. 이유는 change 메서드의 매개변수가 참조형이라서 값이 아니라 값이 저장된 주소를 change 메서드에 넘겨주어 값을 읽어오는 것 뿐 아니라 변경이 가능하다.
- 268p
'자바' 카테고리의 다른 글
[JAVA] 예외 처리 (0) | 2023.09.18 |
---|---|
[JAVA] 상속 (0) | 2023.09.15 |
[JAVA] 변수와 메서드 1 (0) | 2023.09.12 |
[JAVA] 클래스와 객체 (0) | 2023.09.12 |
[JAVA] 약수 구하기 알고리즘 (0) | 2023.09.06 |