📖 Books/자바 객체 지향의 원리와 이해
[Books] Java에 초기화 블록이 있다는 사실 아셨나요?
오늘 ONEUL
2023. 2. 28. 23:59
초기화블록? 그게 뭔데? 🤦♀️
초기화 블록(initialization block)이란?
클래스 필드의 초기화만을 담당하는 중괄호{}로 둘러싸인 블록을 의미한다.
- 클래스 변수, 인스턴스 변수의 초기화가 복잡하거나 공통된 부분이 많을 경우 초기화 블록을 사용하면 코드를 간결하게 할 수 있다.
- 초기화 블록은 생성자보다 먼저 호출되며, static 키워드의 유무에 따라 다음과 같이 구분한다.
- Static Block(클래스 초기화 블록)
- Instance Block(인스턴스 초기화 블록)
Static Block(클래스 초기화 블록)
- 클래스가 처음으로 메모리에 로딩될 때 단 한 번만 실행
- 생성자나 인스턴스 초기화 블록으로는 수행할 수 없는 클래스 변수의 초기화를 수행
class InitBlock {
static int classVar; // 클래스 변수
int instanceVar; // 인스턴스 변수
static { // 클래스 초기화 블록을 이용한 초기화
classVar = 10;
}
}
public class Member {
public static void main(String[] args) {
System.out.println(InitBlock.classVar); // 클래스 변수에 접근
}
}
Instance Block(인스턴스 초기화 블록)
- 단순히 중괄호{} 만을 사용하여 정의
- 생성자와 마찬가지로 인스턴스가 생성될 때마다 실행
- 그러나 생성자보다 먼저 실행!
생성자 vs 인스턴스 초기화 블록
- 사실 차이는 거의 없다..!
- 따라서 인스턴스 블록은 잘 사용되지 않는다.
그럼 도대체 언제 사용하나요?
여러 개의 생성자가 있으면 모든 생성자에서 공통으로 수행되어야 할 코드를 인스턴스 초기화 블록에 포함하여 코드의 중복을 막을 수 있다.
class Car {
private String modelName;
private int modelYear;
private String color;
private int maxSpeed;
private int currentSpeed;
{ // 인스턴스 초기화 블록
this.currentSpeed = 0;
}
Car() {}
Car(String modelName, int modelYear, String color, int maxSpeed) {
this.modelName = modelName;
this.modelYear = modelYear;
this.color = color;
this.maxSpeed = maxSpeed;
}
public int getSpeed() {
return currentSpeed;
}
}
public class Member {
public static void main(String[] args) {
Car myCar = new Car(); // 인스턴스 생성
System.out.println(myCar.getSpeed()); // 인스턴스 메소드의 호출
}
}
※ 이 내용은 책 [스프링 입문을 위한 자바 객체 지향의 원리와 이해]를 보고 정리한 내용입니다.