[Java] Static Block 실행 시점
들어가기 전
이번 포스팅에서는 자바에 있는 Static Block이 어떤 시점에 실행이 되는지에 대해 알아보겠습니다.
Static Block은 아래와 같이 코드를 작성해 주시면 됩니다.
public class StaticBlock { static { 구현부 } }
Static Block를 알아보기 전에 Static이 무엇인지에 대해 알아보겠습니다.
Static
자바에서는 Static 키워드를 사용하여 정적 변수, 정적 메서드를 만들 수 있습니다. 이 둘을 묶어서 정적 멤버라고 불립니다.
Static은 JVM 런타임 데이터 영역 중 메서드 영역 또는 Static 영역에 할당이 됩니다.
Static영역에 할당된 값들은 모든 객체가 공유하여 어디서든지 참조할 수 있습니다.
그리고 프로그램이 시작될 때 메모리에 할당이 되는데 Static 영역은 가비지 컬렉터 관리 밖에 존재하여서 프로그램이 종료될 때까지 메모리에 할당된 채로 존재합니다.
그래서 무분별하게 사용할 경우 메모리 문제가 발생할 수 있습니다.
public StaticClass { static String field = "정적 변수"; static void method() { System.out.println("정적 메서드"); } }
Static Block
Static Block는 Static Blcok을 선언한 객체가 Static 영역에 로딩이 되면 실행이 됩니다. 그래서 초기화를 진행할 때 Static Block을 사용하여 초기화를 진행할 수 있습니다.
Static Block 또한 Static이기 때문에 프로그램 시작할 때 Static영역에 할당이 됩니다.
그럼 아래 코드에서 main 메서드가 실행될 때 로그에는 어떤 내용이 있을까요?
public class Basic { public static void main(String[] args) { } } class StaticClass { static { System.out.println("Static class start"); } }
결과는 아무런 내용도 로그에 존재하지 않습니다.
분명히 처음에 설명한 내용 중 프로그램 시작할 때 Static 영역은 메모리 할당이 되고 프로그램 종료될 때까지 유지된다고 설명을 했는데 main 메서드를 실행했는데 왜 로그에는 아무런 내용이 존재하지 않을까요?
이유는 Static 영역 또한 메모리입니다. 메모리는 최대한 늦게 사용을 시작하고 최대한 빨리 반환하는 것이 좋습니다. 그래서 최대한 늦게 로딩함으로써 메모리 사용을 최대한 낮추기 위해서입니다.
그럼 Static Block을 활용하기 위해서는 언제 메모리 할당이 되는지 알아야 활용을 할 수 있으니 메모리에 할당되는 시점에 대해 알아보겠습니다.
Static Block가 메모리에 할당되는 시점
- 클래스를 인스턴화 할 때
- 정적 변수 사용할 때
- 정적 메서드 사용할 때
클래스를 인스턴스화할 때
public class Basic { public static void main(String[] args) { System.out.println("main Method"); StaticClass staticClass = new StaticClass(); } } class StaticClass { static { System.out.println("Static class start"); } }

StaticClass를 인스턴스화하였더니 Static Block에 있는 내용이 실행이 되었습니다.
그럼 만약 StaticClass 클래스를 여러 인스턴스를 만들면 어떻게 되는지 살펴보겠습니다.
public class Basic { public static void main(String[] args) { System.out.println("main Method"); StaticClass staticClass1 = new StaticClass(); StaticClass staticClass2 = new StaticClass(); } } class StaticClass { static { System.out.println("Static class start"); } }

결과는 한 번만 실행이 됩니다.
정적 변수를 사용할 때
public class Basic { public static void main(String[] args) { System.out.println("main Method"); System.out.println(StaticClass.field); } } class StaticClass { static String field = "정적 변수"; static { System.out.println("Static class start"); } }

정적 메서드를 사용할 때
public class Basic { public static void main(String[] args) { System.out.println("main Method"); StaticClass.method(); } } class StaticClass { static { System.out.println("Static class start"); } static void method() { System.out.println("staticMethod start"); } }

