[Java] 김영한의 실전 자바 - 기본편 섹션7,8 자바 메모리 구조와 static, final
○ 섹션 7 자바 메모리 구조와 static
◼️메모리 구조
- 메서드 영역(Method Area): 클래스 정보 보관. 프로그램 실행 공통 데이터 관리 (static, 상수)
- 스택 영역(Stack Area): 메서드 실행때마다 하나의 스택 프레임이 쌓인다. (쓰레드별 실행 스택 생성)
- 힙 영역(Heap Area): 객체 인스턴스, 배열이 생성되는 영역. 참조X객체는 GC에 의해 제거
◼️static
- static이 붙은 멤버 변수는 메서드 영역에서 관리한다.
- static이 붙은 멤버 변수: 클래스 변수 / 정적 변수 / static 변수, JVM 로딩 ~ 종료 생명주기를 가짐
- 정적 변수에 접근할 때는 클래스를 통해서 접근하자.
◼️변수와 생명주기
- 지역변수(매개변수 포함): 스택 영역 스택 프레임 안에 보관. 생존 주기 짧음
- 인스턴스 변수: 힙 영역 사용.GC 발생 전까지생존
- 클래스 변수: 메서드 영역의 static 영역에 보관되는 변수 JVM에 로딩~종료
◼️static 메서드
- static 이 붙은 멤버 메서드. 클래스 메서드, 정적 메서드로도 부름
- 클래스 내부의 기능을 사용할 때, 정적 메서드는 static 이 붙은 정적 메서드나 정적 변수만 사용 가능
- 인스턴스는 모든 곳에서 static호출 가능
- 객체 생성이 필요 없이 메서드의 호출만으로 필요한 기능을 수행할 때 주로 사용
○ 섹션 8 final
◼️final
- final은 지역변수 최초 한번 할당 가능, 이후 값 변경 시 컴파일 오류
생성자 초기화
//final 필드 - 생성자 초기화
public class ConstructInit {
final int value;
public ConstructInit(int value) {
this.value = value;
}
}
필드 초기화
//final 필드 - 필드 초기화
public class FieldInit {
static final int CONST_VALUE = 10; // 단하나 존재
final int value = 10; // 모든 인스턴스가 같은 값 사용->메모리 낭비
}
위 주석처럼 필드 초기화는 메모리낭비로 이어질 가능성이 있으므로, final + 필드 초기화를 사용하는 경우 static을 붙여서 사용하는 것이 효과적이다.
◼️상수
- 단 하나만 존재하는 변하지 않는 고정 값. static final 키워드 사용.
- 상수는 런타임에 변경할 수 없다.
- 상수는 보통 public을 자주 사용한다. (특정 위치만 사용시 다른 접근 제어자를 사용하면 된다.)
- final 을 기본형 변수에 사용하면 값을 변경할 수 없다. final 을 참조형 변수에 사용하면 참조값을 변경할 수 없다.
public class Data {
public int value;
}
public class FinalRefMain {
public static void main(String[] args) {
final Data data = new Data();
//data = new Data(); //final 변경 불가 컴파일 오류
//참조 대상의 값은 변경 가능
data.value = 10;
System.out.println(data.value);
data.value = 20;
System.out.println(data.value);
}
}
위를 보면, data 에 final이 붙어 참조값 변경이 되지않지만(다른 객체 참조 불가), Data.value는 final이 아니므로 값 변경이 가능하다.
정리하면 참조형 변수에 final 이 붙으면 참조 대상을 자체를 다른 대상으로 변경하지 못하는 것이지, 참조하는 대상 의 값은 변경할 수 있다.
'Java' 카테고리의 다른 글
[Java의 정석] chapter09 java.lang패키지와 유용한 클래스 - 요약정리 (0) | 2024.05.05 |
---|---|
[Java] 김영한의 실전 자바 - 기본편 섹션9,10 상속,다형성 (0) | 2024.04.24 |
[Java의 정석] chapter06 객체지향 프로그래밍 II - 요약정리 (0) | 2024.04.15 |
[Java] 김영한의 실전 자바 - 기본편 섹션5,6 패키지, 접근 제어자 (0) | 2024.04.15 |
[Java의 정석] chapter06 객체지향 프로그래밍 I - 요약정리 (0) | 2024.04.11 |