반응형
이런 구조임
여기서 왜 먼저 써져있는 Data부터 시작하지 않을까?
여기선 클래스 파일 이 두개 만들어지는데, (컴파일)
이 파일명이 InverVari이므로 동일한 InterVari를 먼저 실행하니까 (컴파일된 파일 기준 실행) InterVari.java파일 실행. 아예 다른파일인 Data클래스는 부르기 전까지 실행되지 않는다.
package e_oop;
class Data{
int x;
}
public class InterVari {
public static void main(String[] args) {
//1. Data클래스의 객체를 만들어 주세요 변수명 d1
Data d1 = new Data();
//2. d1의x값을 10으로 변경해주세요
d1.x = 10;
//3. d1의 x값을 출력해주세요
System.out.println("3번" + d1.x);
//4. change메서드를 호출해 주세요, 인자값: d1의 x값
change(d1.x);
//4.5 d1의 x값을 출력해 주세요
System.out.println("4.5번: " + d1.x);
//5. Data클래스의 객체를 만들어 주세요 변수명은 d2
Data d2 = new Data();
//6. d2의 x값을 10으로 변경 해 주세요
d2.x = 10;
//7. d2의 x값을 출력해 주세요
System.out.println("7번:" + d2.x);
//8. change 메서드를 호출해 주세요. 인자값 : d2
change(d2);
//9. d2의 x값을 출력해주세요
System.out.println("9번" + d2.x);
}
static void change(int x){
x = 1000;
System.out.println("change기본형 : "+x);
}
static void change(Data d1){
d1.x = 1000;
System.out.println("change참조형: "+d1.x);
}
}
public class InterVari
메소드 아넬아에 인터버리 클래스가 로드되고, 인터버리의 클래스변수와 클래스 메소드 (main())이 함께 로드된다
public static void main(String[] args) {
메인메소드가 콜스택에 로드된다
Data d1 = new Data();
대입연산자니까 왼쪽부터, 클래스가 일단 메소드아레아에 있는지 확인하는데 없다. 데이터클래스를 메소드아레아에 로드시키고 클래스변수나 메소드는 없다.
콜스택에 있는 메인메소드에 d1을 선언한다.
new로 힙에 공간을 만들고, 데이터클래스의 인스턴스를 데려온다. , 인스턴스 변수인 x를 데려오면서 int형이니까 0으로 초기화시킨다. 이제 그 주소값을 콜스택의 메인메소드에 있는 d1에 담는다.
d1.x = 10;
d1을 힙영역에서 찾아서 그의 x값에 10을 대입한다. 0에서 10이 되었다.
System.out.println("3번" + d1.x);
출력문은 괄호먼저 하는데, 힙영역의 d1에 x값을 출력한다. 10으로 변경됐었기때문에 출력은 [3번 10] 이 된다
change(d1.x);
콜스택에 change(int x)를 쌓는다. 힙영역의 d1에 가서 x를 가져오는데, 10이 담겨있기때문에 10을 인자값으로 change()에 대입하고, x = 1000이기 때문에 x는 1000이 된다. 그 x를 출력하면 콘솔창에 [change기본형: 1000] 이 출력된다.
System.out.println("4.5번: " + d1.x);
출력문은 괄호 먼저니까 힙 영역의 d1 인스턴스에 찾아가서 x값을 출력한다.
x에는 10이 있으므로 4.5번 : 10이 출력된다
Data d2 = new Data();
반응형
'basicJAVA > 5. Oop' 카테고리의 다른 글
201023 재귀호출, 매서드 오버로딩 (0) | 2020.10.23 |
---|---|
201023 매서드의 종류, 클래스멤버와 인스턴스 멤버간 참조호출 (0) | 2020.10.23 |
201022 MyMathTest (0) | 2020.10.22 |
201022 METHOD (0) | 2020.10.22 |
20201022 CardTest (0) | 2020.10.22 |