IT 관련 책 정리 및 후기 25

[ITEM 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. - 대신 클래스가 여러 자원 인스턴스를 지원해야 하며, 클라이언트가 원하는 자원을 사용해야 한다. -> 이 조건을 만족하는 간단한 패턴은 인스턴스를 생성할 떄 생성자에 필요한 자원을 넘겨주는 방식 (의존 객체 주입) 의존 객체 주입 - 클래스를 생성할 떄 의존 객체를 사전에 주입해준다 - 인스턴스를 생성할 떄 생성자에 필요한 자원을 넘겨주는 방식 . 의존 객체 주입의 변형으로는 생성자에 자원 팩터리를 넘겨주는 방식이 있다 (팩터리 메서드 패턴) - 클라이언트는 자신이 명시한 타입의 하위 타입이라면 무엇이든 생성할 수 있는 팩터리를 넘길 수 있다. - 유연성과 테스트 용이성을 개선해주기도 하지만, 의존성이..

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

정적 메서드와 정적 필드만을 담은 클래스를 만드는 이유 1. 기본 타입이나 배열 관련 메서드들을 모아놓을 수 있다. 2. final 클래스와 관련한 메서드들을 모아놓을 떄도 사용한다. - final 클래스를 상속해서 하위 클래스에 메서드를 넣는 건 불가능하기 때문이다. ⁕ 추상클래스로 만드는 것으로는 인스턴스화를 막을 수 없다 - 하위 클래스를 만들어 인스턴스화하면 그만이기 때문 인스턴스화를 막는 방법 - 컴파일러가 기본 생성자를 만드는 경우는 오직 명시된 생성자가 없을 떄이니, private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. - 명시적 생성자가 private이니 클래스 바깥에서는 접근할 수 없다. 위와 같은 방식은 상속을 불가능 하게 하는 효과도 있다 -> 모든 생성자는 명시적이든..

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

싱글턴이란? - 인스턴스를 오직 하나만 생성할 수 있는 클래스 - 설계상 유일해야 하는 시스템 컴포넌트 - 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다 싱글턴 생성 방식 1 - private 기본 생성자를 생성하여 생성자를 외부로 부터 감춘다. - public static final 필드를 선언하고 필드 변수가 초기화 될떄 딱 한번 호출 한다. EX) public static final Elvis INSTANCE = new Elvis(); Elvis.INSTANCE - 클래스가 초기화 될 떄 만들어진 인스턴스가 전체 시스템에서 하나뿐임이 보장된다. 싱글턴 생성 방식 2 - 정적 팩터리 메서드를 public static 멤버로 제공 EX) private static ..

[Item2] 생성자에 매개변수가 많다면 빌더를 고려하라

클래스에 인스턴스를 만들기 위해서는 매개변수를 입력 받아 클래스를 생성해야한다 하지만 점점 많은 매개변수를 받게 될 경우 하나부터 N개의 매개변수에 대한 생성자를 각각 생성해주어야 하고 필요한 생성자를 골라서 생성해야한다. 이렇게 되면 코드상으로도 읽기 어려우며 코드의 양도 많아지게 된다. 점층적 생성자 패턴 - 위와 같은 생성자 생성 패턴을 점층적 생성자 패턴 이라고 하는데 점층적 생성자 패턴 사용 시 타입이 같은 매개변수가 연달아 있으면 매개변수의 순서를 잘못 설정하여 지정해줘도 컴파일러는 알아차리지 못하고 런타임 단계에서 이상한 동작을 하게되어 매개변수가 많을 경우 안좋은 점 이 있다. 자바빈즈 패턴 (JavaBeans Pattern) - 선택 매개변수가 많을 떄 활용하는 패턴으로 Setter를 구..

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

정적 팩터리 메소드 (static factory method) 란? - 클래스의 인스턴스를 반환하는 단순한 정적 메서드 EX) 기본 타입인 boolean 값을 받아 Boolean 객체 참조로 변환하여 반환한다. public static Boolean valueOf(boolean b){ return b ? Boolean.TRUE : Boolean.FALSE; } 정적 팩터리 메소드의 장점 1. 이름을 가질 수 있다. - 생성자의 이름과 매개변수 만으로는 객체의 특성을 제대로 설명하지 못하지만, 정적 팩터리는 이름을 지정해 주어 해당 정적 메소드가 어떠한 역할을 해주는지 자세히 정의할 수 있다. 2. 호출될 때 마다 인스턴스를 새로 생성하지 않아도 된다. [Item 17 불변클래스 참고] - 미리 만들어 놓..