일모도원(日暮途遠) 개발자
[자바] 클래스의 초기화 블럭 (이름없는 메소드) 본문
반응형
자바 클래스에는 클래스 이름과 같은 이름을 가지는 생성자(生成者, Constructor)가 있고, 아무런 메소드 명이 없은 초기화 블럭(Initialize block)이 있다.
잘 쓰이지 않는 문법이지만 면접용으로 알아는 두자.
아래 초기화블럭은 인스턴스 초기화 블럭이다. 생성자와 다르게 아무런 이름이 없다.
class Car {
int speed;
// 생성자
Car() {
System.out.println("Speed of Car: " + speed);
}
// 초기화 블럭 (아무런 이름이 없다)
{
speed = 60;
}
public static void main(String[] args) {
Car obj = new Car();
}
}
다른 초기화 블럭으로는 스태틱 초기화 블럭이 있다.
차이는 스태틱 초기화 블럭은 이름없이 static만 붙어있고, static인지라 최초 클래스가 로딩될때 딱 한번만 호출된다.
인스턴스 초기화 블럭은 이름도 없고 static도 없다. 그리고 객체가 생성될때마다 (생성자보다 먼저) 호출된다.
// 스태틱 초기화 블럭 (역시 아무런 이름이 없다)
static {
}
// 인스턴스 초기화 블럭 (아무런 이름이 없다)
{
}
호출되는 순서
초기화 블럭은 여러개를 가질수 있고, 위에서부터 순서대로 초기화 블럭을 호출하고 그다음에 생성자를 호출한다.
(하지만 이러면 알아보기 힘들기 때문에 가능한 초기화 블럭은 하나만 쓰자. 헷갈린다.)
// 부모 클래스
class MyParent {
MyParent() { System.out.println("MyParent 생성자"); }
{
System.out.println("MyParent 초기화 블럭");
}
}
// 자식 클래스
class MyChild extends MyParent {
MyChild()
{
super();
System.out.println("MyChild 생성자");
}
{
System.out.println("MyChild 초기화 블럭");
}
public static void main(String[] args)
{
MyChild myChild = new MyChild();
}
}
호출결과
MyParent 초기화 블럭
MyParent 생성자
MyChild 초기화 블럭
MyChild 생성자
초기화 블럭을 쓰는 이유
- 객체를 생성할때 생성자가 여러개 있을때 빼먹기 쉬운 부분은 초기화 블럭으로 둔다.
- 여러 생성자에서 공통되는 부분은 초기화 블럭으로 뺀다.
비슷한 말이긴 한데, 생성자를 많이 만들다보면... 공통되는 부분도 있도, 또 반드시 객체생성시 해야하는 코드가 있는데, 깜빡할수도 있다는 생각이 든다.
참고로 나는 초기화 블럭을 쓴적은 없는데, 코딩하다보니 이렇게 생성자가 많이 생기는 경우는 생기더라.(잘못짠건가?)
나중에 초기화 블럭을 사용할수 있으면 해봐야겠다.

반응형
'프로그래밍 언어 > 자바' 카테고리의 다른 글
[Java] 내부 클래스에서 외부 클래스의 메소드를 부를때. (0) | 2023.02.02 |
---|---|
[Java] java패키지와 javax패키지 (0) | 2022.07.23 |