[Java] 6. 객체지향 프로그래밍 1 #5 변수의 초기화

2022. 4. 29. 02:35JAVA/Language

1. 변수의 초기화

  • 변수를 선언과 동시에 값을 저장하는 것을 변수의 초기화라고 함
  • 인스턴스의 멤버변수는 초기화하지 않고 사용해도 됨(자료형에 맞게 기본값으로 초기화가 이루어짐)
  • 하지만 지역변수는 사용하기 전에 반드시 초기화해야함
class Car{
	int door;	// 인스턴스 변수
    
    void method(){
    	int i;		// 지역변수
        int j = i;	// error, 지역변수를 초기화하지 않고 사용
    }
}

 

멤버변수의 초기화 방법 

  • 명시적 초기화(explicit initialization)
  • 생성자(constructor)
  • 초기화 블럭(initialization block)
    • 인스턴스 초기화 블럭 : 인스턴스 변수를 초기화 하는데 사용
    • 클래스 초기화 블럭    : 클래스 변수(static 변수)를 초기화 하는데 사용

 

2. 명시적 초기화(explicit initialization)

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

class Car{
    int door = 4;				// 기본형 변수의 초기화
    Engine e = new Engine();	// 참조형 변수의 초기화
}

 

3. 초기화 블럭(initialization block)

초기화 블럭의 종류

  • 인스턴스 초기화 블럭 : 인스턴스 변수의 복잡한 초기화에 사용됨
  • 클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용됨
class InitBlock{
    static {
    	/* 클래스 초기화 블럭 */
    }
    
    {
    	/* 인스턴스 초기화 블럭 */
    }
    
    public InitBlock(){
    
    }   
}

 

초기화 블럭 예제

public class BlockTest {
	static 
	{
		System.out.println("static { }");
	}
	
	{
		System.out.println("{ }");
	}
	
	public BlockTest() {
		System.out.println("생성자");
	}
	
	public static void main(String[] args)
	{
		System.out.println("BlockTest bt = new BlockTest();");
		BlockTest bt = new BlockTest();
		
		System.out.println("BlockTest bt2 = new BlockTest();");
		BlockTest bt2 = new BlockTest();
	}
}
static { }
BlockTest bt = new BlockTest();
{ }
생성자
BlockTest bt2 = new BlockTest();
{ }
생성자
  • 수행 결과 BlockTest 클래스가 메모리에 로딩될때 클래스 초기화 블럭이 가장 먼저 수행하게 되어 "static { }"를 출력하게 됨
  • 그 다음 인스턴스 블럭이 수행하게 되고 생성자가 수행됨
  • 수행 순서 : 클래스 초기화 블럭 -> 인스턴스 초기화 블럭 -> 생성자

 

4. 멤버변수의 초기화 시기와 순서

클래스 변수의 초기화 시점  : 클래스가 처음 메모리에 올라갈 때 단 한번만 초기화됨
인스턴스 변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어짐

클래스 변수의 초기화순서    : 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭
인스턴스 변수의 초기화 순서 : 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자

 

인스턴스 변수 초기화를 활용한 예제

public class Product {
	static int count = 0;	// 생성된 인스턴의 수를 저장하기 위한 변수
	int serialNo;			// 인스턴스 고유 번호
	
	{
		count++;
		serialNo = count;
	}
	
	public Product() {
		
	}
	
	public static void main(String[] args)
	{
		Product p1 = new Product();
		Product p2 = new Product();
		Product p3 = new Product();
		
		System.out.printf("p1의 제품번호(serialNo) = %d\n", p1.serialNo);
		System.out.printf("p2의 제품번호(serialNo) = %d\n", p2.serialNo);
		System.out.printf("p3의 제품번호(serialNo) = %d\n", p3.serialNo);
		System.out.printf("현재 생상한 제품 수 = %d\n", Product.count);
	}
}
p1의 제품번호(serialNo) = 1
p2의 제품번호(serialNo) = 2
p3의 제품번호(serialNo) = 3
현재 생상한 제품 수 = 3
  • Product 객체가 생성 될 때마다 인스턴스 초기화 블럭이 수행됨
  • Product 객체를 생산할때마다 객체 필드 멤버(serialNo)에 고유한 번호(count)를 할당함

 

References

source code : https://github.com/yonghwankim-dev/java_study
Java의 정석, 남궁 성 지음