Reference/Effective-Java

    [Effective-Java] Chapter2 #6. 불필요한 객체 생성을 피하라

    기존 객체를 재사용해야 한다면 새로운 객체를 만들지 마라. 📌 기존의 인스턴스를 재사용하자 String 객체를 예시로 들어보자. String s = new String("Java"); String을 new로 생성하면 매번 새로운 객체를 생성하게 된다. 해당 인스턴스는 기능적으로 완전히 똑같기 때문에, 위의 코드가 반복문이나 빈번히 호출되는 메서드 안에 있다면 쓸데없는 String 인스턴스가 여러 개 만들어질 수 있다. String s = "Java"; 반면에 이 코드는 새로운 인스턴스를 만들지 않고 기존의 리터럴 문자열을 참조하게 된다. 같은 가상 머신 안에서는 모든 코드가 같은 객체를 재사용하는 것이 보장된다. (Item1에서 언급한 String pool의 플라이웨이트 패턴, 같은 내용의 String ..

    [Effective-Java] Chapter2 #5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

    의존성 주입(Dependency Injection)은 자바 계통 언어로 개발을 해본 사람이라면 정말 익히 들어봤을 내용이지만, 난 지금까지 정확하게 이해를 하진 못했었다. 글의 내용을 훑어보고 내가 이해한 내용을 요약하자면 "상황에 맞게 클래스가 의존하는 자원을 변경하여, 유연성과 재사용성을 높이자"가 된다. 📌 유틸리티의 잘못 사용한 예 1️⃣ 정적 유틸리티를 잘못 사용한 예 public class SpellChecker { private static final Lexicon dictionary = ...; // 의존하는 자원 private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) { ... } public sta..

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

    static method와 static field만을 담은 클래스 생성을 남발하는 것은 Item3에서 언급한 단점들로 인해 객체 지향적 관점에서 보면 달갑지 않다. (다형성과 상속을 막고, 전역으로 데이터를 관리하게 되기 때문.) 하지만 분명 그 나름대로의 쓰임이 있다. 예시로 java.lang.Math, java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓거나, java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩터리)들을 모아놓을 수도 있으며, final 클래스와 관련된 메서드들을 모아놓을 때도 사용한다. public class Arrays { private static final int MIN_ARRAY_SORT_GR..

    [Effective-Java] Chapter2 #3. private 생성자나 열거 타입으로 싱글턴임을 보장하라

    📌 싱글턴(Singleton) 코딩을 맨처음 배울 때, '싱글턴 패턴이라는 것이 있다' 정도를 듣기는 했었지만 당시만 해도 이렇게까지 중요한 내용일 거라고는 생각도 못했었다. 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스이다. (ex. 무상태(stateless) 객체, 설계상 유일해야 하는 시스템 컴포넌트) ✒️ 싱글턴의 한계점 1. private 생성자를 가지고 있어 상속이 불가능하다 2. 테스트가 어렵다 : 인스턴스를 구현한 Singleton 객체가 아니라면 mock 객체(실제 객체를 다양한 조건으로 인해 제대로 구현하기 어려울 경우 사용하는 가짜 객체. 테스트 작성을 위한 환경 구축이 어렵거나, 테스트가 특정 케이스에 의존적인 경우에 사용한다.)를 만들 수 없어, 클라이언트가 테스트하기가..