'Java' 카테고리의 다른 글
[Java] 스레드의 상태와 생명주기 (0) | 2024.07.23 |
---|---|
[Java] 멀티 스레드 모델에 대해서 (1) | 2024.07.14 |
[Java] ConcurrentModificationException 원인 및 해결 방법 (0) | 2022.11.22 |
[Java] this란? (0) | 2022.05.01 |
[Java] 함수와 메서드의 개념 및 차이, 스택 메모리 (1) | 2022.02.21 |
댓글
이 글 공유하기
다른 글
-
[Java] 스레드의 상태와 생명주기
[Java] 스레드의 상태와 생명주기
2024.07.23들어가기 전이번 포스팅에서는 스레드의 상태와 생명주기에 대해서 알아보겠습니다.해당 내용을 알아보면서 "사용자 수준 스레드"와 "커널 수준 스레드"라는 단어가 나오는데 해당 단어들이 무엇을 의미하는지 아래 포스팅을 통해 알게 되고 난 뒤에 이번 내용을 읽으시는 것을 추천드립니다. https://hoestory.tistory.com/81 [Java] 멀티 스레드 모델에 대해서들어가기 전 이번 포스팅에서는 멀티스레드 모델에 대해 알아보겠습니다. 스레드 모델에는 일대일, 일대다, 다대다가 있습니다. 프로세스와 스레드의 차이점에 대해 궁금하신 분은 아래 포스hoestory.tistory.com 먼저 스레드의 상태에 무엇이 있는지 알아보고 스레드의 생명주기에 대해서 알아보겠습니다. 스레드의 상태에서는 간략하게 무… -
[Java] 멀티 스레드 모델에 대해서
[Java] 멀티 스레드 모델에 대해서
2024.07.14들어가기 전 이번 포스팅에서는 멀티스레드 모델에 대해 알아보겠습니다. 스레드 모델에는 일대일, 일대다, 다대다가 있습니다. 프로세스와 스레드의 차이점에 대해 궁금하신 분은 아래 포스팅을 보시는 것을 추천드립니다. https://hoestory.tistory.com/73 [운영체제] 프로세스 & 스레드에 대하여프로세스 운영체제에 의해 파일 시스템에 설치되어 있는 파일을 프로그램이라고 부릅니다. 프로세스는 프로그램의 실제 실행의 의미하며 프로그램 파일을 실행함으로써 프로그램 데이터들이hoestory.tistory.com 멀티스레드 모델에 대해서 설명하기 전에 사용자 수준 스레드와 커널 수준 스레드에 대해 먼저 알아보겠습니다. 사용자 수준 스레드 사용자 수준 스레드는 JVM에서 생성하고 관리하는 스레드입니다…. -
[Java] ConcurrentModificationException 원인 및 해결 방법
[Java] ConcurrentModificationException 원인 및 해결 방법
2022.11.22들어가기 전 필자가 이 내용을 다루게 된 이유는 업무를 보다가 ArrayList로 담긴 데이터를 순회하면서 삭제하다가 ConcurrentModificationException 예외를 접하게 되었습니다. 자바를 여태 하면서 IndexOutOfBoundsException는 많이 봤어도 ConcurrentModificationException라는 예외는 처음 봐서 이거에 대해 알아보고 싶었고 그리고 이 문제를 겪는 사람들이 많을 거라고 생각되어 다루게 되었습니다. 이제 문제의 원인이랑 해결방법에 대해서 알아보겠습니다. 원인 원인에 대해 먼저 알아보기 전 원인이 된 코드를 먼저 보겠습니다. public class Test { public static void main(String[] args) { List fi… -
[Java] this란?
[Java] this란?
2022.05.01this란? this는 Java에서만 사용하는 것이 아니라 C, C++ 등 여러 곳에서 많이 사용됩니다. 여기서 this의 영어를 뜻은 "(가까이 있는 것을 가리켜)이것"이라는 것처럼 this는 객체 자기 자신을 가리킵니다. this가 많이 사용되는 곳은 매개변수가 있는 생성자, setter 등에서 많이 사용됩니다. 예를 들어서 Person이라는 객체가 존재한다고 해보겠습니다. public class Person { String name; Integer age; public Person() { } public Person(String name) { this.name = name; } public Person(String name, int age) { this.name = name; this.age = a…
댓글을 사용할 수 없습니다.