TIL
2024_12_26 TIL
hi_i
2024. 12. 26. 22:47
오늘의 할 일
- Quiz 풀기
- "자바의 정석" 객체지향 (JVM메모리구조~ 기본/참조형 매개변수)
JVM 메모리 구조
JVM(Java Virtual Machine) - Java가 OS환경에 영향을 받지 않고 실행시켜 주는 가상 환경.
- 메서드 영역(Method area) : 프로그램 실행 중 클래스가 사용되면 JVM은 해당클래스를 분석하여 클래스에 대한 정보들을 해당 영역에 저장한다. 동시에 클래스 변수(Class Variable)도 함께 생성된다.
- 힙 영역(Heap) : 인스턴스가 생성되는 공간. 인스턴스 변수(Instance variable)도 함께 생성된다.
- 호출스택(Call Stack) : 메서드가 작업에 필요한 공간을 제공, 메서드가 작업을 수행하는 동안 변수들과, 중간 결과 등을 저장하였다가 메서드가 종료되면 할당되었던 공간은 반환되어 비워진다.
각 메서드를 위한 메모리 공간은 구별되며 메서드가 다른 메서드를 호출하면 이는 Stack 구조로 쌓이게 된다(FILO)
기본형/ 참조형 매개변수
- 기본형 매개변수 : 값을 읽어오는 것만 가능 (매개변수로 넘어올때 값을 복사)
- 참조형 매개변수 : 값을 읽고/쓰는 것 가능(매개변수로 넘어올때 값의 주소값을 복사)
기본형 매개변수
//2024_12_26 기본형 메서드
//
package class1.Test;
class Data{int x;}
public class Exam {
public static void main(String[] args) {
// Data타입의 d객체 생성
Data d = new Data();
// x의 10 할당
d.x = 10;
//change() 사용이후 원래의 d.x 값에 변동있는지 확인하는 과정.
//현재 change는 기본형(int)형이기 때문에 매개변수로 활용되는 int x의 값은
// 복사가 되어 활용됨
System.out.println(d.x);
change(d.x);
System.out.println(d.x);
}
static void change(int x){
//복사해온 x의 값이기때문에 메서드 내에서 값을 변경시켜도
//복사된 값이 변경되는 것이므로 원래의값(d.x)의 값은 변화 X
x = 1000;
System.out.println(x);
}
}
참조형 매개변수
package class1.Test;
public class Exam2 {
public static void main(String[] args) {
// Data타입의 d객체 생성
Data d = new Data();
// x의 10 할당
d.x = 10;
//change() 실행 전과 후의 값 비교 과정
System.out.println(d.x);
change(d);
System.out.println(d.x);
}
// change는 매개변수로 Data타입을 받음
// Data타입은 기본형에 포함이 되지 않기때문에 참조형으로 분류
static void change(Data d){
//복사된 것은 값이 아닌 d.x가 가르키는 주소값을 받아왔기때문에
//원래 d.x와 메서드 내의 d.x는 같은 주소값을 가짐.
//메서드 내에서 값을 바꾸면 원래 d.x의 값도 같이 바뀜.
d.x = 1000;
System.out.println(d.x);
}
}
# 위의 코드에서 change() 는 매개변수로 Data 타입을 받아옴. d는 Data타입으로 생성된 객체 이므로 change의 매개변수로 입력할 수 있다. ( 타입의 일치)
# 참조형 매개변수는 메서드 실행이 종료되면 메모리에서 메서드에 대한 내용이 지워지기 때문에 값을 반환(main에서 사용) 하고 싶다면 새로운 객체에 반환되는 주소값을 할당해 주어야한다.