초기화블록? 그게 뭔데? 🤦♀️
초기화 블록(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()); // 인스턴스 메소드의 호출
}
}
※ 이 내용은 책 [스프링 입문을 위한 자바 객체 지향의 원리와 이해]를 보고 정리한 내용입니다.
'📖 Books > 자바 객체 지향의 원리와 이해' 카테고리의 다른 글
[Books] 어댑터요? 돼지코 같은건가? 🐷 (0) | 2023.03.06 |
---|---|
[Books] 하나의 객체는 하나의 책임만 가져야 한다? (0) | 2023.03.03 |
[Books] 클래스와 객체의 관계가 붕어빵과 붕어빵 틀이 아니라고?! (0) | 2023.02.27 |
[Books] 전역변수 사용을 왜 지양해야 할까? (0) | 2023.02.25 |
[Books] 자바는 어떻게 개발자에 대한 사랑을 실천했을까? (2) | 2023.02.24 |