유난스런 개발 기록

[JAVA] Day-16 _ 초기화 블럭 (initialization block) 본문

개념정리/JAVA

[JAVA] Day-16 _ 초기화 블럭 (initialization block)

yourhwan 2023. 2. 1. 02:31

day-16

초기화 블럭 (initialization block)


초기화 블럭 (initialization block) 이란? 

  • "클래스 초기화 블럭" 과 "인스턴스 초기화 블럭" 두 가지가 있다.
  • 인스턴스 초기화 블럭은 클래스 안에 {} 을 넣어주면 된다. 주로 공통으로 실행할 코드를 넣어준다.
  • 클래스 초기화 블럭은 static {} 을 해주면 된다. 주로 환경설정시에 사용한다.
  • 코드의 재사용성을 높여주고 중복을 제거하여 유지 및 보수에 용이하다는 장점이 있다.

 

초기화의 시점

  • 클래스 변수 : 클래스가 처음 로딩 될 때 한번만
  • 인스턴스 변수 : 인스턴스가 생성될 때마다

 

부모 클래스

package my.day16.c.block;

public class Parent {

	public Parent() {
		System.out.println(">> 부모클래스인 Parent 클래스의 기본생성자가 호출됨 <<");
	}
	
}

 

자식 클래스

package my.day16.c.block;

public class Child extends Parent {

	String name = "홍길동"; // 맴버변수 초기화 (안스턴스 변수)
	static int count;	  // 멤버변수의 초기화 (static 변수)
	
	static {
		// static 초기화 블럭은 인스턴스(객체)를 생성하기 전에 먼저 호출되어지며
		// !! 중요한 것은 오로지 1번만 호출된다는 것이다. !!
		// 주로 static 초기화 블럭은 환경설정시 사용된다.
		
		System.out.println("*** Child 클래스의 'static 초기화 블럭' 호출됨 ***");
		count++;
		
		// name = "똘똘이"; // 오류!!
		// static 초기화 블럭에서 오로지 static 변수만 들어올 수 있고,
		// 인스턴스 변수는 들어올 수 없다.!!!
	} 
	
	{
		System.out.println("### Child 클래스의 instance(인스턴스) 초기화 블럭 호출됨. ###");
		name = "서강준";
	}
	
	// == 생성자 == //
	public Child() {

            super(); 

            System.out.println("=== 자식클래스인 Child 클래스의 기본생성자 호출됨 ===");
            name = "한지민";
		
	}
}

 

 

메인 클래스

package my.day16.c.block;

public class MainBlock {

	public static void main(String[] args) {

		Child child_1 = new Child();
	/*
	 	*** Child 클래스의 'static 초기화 블럭' 호출됨 ***
		>> 부모클래스인 Parent 클래스의 기본생성자가 호출됨 <<
		### Child 클래스의 instance(인스턴스) 초기화 블럭 호출됨. ###
		=== 자식클래스인 Child 클래스의 기본생성자 호출됨 ===
	 */
		
		System.out.println("child_1.name => " + child_1.name);
		// child_1.name => 한지민
		
		System.out.println("Child.count => " + Child.count);
		// Child.count => 1

		System.out.println("\n=========================\n");
		
		Child child_2 = new Child();
	/*
	  	>> 부모클래스인 Parent 클래스의 기본생성자가 호출됨 <<
		### Child 클래스의 instance(인스턴스) 초기화 블럭 호출됨. ###
		=== 자식클래스인 Child 클래스의 기본생성자 호출됨 ===
	 */
		
		child_2.name = "전지현";
		
		System.out.println("child_2.name => " + child_2.name);
		// child_1.name => 전지현
		
		System.out.println("Child.count => " + Child.count);
		// Child.count => 1
	}

}

 

클래스 초기화 블록과 인스턴스 초기화 블록 각각의 개념은 알겠으나

실제 실습에서 코드를 보면 헷갈리는 부분들이 있다.

특히나 하나의 클래스로만 코드를 짠 예시를 보면 쉽게 이해가 되지만

위의 예시와 같은 여러개의 클래스를 이용한 코드를 보면 초기화 과정이 명확하게 이해되지 않는다.

주말 동안에 다시 개념 정리를 한 후에 

직접 코드를 쳐보며 그 원리를 이해할 시간이 필요할 거 같다.