728x90
반응형
SMALL
가끔 정적 메서드, 정적 필드만을 담은 클래스를 만들고 싶을 때가 있다. 대표적인게 유틸클래스.
물론, 객체 지향적으로 사고하지 않는 이들이 종종 남용하는 방식이라 좋아보이진 않지만 유용할 때가 분명 있다.
근데, 내가 이 부분에서 빠뜨린 부분이 있었다.
나는 인스턴스화를 막기 위해 추상 클래스로 선언하면 아무 문제 없을 줄 알았는데, 그게 아니었다.
추상클래스로 만드는 것으로는 인스턴스화를 막을 수 없다.
추상클래스로 만들어도, 하위 클래스를 만들어 인스턴스화하면 그만이다.
다음 코드를 보자.
AbstractClass
package items.item4;
public abstract class AbstractClass {
public static void hello() {
System.out.println("Hello Static Class");
}
}
ChildClass
package items.item4;
public class ChildClass extends AbstractClass {
public void childMethod() {
System.out.println("child method");
}
}
- 이 하위클래스가 추상 클래스를 상속받았다.
Main
package items.item4;
public class Main {
public static void main(String[] args) {
ChildClass childClass = new ChildClass();
childClass.hello();
}
}
- 하위클래스로 인스턴스를 생성하면, 결국 원하는만큼 인스턴스를 생성할 수가 있게 된다. 어차피 자식 인스턴스를 만들면 부모 인스턴스는 자연스럽게 생성자가 호출되니까 인스턴스도 계속해서 만들어질 수 있다.
결론
그래서, 이 인스턴스화를 막는 방법은 추상 클래스가 정답이 아니다. 인스턴스화를 막으려면 private 생성자를 만들면 된다.
명시적으로 생성자를 하나라도 만들면 컴파일러는 우리 대신 생성자를 만들지 않기 때문에 private 생성자만 존재하게 된다. 그리고 private 생성자만 있는 경우, 절대로 하위 클래스가 존재할 수 없다. 상속받는 클래스는 명시적이든 묵시적이든 상위 클래스의 생성자를 호출하는데 호출할 수 있는 생성자가 없으니 말이다.
그래서, 자식 클래스를 만들 수도 없고 생성자를 통해 인스턴스를 만들수도 없는 private 생성자를 사용하자.
728x90
반응형
LIST
'Effective Java' 카테고리의 다른 글
아이템 8 - finalizer, cleaner 사용을 피하라 (5) | 2024.09.16 |
---|---|
아이템 7 - 다 쓴 객체 참조를 해제하라 (3) | 2024.09.16 |
아이템 6 - 불필요한 객체 생성을 피하라 (2) | 2024.09.16 |