[4단원]클래스 생성 시의 실행 블록, static 블록

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가지 경우

  1. 클래스의 정적 속성을 사용하는 경우
  1. 클래스의 정적 메서드를 사용하는 경우
  1. 클래스의 인스턴스를 최초로 만들 때

메모리 효율성

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