개발서적

    [Effective Java] 인스턴스화를 막으려거든 private 생성자를 사용하라

    정적 메서드와 정적 필드만 담은 클래스를 만들 때가 있다. 이런 경우 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아니다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다. 이 때문에 때때로 공개된 API들에서도 의도치 않게 인스턴스화할 수 있게 된 클래스가 보이곤 한다. 추상 클래스(abstract)를 이용하면 인스턴스화를 막을 수 있을 것이라고 생각하지만, 하위 클래스를 만들면 하위 클래스의 생성자에서 상위 클래스의 생성자를 호출하기 때문에 인스턴스화를 완전히 막지는 못한다. 인스턴스화를 완전히 막는 방법은 private 생성자를 추가하는 것이다. 이 방법은 상속을 불가능하게 하는 효과도 있다. public class UtilityClass {..

    [Effective Java] private 생성자나 열거 타입으로 싱글턴임을 보증하라

    싱글턴 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴을 만드는 방식은 보통 둘 중 하나이다. 1. 생성자를 private으로 감추고 public static 멤버 변수를 만든다. public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() {}; } [장점] 이 방법은 JavaDocs를 만들 때 싱글턴임이 API에 명백히 드러난다는 장점이 있다. 또 한 간결하다는 특징이 있다. [단점] 권한이 있는 클라이언트의 경우 리플렉션을 사용해서 private 생성자를 호출할 수 있다. => 이를 방지하기 위해 생성자를 수정하여 두 번째 객체가 생성되려 할 때 예외를 던질 수 있다. publi..

    [Effective Java] 빌더 패턴

    생성자에 매개변수가 많다면 빌더를 고려하라 매개변수가 많을 때 생성자와 정적 팩터리 메서드 방식의 어려움을 확인해보자. public class NutritionFacts { private int servingSize; private int serving; private int calories; private int fat; public NutritionFacts(int servingSize, int serving) { this.servingSize = servingSize; this.serving = serving; } public NutritionFacts(int servingSize, int serving, int calories) { this.servingSize = servingSize; this..

    [Effective Java] 생성자 대신 정적 팩터리 메서드를 고려하라

    정적 팩터리 메서드는 이름을 가질 수 있다. 클래스의 인스턴스를 얻는 기본적인 방법은 public생성자를 이용하는 것이다. 하지만 생성자를 이용하는 방식은 자유로운 인스턴스의 생성을 방해하기도 한다. 예를 들어 게임 캐릭터를 생성하는데 이벤트 유저와, 일반 유저를 boolean으로 구분한다고 생각해보자. public class User { private boolean event; private boolean normal; private GameCharacter gameCharacter; public User(boolean event, GameCharacter gameCharacter) { this.event = event; this.gameCharacter = gameCharacter; } public ..