기존에 내가 사용하고 자주 봤던 static이 붙은 것들은
public static int a;
public static void main(String[] args){}
이정도인데, 업무 내에서 아래와 같은 코드를 발견했다.
public Conf {
static {
loadConfiguration();
}
}
얼추 인스턴스가 생성될 때 아래의 메서드를 실행하는 것 정도만 알겠는데 정확히 어떤 것인지 모르겠다.
개념정리를 해놓고 언제든 활용할 수 있도록 해보자.
초기화 블록
class Class {
static int Field = 10; // 클래스 변수의 명시적 초기화
int Field2 = 20; // 인스턴스 변수의 명시적 초기화
}
필드는 위와같은 형태로 초기화가 진행되는데, 초기화 블록을 활용하여 초기화를 할 수도 있다.
초기화 블록이란 클래스 필드의 초기화만을 담당하는 {}로 둘러싸인 블록이다.
초기화 블록은 생성자보다 먼저 호출되며, static 키워드의 유무에 따라 인스턴스 초기화블록, 클래스 초기화블록으로 구분할 수 있는데,
초기화 블록에는 다양한 명령문 및 제어문을 사용할 수 있으므로 복잡한 초기화를 해야 할 경우 유용하게 사용된다고 한다.
인스턴스 초기화 블록
인스턴스 초기화 블록은 생성자와 마찬가지로 인스턴스가 생성될 때마다 실행되는데,
생성자보다 먼저 실행된다.
여러 개의 생성자가 있을 때, 모든 생성자에서 공통으로 수행되어야 할 코드를 인스턴스 초기화 블록에 포함하여 사용하면, 코드의 중복을 막을 수 있다.
//코드 출처 : TCP School
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 Member03 {
public static void main(String[] args) {
Car myCar = new Car();
System.out.println(myCar.getSpeed());
}
}
클래스 초기화 블록
인스턴스 초기화 블록에 static 키워드를 넣은 형태이며, 클래스가 메모리에 처음으로 로딩될 때 한 번만 실행된다.
클래스변수의 초기화를 수행할 때 사용된다
//코드 출처 : TCP School
class InitBlock {
static int classVar;
int instanceVar;
static {
classVar = 10;
}
}
public class Member04 {
public static void main(String[] args) {
System.out.println(InitBlock.classVar);
}
}
초기화 순서
클래스 변수 : 기본값 > 명시적 초기화 > 클래스 초기화 블록
인스턴스 변수 : 기본값 > 명시적 초기화 > 인스턴스 초기화 블록 > 생성자
여러번 초기화 시 마지막으로 수행한 값만 남게된다.
//코드 출처 TCP School
class InitBlock {
static int classVar = 10;
int instanceVar = 10;
static {
classVar = 20;
}
{
instanceVar = 20;
}
InitBlock() {
instanceVar = 30;
}
}
public class Member05 {
public static void main(String[] args) {
System.out.println(InitBlock.classVar);
InitBlock myInit = new InitBlock();
System.out.println(myInit.instanceVar);
}
}
//20
//30
정리
public Conf {
static {
loadConfiguration();
}
}
내가 봤던 위의 코드는, 해당 클래스가 처음으로 로딩될 때, loadConfiguration() 메서드를 실행한다.
해당 메서드를 통해 필드값을 정의하고 있기 때문에, 결국 클래스 변수를 초기화 하기 위해 사용했으며,
인스턴스 초기화블록은 인스턴스 생성 시마다 초기화를 진행하는데, 객체는 주로 생성자를 통해 초기화를 진행하기 때문에 잘 사용하지 않으며, 생성자가 엄청 많아서 코드가 과하게 겹칠 경우 사용하는 것이 좋다.
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!