[자바의 정석] 변수의 초기화

강신현·2022년 5월 19일
0

자바의 정석

목록 보기
8/15

✅ 명시적 초기화 ✅ 생성자 ✅ 클래스, 인스턴스 초기화 블럭 ✅ 초기화 순서

변수의 초기화

변수를 선언하고 처음으로 값을 저장하는 것

  • 멤버 변수 (인스턴스 변수, 클래스 변수) 와 배열은 각 타입의 기본값으로 자동초기화되므로 초기화를 생략할 수 있다.
  • 지역변수는 사용전에 반드시 초기화를 해야 한다.

- 초기화 방법

  1. 명시적 초기화 (explicit initialization)
  2. 생성자 (constructor)
  3. 초기화 블럭 (initialization block)

초기화 블럭

class InitBlock{
	static{
    	// 클래스 초기화 블럭
    }
	{
    	// 인스턴스 초기화 블럭
    }
    
    (이후 생성자 및 메서드 등 작성)
}

1. 클래스 초기화 블럭

클래스 변수의 복잡한 초기화에 사용

  • 클래스가 메모리에 처음 로딩될 때 한번만 실행된다.
  • static { }
  • 여기서 말하는 복잡한 초기화란 명시적 초기화으로는 부족한 경우를 말하며, 배열의 각 요소에 랜덤한 값을 채우는 초기화 등을 예로 들 수 있다.

2. 인스턴스 초기화 블럭

인스턴스 변수의 복잡한 초기화에 사용
생성자에서 공통적으로 수행되는 작업에 사용

  • 인스턴스가 생성될 때 마다 실행된다.
  • 생성자보다 먼저 실행된다.
  • { }

- 예시

  • 인스턴스 변수의 초기화 : 주로 생성자를 사용
  • 인스턴스 초기화 블럭 : 모든 생성자에서 공통으로 수행돼야 하는 코드를 넣는데 사용
Car(){
	count ++;
    serialNo = count;
    color = "white";
    gearType = "Auto";
}
Car(String color, String gearType){
	count ++;
    serialNo = count;
    this.color = color;
    this.gearType = gearType;
}

아래 코드가 중복되었다.

count ++;
serialNo = count;

따라서 인스턴스 초기화 블럭을 사용하여 간결하게 만들어준다.

// 인스턴스 초기화 블럭
{
	count ++;
	serialNo = count;
}

Car(){
    color = "white";
    gearType = "Auto";
}
Car(String color, String gearType){
    this.color = color;
    this.gearType = gearType;
}

코드의 중복을 제거하는 것은 코드의 신뢰성을 높이고, 오류의 발생가능성을 줄여 준다.

즉, 코드의 재사용성을 높이고 중복을 제거하는 것, 이것이 바로 객체지향프로그래밍이 추구하는 궁극적인 목표이다.

초기화 시기와 순서

클래스 변수

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

클래스 변수는 항상 인스턴스 변수보다 항상 먼저 생성되고 초기화 된다.

인스턴스 변수

  • 시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화 된다.
  • 순서 : 기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자
class InitTest{
	// 명시적 초기화
	static int cv = 1;
    int iv = 1;
    
    // 클래스 초기화 블럭
    static{
    	cv = 2;
    }
    
    // 인스턴스 초기화 블럭
    {
    	iv = 2;
    }
    
    // 생성자
    InitTest(){
    	iv = 3;
    }
}
1234567
cv:0cv:1cv:2cv:2cv:2cv:2cv:2
iv:0iv:1iv:2iv:3
  • 클래스 변수 초기화 (1 ~ 3) : 클래스가 처음 메모리에 로딩될 때 차례대로 수행
  • 인스턴스 변수 초기화 (4 ~ 7) : 인스턴스를 생성할 때 차례대로 수행
  1. cv가 메모리(method area)에 생성, int형의 기본값인 0이 cv에 저장
  2. 명시적 초기화에 의해 cv에 1 저장
  3. 클래스 초기화 블럭에 의해 cv에 2 저장
  4. InitTest클래스의 인스턴스가 생성되면서 iv가 메모리(heap)에 존재하게 된다. int형의 기본값인 0이 iv에 저장
  5. 명시적 초기화에 의해 iv에 1 저장
  6. 인스턴스 초기화 블럭에 의해 iv에 2 저장
  7. 생성자에 의해 iv에 3 저장
profile
땅콩의 모험 (server)

0개의 댓글