JVM 메모리구조
메서드 영역 - 프로그램 실행 중 클래스가 사용되면 JVM은 해당 클래스의 클래스파일을 읽어서 클래스에 대한 정보(클래스 데이터)(클래스변수)를 저장한다.
힙 영역 - 인스턴스가 생성되는 공간(인스턴스 변수)
호출스택(call , execution) - 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면 메모리가 할당되며, 이 메모리는 메서드의 지역변수, 매개변수 등 중간결과들을 저장하는데 사용되고 끝나면 할당된 메모리 공간은 반환되어 지워진다.
호출스택은 먼저 호출된 메서드가 맨 아래에 위치하게된다.
즉 다음 코드를 보면
firstMethod();
}
static void firstMethod() {
secondMethod();
}
static void secondMethod() {
System.out.println("second");
}
main -> firstMethod -> secondMethod -> seconMethod종료 -> firstMethod종료 -> main종료 순으로 진행이 되게된다.
기본형 매개변수와 참조형 매개변수
참조형 매개변수의 경우에는 인스턴스의 주소가 복사된다.
기본형 매개변수 -> 변수의 값을 읽기만 할 수 있다.
참조형 매개변수 -> 변수의 값을 읽고 변경할 수 있다.
기본형 매개변수의 변수값을 변경 시도한것이다.
Data1 d = new Data1();
d.x = 10;
System.out.println("main" + d.x);
change(d.x);
System.out.println("after change");
System.out.println("main" +d.x);
}
static void change(int x){
x=1000;
System.out.println("change" + x);
}
}
class Data1 {
int x;
}
d.x의값이 변경된 것이 아니라 복사본이 변경된 것이라 원본에는 영향을 미치지 못해 바꾸어도 10이 출력된다.
참조형 매개변수의 변수값을 변경 시도한 것이다.
Data1 d = new Data1();
d.x = 10;
System.out.println("main" + d.x);
change(d);
System.out.println("after change");
System.out.println("main" +d.x);
}
static void change(Data1 d){
d.x=1000;
System.out.println("change" + d.x);
}
}
class Data1 {
int x;
}
change메서드의 매개변수가 참조형이라서 값이 아니라 값이 저장된 주소를 change메서드에게 넘겨주었기 때문에 값 변경이 가능해 1000이 출력된다.
참조형 매개변수로 반환값이 없는 메서드 이용 시도
object_oriented r = new object_oriented();
int[] result1 = new int[1];
// System.out.println(result1.length);
r.add(3,5,result1);
System.out.println(result1[0]);
}
void add ( int a, int b, int[] result){
result[0] = a + b;
}
void로 return값이 없지만 참조형 매개변수는 주소를 가르키기 때문에 값이 변경된다.
참조형 반환타입
Data1 d = new Data1();
d.x=10;
Data1 d2 = copy(d);
System.out.println(d.x);
System.out.println(d2.x);
}
static Data1 copy (Data1 d) {
Data1 tmp = new Data1();
tmp.x = d.x;
return tmp;
}
메서드의 return값으로 tmp라는 객체가 제공된다.
copy메서드가 호출되어 종료되면 tmp는 사라지지만 종료되면서 반환된 tmp는 참조변수 d2에 저장되어 d2라는 새로운 객체를 다룰 수 있다. -> 반환타입이 참조형 이라는 것은 메서드가 객체의 주소를 반환한다는 것을 의미한다.
'IT 관련 > JAVA' 카테고리의 다른 글
자바 객체지향언어I (생성자 , 변수의 초기화) (0) | 2022.06.23 |
---|---|
자바 객체지향언어I (재귀, 클래스메서드와 인스턴스메서드, 메서드 오버로딩) (0) | 2022.06.22 |
자바 객체지향언어I ( 인스턴스, 메서드) (0) | 2022.06.17 |
자바 배열(array) (0) | 2022.06.11 |
자바 조건문(if while 등) (0) | 2022.06.06 |