본문 바로가기

reviews/Effective JAVA

(13)
006. 불필요한 객체 생성을 피해라 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 특히 불변 객체는 언제든 재사용할 수 있다. 👉 문자열 객체 이 코드는 실행될 때마다 String 인스턴스를 새로 만든다. String s = new String("bikini"); 생성자로 넘기는 “bikini” 자체가 이 생성자로 만들어내려는 String과 기능적으로 완전히 똑같으므로 아래와 같이 생성하는 것이 올바르다. 아래 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다. String s = "bikini"; 나아가 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다. (같은 내용의 String 객체가 선언된다면 기존의 객체..
005. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 클래스가 여러 자원 인스턴스를 지원해야 하며, 클라이언트가 원하는 자원을 사용해야 한다. 👉 의존 객체 주입 패턴 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식 (의존 객체 주입의 한 형태) 클래스의 유연성, 재사용성, 테스트 용이성을 높인다. public class SpellChecker { private final Lexicon dictionary; public SpellChecker(Lexicon dictionary) { this.dictionary = Objects.requireNonNull(dictionary); // 의존성 주입 } public boolean isValid(Stri..
004. 인스턴스화를 막으려거든 private 생성자를 사용하라 단순히 정적 메서드와 정적 필드만을 담을 클래스를 만들고자 할 때 (아래 예시) 인스턴스를 만들어 쓰지 못하도록 의도할 때 생성자를 명시하지 않으면 컴파일러가 자동으로 생성하기 때문에 private 접근 제한자로 생성자를 만들면 클래스의 인스턴스화를 막을 수 있다. Util 용도의 클래스 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓은 클래스 final 클래스와 관련한 메서드들을 모아놓을 때
003. private 생성자나 열거 타입으로 싱글턴임을 보증하라 👉 싱글턴(Singleton) 인스턴스를 오직 하나만 생성할 수 있는 클래스 함수와 같은 무상태(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트 등 단점 클라이언트 테스트가 용이하지 않다. 클래스를 싱글턴으로 만들면 타입을 인터페이스로 만들고 그 인터페이스를 구현해서 만든 싱글턴이 아닌 경우 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문 👉 싱글턴을 입력하는 방식 두 방식 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 마련한다. ♦︎ public static final 필드 방식의 싱글턴 private 생성자는 public static final 필드인 Elvis.INSTANCE를 초기화 할 때 딱 ..
002. 생성자에 매개변수가 많다면 빌더를 고려하라 선택적 매개변수가 많을 때 선택할 수 있는 세가지 패턴 1. 점층적 생성자 패턴(telescoping constructor pattern) 필수 매개변수만 받는 생성자, 필수 매개변수와 선택 매개변수 1개를 받는 생성자, 선택 매개변수를 2개까지 받는 생성자, ... 형태로 늘려가며 매개변수를 전부 다 받는 생성자까지 늘려가는 방식 단점 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다. 사용자가 설정하길 원치 않는 매개변수가 있어도 지정하지 않을 수 없다. 클라이언트가 실수로 매개변수의 순서를 바꿔도 컴파일 오류가 발생하지 않아 런타임 시 오동작 할 수 있다. 2. 자바빈즈 패턴(JavaBeans Pattern) 매개변수가 없는 생성자로 객체를 만든 후 setter 메서드들을 호출해 원..