변수의 초기화

정순동·2023년 12월 4일
0

자바기초

목록 보기
27/89

초기화란? 변수를 선언하고 처음으로 값을 저장하는 것을 '변수의 초기화'라고 한다.

멤버변수의 초기화

멤버변수는 따로 값을 대입하지 않아도 자동으로 기본값으로 초기화 된다.

위와같이 자료형에 따라 멤버변수는 자동으로 초기화가 되나, 지역변수는 자동으로 초기화가 되지 않는다.

	class initTest {
    	int x;		// 기본값 0이 들어감
        int y = x;	// y = 0
        
        void method1() {
        	int i;		// 기본값이 들어가지 않음
            int j = i;  // Error!
    }

지역 변수와는 달리 멤버 변수는 각 타입의 기본값으로 자동 초기화 된다. 그 다음에 명시적 초기화, 초기화 블럭, 생성자의 순서로 초기화 된다. 그리고 클래스 변수(static)가 인스턴스 변수보다 먼저 초기화 된다. 멤버 변수의 초기화에 대해서는 이 두가지만 기억하면 된다.

  1. 클래스 변수(cv) 초기화 → 인스턴스 변수(iv) 초기화
  2. 자동 초기화 → 명시적 초기화(간단) → 초기화 블럭, 생성자(복잡)

명시적 초기화(explicit initialization)

변수의 선언과 동시에 초기화 하는 것을 명시적 초기화라고 한다.

	class Car {
    	int door = 4;
        Engine e = new Engine();
    }

명시적 초기화가 간단하고 명료하지만, 보다 복잡한 초기화 과정이 필요하다면 초기화 블럭 또는 생성자를 사용한다.

초기화 블럭(initialization block)

초기화 블럭에는 '클래스 초기화 블럭'과 '인스턴스 초기화 블럭' 두 가지 종류가 있다.
각각 클래스 변수의 초기화 또는 인스턴스 변수의 초기화에 사용한다.

클래스 초기화 블럭
클래스 변수의 복잡한 초기화에 사용된다.
인스턴스 초기화 블럭
인스턴스 변수의 복잡한 초기화에 사용된다.

초기화 블럭을 작성하는 방법은, 인스턴스 초기화 블럭은 단순히 클래스 내에 블럭{}을 만들고 그 안에 코드를 작성하기만 하면 된다. 클래스 초기화 블럭은 인스턴스 초기화 블럭 앞에 static을 붙혀 주면 된다.

예제 ↓

	class InitBlockTest {
    	static {
        	System.out.println("static {}"); //클래스 초기화 블럭
        }
        {
        	System.out.println("{}"); //인스턴스 초기화 블럭
        }
        
        public InitBlockTest() {
        	System.out.println("생성자");
        }
        
        public static void main (String[] args) {
        	System.out.println("-----구분선-----");
			InitBlockTest ibt = new InitBlockTest();
            InitBlockTest ibt2 = new InitBlockTest();
        }

결과 ↓

	static {}
    -----구분선-----
    {}
    생성자
    {}
    생성자

메모리에 InitBlockTest클래스가 올라갈 때 클래스 초기화 블럭이 제일 처음 실행된다. 그다음 psvm메서드의 구분선, 생성자를 사용해 ibt 참조변수를 만들때 인스턴스 초기화 블럭, 생성자, ibt2 참조변수를 만들 때 인스턴스 초기화 블럭, 생성자 순서로 출력되는것을 볼 수 있다.

0개의 댓글