[Java] 클래스 변수와 인스턴스 변수의 초기화

YTT.erica·2024년 5월 20일

클래스 변수와 인스턴스 변수 초기화

변수 초기화 방법

  1. 명시적 초기화
  2. 생성자
  3. 초기화 블럭

명시적 초기화

명시적 초기화란, 변수를 선언과 동시에 초기화하는 방법

  class Human {
      int age = 10;
  }

초기화 블럭

  • 클래스 초기화 블럭
    클래스 변수의 복잡한 초기화에 사용
    클래스가 메모리에 처음 로딩될 때 한번만 수행

  • 인스턴스 초기화 블럭
    인스턴스 변수의 복잡한 초기화에 사용
    생성자와 같이 인스턴스를 생성할 때마다 수행

class InitBlock{
	static { /* 클래스 초기화블럭 */}
    { /* 인스턴스 초기화블럭 */}
    
    //...
}

변수 초기화 순서 맛보기

class BlockTest {
	//클래스 변수 초기화 블럭
	static {
		System.out.println("클래스 변수 초기화 블럭 { }");
	}
	//인스턴스 변수 초기화 블럭
	{
		System.out.println("인스턴스 변수 초기화 블럭 { }");
	}
	
	//생성자
	public InitTest() {     
		System.out.println("생성자");
	}

	public static void main(String args[]) {
		InitTest it = new InitTest();
	}
}
  1. 클래스 초기화 블럭 수행 "클래스 변수 초기화 블럭 { }"
  2. main 메서드 수행
  3. InitTest 객체가 생성되면서 인스턴스 초기화 블럭 수행 "인스턴스 변수 초기화 블럭 { }"
  4. 생성자 수행 "생성자"

클래스 변수와 인스턴스 변수의 초기화 시기와 순서

자료형에 따른 변수의 기본값

자료형기본값
byte0
short0
int0
long0L
float0.0f
double0.0d
char'\n0000’
booleanfalse
참조형 변수null

클래스변수

초기화 시기: 클래스가 처음 로딩될 때 단 한번 초기화
초기화 순서 : 기본값 -> 명시적초기화 -> 클래스 초기화 블럭

인스턴스변수

초기화 시기: 인스턴스가 생성될 때마다
초기화 순서 : 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자

예시)

public class InitializationOrder {
  // 클래스 변수 (static 변수)
  // 명시적 초기화
  public static int staticVar = initializeStaticVar();

  // 인스턴스 변수
  // 명시적 초기화
  public int instanceVar = initializeInstanceVar();

  // 클래스 변수 초기화 블록
  static {
    System.out.println("Static Initialization Block");
  }

  // 인스턴스 초기화 블록
  {
    System.out.println("Instance Initialization Block");
  }

  // 생성자
  public InitializationOrder() {
    System.out.println("Constructor");
  }

  private static int initializeStaticVar() {
    System.out.println("Static Variable Initialization");
    return 10;
  }

  private int initializeInstanceVar() {
    System.out.println("Instance Variable Initialization");
    return 20;
  }

  public static void main(String[] args) {
    System.out.println("Main Method");

    // 인스턴스 생성
    InitializationOrder obj = new InitializationOrder();
    InitializationOrder obj2 = new InitializationOrder();
  }
}

  • 순서
    클래스 변수 명시적 초기화 →
    클래스 변수 초기화 블록 →
    메인 함수 실행 →
    인스턴스 변수 명시적 초기화 →
    인스턴스 변수 초기화 블록 →
    생성자 →
    인스턴스 변수 명시적 초기화 →
    인스턴스 변수 초기화 블록 →
    생성자
profile
'◡'✿ 꿈을 찾아가보자고~ '◡'✿

0개의 댓글