: 밑이 막힌 상자. 위에 차곡차곡 쌓인다.
: 메소드 수행에 필요한 메모리가 제공된 공간
main
실행println
실행 / main
대기main
실행: READ only = 변수의 값을 읽기만 할 수 있다.
class Data1 {
int x;
}
public class Ex6_6 {
public static void main(String[] args) {
// 기본형 매개변수(Primitive Parameter)
Data1 d = new Data1();
d.x = 10;
System.out.println("main() x = "+d.x); // 10
change(d.x);
//static 메소드이므로 따로 객체생성 필요없다.
System.out.println("AfterChange(d.x)");
System.out.println("main() x = "+d.x); // 10
}
static void change(int x) {
x = 1000; //지역변수x를 바꾼 거임
System.out.println("change() x = "+x); // 1000
}
}
main() x = 10
change() x = 1000
AfterChange(d.x)
main() x = 10
: read & write = 변수의 값을 읽고 변경할 수 있다.
class Data2 {
int x;
}
public class Ex6_7 {
public static void main(String[] args) {
// 참조형 매개변수(Reference Parameter)
Data2 d = new Data2();
d.x = 10;
System.out.println("main() x = "+d.x); // 10
change(d); //주소 0x100이 들어감
System.out.println("AfterChange(d)");
System.out.println("main() x = "+d.x); // 1000
}
static void change(Data2 d) { //0x100 -> 같은 걸 가리키게 된다!
d.x = 1000; //change의 지역변수d가 가리키는 x변경
System.out.println("change() x = "+d.x); // 1000
}
}
main() x = 10
change() x = 1000
AfterChange(d)
main() x = 1000
✨✨✨ 두 예제를 복습 계속 하자. 차이가 분명히 있다.
💕 Data d = new Data();
: 생성된 인스턴스의 주소가 참조변수 d
에 저장된다.
💕 d.x = 10;
: 참조변수 d
가 가리키고 있는(참조하고 있는) 인스턴스의 멤버변수 x
에 10을 저장한다.
✨change(d.x);
: change메소드에 매개변수로 참조변수 d
가 가리키고 있는(참조하고 있는) 인스턴스의 멤버변수 x(d.x)
의 값을 넘겨준다.
: d.x
의 값인 10이 change메소드의 매개변수 (int) x
에 복사된다.
->
change(d);
참조변수 d
를 넘겨준다.참조변수 d
의 값인 Data인스턴스 주소가 change메소드의 매개변수 (Data) d
에 복사된다.->
change메소드 안
에서 d.x = 1000;
참조변수 d
가 가리키고 있는 인스턴스의 멤버변수 x
에 1000을 저장한다.내일 다시
코드를 보면서 그림그려보자
class Data3 {
int x;
}
public class Ex6_8 {
public static void main(String[] args) {
// 참조형 매개변수와 참조형 반환타입
Data3 d = new Data3();
// 1. 인스턴스 생성. main 메소드의 지역변수 d 생성.
// 2. 참조변수 d에 인스턴스의 주소(0x100) 저장
d.x = 10;
// 3. 참조변수 d가 가리키는 인스턴스의 멤버변수 x에 10 저장.
Data3 d2 = copy(d);
// 4. main 메소드의 지역변수 d2 생성.
// *****copy()메소드 호출!!!!실행!!!
// 5. 참조변수 d의 값인 인스턴스의 주소(0x100)를 copy 메소드의 매개변수로 넣기.
// 11. 지역변수이자 참조변수 d2에 tmp(0x200) 저장-> d2의 값은 인스턴스의 주소(0x200)
// 12. copy 메소드 종료, copy의 지역변수인 tmp, d 사라짐
System.out.println("d.x = "+d.x); // 13. d.x == 10 출력
System.out.println("d2.x = "+d2.x); // 14. d2.x== 200 출력
}
static Data3 copy(Data3 d) {
// 6. copy 메소드의 지역변수 d에 넘겨받은 인스턴스의 주소(0x100) 받음
Data3 tmp = new Data3(); // 7. 새 객체 tmp 생성. copy 메소드의 지역변수 tmp.
// 8. copy 메소드의 지역변수이자 참조변수 tmp는 인스턴스의 주소값(0x200:새 객체이므로)을 저장
tmp.x = 20 * d.x;
// 9. 참조변수 tmp가 가리키는 인스턴스의 멤버변수 x에 d.x의 값인 10에 20을 곱해서 복사
// -> tmp.x == 200
return tmp;
// 10. 반환타입은 Data3타입 or 참조형으로 같은 타입인 tmp의 값인 주소(0x200) 반환
}
}
d.x = 10
d2.x = 200
static
메소드는 ✨객체 생성 없이 호출 가능하다.public class Ex6_8 {
public static void main(String[] args) {
Data3 d = new Data3();
d.x = 10;
***Ex6_8 e = new Ex6_8(); //객체생성
Data3 d2 = **e.**copy(d); //참조변수
...