기본형 매개변수
class Data {int x;}
class Ex6_6{
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); //main() : x 10
}
static void change(int x){
x = 1000;
System.out.println("change() : x = " + x); //change() : x = 1000
}
}
기본형 매개변수는 변수값을 읽기만 가능하다(read only)
자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다.
- change 메서드가 호출되면서 d.x가 change 메서드의 매개변수 x에 복사됨
- change 메서드에서 x의 값을 1000으로 변경
- change 메서드가 종료되면서 매개변수 x는 스택에서 제거됨
d.x의 값이 변경된것이 아니라 change 메서드의 매개변수 x의 값이 변경된 것이다. 그래서 main의 d.x값이 변경되지 않은 것이다.
참조형 매개변수
class Data2 { int x;}
class Ex6_7{
public static void main(String[] args){
Data2 d = new Data2();
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(Data2 d ){
d.x = 1000;
System.out.println("change() : x = " + d.x):
}
}
참조형 매개변수는 변수의 값을 읽고 변경할 수 있다.(read & write)
참조형으로 선언하면 값이 저장된 곳의 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경하는것도 가능하다.
- change 메서드가 호출되면서 참조변수 d의 값(주소)이 매개변수 d에 복사됨. 이제 매개변수 d에 저장된 주소값으로 x에 접근이 가능
- change메서드에서 매개변수 d로 x의 값을 1000으로 변경
- change메서드가 종료되면서 매개변수 d는 스택에서 제거됨
참조형 반환타입
Class Data3 { int x; }
class Ex6_8 {
public static void main(String[] args){
Data3 d = new Data3();
d.x = 10;
Data3 d2 = copy(d);
System.out.println("d.x = " + d.x);
System.out.println("d2.x = " + d2.x);
}
static Data3 copy(Data3 d) {
Data3 tmp = new Data3();
tmp.x = d.x;
return tmp;
}
}
- copy(d) 를 통해 인스턴스 d의 주소값을 참조한다.
- tmp.x = d.x 를 통해 d.x의 값을 tmp.x의 값으로 복사한다.
- tmp값을 main에 return한다. - > d2 = tmp
- d2.x = 10이다. ( d.x와 값은 같지만 참조하는 주소는 다르다.)
'자바' 카테고리의 다른 글
[자바] Iterator, ListIterator 개념 및 사용법 (0) | 2023.01.28 |
---|---|
[자바] static 메모리 (0) | 2023.01.20 |
[자바] 힙(heap)과 스택(stack) 메모리 구조 (0) | 2023.01.18 |
[자바] BufferedReader / StringTokenizer (0) | 2023.01.15 |
[자바] Comparable, Comparator (0) | 2023.01.13 |