본문 바로가기

STUDY/이펙티브자바

2-4) 인스턴스화를 막으려거든 private 생성자를 사용하라

인스턴스화를 막는 이유

 

정적 필드와 정적 메소드만으로 구성된 클래스를 만드는 경우가 있다. 예를 들어 java.util.Arrays의 배열을 위한 상수를 정적 필드로 가지고 있고, 배열관련 메소드를 정적 메소드로 가지고 있다. 이러한 성격의 클래스는 인스턴스화를 막는게 일반적이다. 인스턴스를 만든다는 것은 객체마다 다른 속성값을 가지고 있을 때 의미가 있다. 정적 필드와 메소드로만 구성된 클래스는 객체를 만드는것이 의미가 없다. 심지어 메모리상 낭비를 가져온다. 따라서 정적인 방식으로 만들어진 클래스는 인스턴스화를 막는것이 옳다.

 

 


private 생성자

 

public class Arrays {
    ...
    private Arrays() {}
    ...
}

정적 방식으로 만들어진 java.util.Arrays 클래스는 인스턴스화를 막기위해 생성자를 private로 선언하였다. 인스턴스화를 막기위해서 추상클래스로 정의하는 방법도 생각할 수 있겠지만, 그렇게되면 클래스를 상속하면 다시 인스턴스를 만들 수 있게된다.

 

 


정적 방법 VS 싱글톤

결과적으로 클래스에 하나의 상태만을 가지고 있는 정적 방법과 하나의 인스턴스만을 만들 수 있는 싱글톤은 유사한 면이 있다. 하나의 상태만을 가지고 있다는 공통점 때문에 싱글톤 객체를 정적 방법으로 구현하거나, 정벅 방법으로 만들어진 클래스를 싱글톤으로 바꾸는 것도 가능해 보인다. 하지만 이 둘은 분명한 차이점이 존재한다.

 

  • 로드: 정적 방법으로 만들어진 클래스는 상태값 까지 클래스 로드시점에 메모리에 올라간다. 하지만 싱글톤의 경우 구현 방법에 따라 실제 사용시점에 메모리에 올라가는 lazy 로드가 가능하다.
  • 성능: static 메소드가 일반 메소드보다 성능상에 이점이 있다. (https://stackoverflow.com/questions/3805155/are-java-static-calls-more-or-less-expensive-than-non-static-calls)
  • OOP, 인터페이스: 싱글톤을 사용하면 인터페이스를 구현 할 수 있고 OOP의 다양한 특성을 활용하여 유연한 코드를 작성할 수 있다.

개인적으로 최근의 개발 트렌드는 유연한 코드 작성이라고 생각한다. 따라서 싱글톤을 사용하는게 더 좋아보인다.

728x90