인스턴스화를 막으려거든 private 생성자를 활용하라(Effective Java)

Choizz·2023년 7월 15일
0

이펙티브 자바

목록 보기
4/13

오늘은 이펙티브 자바 내용 중 "인스턴스화를 막으려거든 private 생성자를 활용하라"라는 내용에 대해 포스팅 하려고 합니다.


인스턴스화를 하지 않는 경우

  • 보통 유틸리티 클래스들은 인스턴스로 만들어 쓰지 않습니다. 예를들어 Math, Pattern 클래스들이 이에 속합니다. 만약 개발자가 유틸성 클래스를 만든다면 private 생성자를 사용해서 객체 생성을 방지할 수 있습니다.
  • 또한 정적 팩토리 메서드를 통한 객체 생성만을 허용할 때도 private 생성자를 적용시켜 new를 통한 객체 생성을 막을 수 있습니다.

추상 클래스도 인스턴스화를 막을 수 없다.

  • 보통 추상 클래스는 인스턴스화 되지 않습니다.
  • 하지만, 추상 클래스를 상속받는 하위 클래스가 인스턴스화 될 경우 super() 생성자가 자동으로 수행되기 때문에 추상 클래스 또한 인스턴스화가 될 수 있습니다.
  • 따라서, 인스턴스화를 막으려면 private을 사용해야 합니다.
  • 물론, 추상 클래스에 private을 사용한다면 상속이 되지 않을 것 입니다.
public abstract class Test {}

public class Test2 extends Test {
   
   public Test2(){
   		super(); // 생성자가 호출되어 인스턴스화 될 수 있습니다.
   }
}


public abstract class Test {

    private Test() {}
}

---
public class Test2 extends Test { // 상속이 되지 않습니다.
   
}

상속 또한 방지할 수 있다.

  • private 생성자를 통해 상속을 방지할 수 있습니다.
  • 위와 마찬가지로 super() 생성자를 호출할 수 가 없기 때문입니다.

정리

  • private 생성자를 사용할 경우 왜 생성자로 인스턴스화가 불가능한지 주석으로 설명해 주는 것이 좋다고 합니다.
  • 예를 들어, '정적 팩토리 메서드를 통해서만 객체를 생성할 수 있다.' 등의 설명이 필요할 것 같습니다.

reference

profile
집중

0개의 댓글