본문 바로가기

EffectiveJava26

아이템6. 불필요한 객체 생성을 피하라 객체들을 사용하다보면 불필요하게 여러번 생성하는 경우가 있습니다. 세가지 예를 살펴보겠습니다. 1. 문자열 생성 String hello1 = "hello"; String hello2 = new String("hello"); 보통 문자열을 생성할때 hello1처럼 사용하지만 hello2처럼 new 연산자를 사용하게되면 jvm은 문자열을 내부적으로 Pool에 캐싱을 하고 있다고 생각하시면 됩니다. 일종의 해시맵에 새로 생성된 문자열을 저장하고 어디선가 동일한 문자열을 생성하려고하면 새로생성하는 것이 아니라 이미 생성된 상수풀에서 동일한 문자열을 참조하도록 하는 방법으로 문자열을 재사용하기 때문에 new연산자를 통해서 문자열을 생성한다면 상수풀에 동일한문자가 있든 없든 강제로 문자열을 새로 생성하게 됩니다. .. 2023. 2. 5.
아이템5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 많은 클래스가 하나 이상의 자원에 의존합니다. 사용하는 자원에 따라 동작이 달라지는 경우 의존 객체 주입을 고려할 수 있습니다. public class SpellChecker { private static final Dictionary dictionary = new DefaultDictionary(); private SpellChecker() {} public static boolean isValid(String word) { // .... 코드 생략 return dictionary.contains(word); } public static List suggestions(String typo) { // .... 코드 생략 return dictionary.closeWordsTo(typo); } } 위의 Sp.. 2023. 2. 5.
아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라 클래스를 구현하다보면 인스턴스를 생성할 필요가 없는 경우가 가끔 있습니다. public class UtilityClass { public static String hello() { return "hello"; } } 위와 같이 정적 메서드만 담은 정적 유틸리티 클래스가 그런경우인데 보통 정적 유틸리티 클래스는 인스턴스를 생성해서 사용하도록 설계한 클래스가 아닙니다. UtilityClass.hello(); // 인스턴스를 생성하지 않고 호출 UtilityClass utilityClass = new UtilityClass(); utilityClass.hello(); // 인스턴스를 생성하여 호출 인스턴스 메서드를 생성하여 메서드를 호출하는게 문법적으로 잘못된건 아니지만 바로 hello메서드를 호출할 수 있음.. 2023. 2. 5.
아이템 3. 생성자나 열거 타입으로 싱글턴임을 보증하라. 프로젝트를 진행하다보면 애플리케이션에서 여러 인스턴스가 필요하지 않은 경우가 종종 있습니다. 예를 들어서 게임의 설정같은 경우 게임의 밝기, 게임상에서 사용하는 언어의 종류와 같은 인스턴스는 하나만 있어도 됩니다. 이러한 경우에 싱글턴을 어떻게 보증해야할지 알아봅시다. 1. public static final 필드 방식의 싱글턴 public class Elvis implements IElvis, Serializable { /** * 싱글톤 오브젝트 */ public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leaveTheBuilding() { System.out.println("Whoa baby, I&#3.. 2023. 2. 5.