일모도원(日暮途遠) 개발자
[자바] 클래스의 초기화 블럭 (이름없는 메소드) 본문
자바 클래스에는 클래스 이름과 같은 이름을 가지는 생성자(生成者, 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 |