STATIC 블록
- 클래스가 스태틱 영역에 로드되는 경우 실행되는 블록입니다.
- 처음 메모리에 로딩될때
단 한번
만 실행됩니다.
STATIC 블록의 동작 방식
클래스 로딩과 실행
- 클래스가 스태틱 영역에 배치되는 경우
static 블록
이 실행된다.
public class 동물 {
static {
System.out.println("동물 클래스 레디 온!");
}
}
- 해당 클래스를 메인 메서드에서 사용시
public static void main(String[] args) {
동물 뽀로로 = new 동물();
}
“동물 클래스 레디 온!” 이 콘솔에 출력됨.
코드가 없는 경우 동작
동물
클래스를 사용하는 코드가 없는 경우,static 블록
은 실행되지 않는다.
public static void main(String[] args) {
System.out.println("main 메서드 시작!");
}
“main 메서드 시작!”
사용 가능한 속성 및 메서드
static 멤버만 사용가능한 것
static
블록 에서는 static 멤버 변수나 메서드만 접근가능함.
- 객체가 아직 생성되지 않았기에, 객체 멤버에 접근할 수 없음.
STATIC 의 로딩 시점에 대해 자세하게 파고 들어보자
메인 메서드와 static 블록
main 메서드
의 실행문이 실행된 후 →static 블록
이 실행된다.
public static void main(String[] args) {
System.out.println("main 메서드 시작!");
동물 뽀로로 = new 동물();
}
- “main 메서드 시작이 출력되고”
- “동물 클래스 레디 온!” 이 출력된다.
static 은 단 한번만 실행된다.
public static void main(String[] args) {
System.out.println("main 메서드 시작!");
동물 뽀로로 = new 동물();
동물 피카츄 = new 동물();
}
- 동물 클래스의 인스턴스를 여러개 만들어도,
- 실제로
동물
클래스가 정적 영역에 로드 되는 시점 딱 한번만 해당 블록이 수행된다.
정적 속성 접근의 경우
public static void main(String[] args) {
System.out.println("main 메서드 시작!");
System.out.println(Animal.age);
}
- 정적 속성에 접근하는 경우에도
static 블록
은 실행된다.
- 어쨋든 정적 영역에 클래스가 로드 되어야하기에 무조건 블럭을 탈 수 밖에 없기 때문이다.
클래스의 로딩 조건
3가지 경우
- 클래스의 정적 속성을 사용하는 경우
- 클래스의 정적 메서드를 사용하는 경우
- 클래스의 인스턴스를 최초로 만들 때
메모리 효율성
LAZY-LOADING
- 스태틱 영역도 메모리이기에, 프로그램이 실행되는 경우 모든 클래스를 로딩하지 않습니다
실제로 프로그램이 필요로 할때
로딩합니다- 이는 메모리 사용을 최대한 늦추고, 효율적으로 메모리를 사용하기 위한 하나의 방법입니다
Static 블럭의 실무사용
static
블럭 자체는 사실 자주 사용할 일이 없습니다.
- 하지만, JUnit 에서
@BeforeClass
어노테이션의 경우 이와 유사한 메커니즘을 사용한다고 합니다.
Uploaded by N2T
'자바 > 스프링입문객체지향' 카테고리의 다른 글
[4단원]interface 키워드와 implements 키워드 (0) | 2023.08.31 |
---|---|
[4단원]instanceof 연산자 (0) | 2023.08.29 |
[4단원]final 키워드 (0) | 2023.08.28 |
[4단원]생성자 (0) | 2023.08.28 |
[3단원]참조 변수의 복사 (0) | 2023.08.27 |