객체를 매번 생성하기보다 재사용하는 경우가 좋을 때가 많다. String t = new String("bikini"); // 1 String s = "bikini"; // 2 String cmpStr = "bikini" if(t == s) ... t = t.intern(); if(t == s) ... Java 처음 배울 때 무조건 하는 예시이다. 1번 코드처럼 String 객체를 생성자로 생성하면 Heap 영역에 새로운 String 객체가 생성이 된다. 2번 코드와 같이 String 객체를 리터럴로 생성하면 Java의 String Pool 안에 생성된다. 이후에 cmpStr와 같이 리터럴로 String 객체를 생성하면 String Pool 안에서 bikini 객체를 찾고, 예전에 생성되어 있는 bikin..
매우 쉬운 내용이다. 코드 안에 어떤 객체를 박아두고 쓰지 말자는 이야기이다. // 부적절한 static 유틸리티 사용 예 - 유연하지 않고 테스트 할 수 없다. public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) {...} public static List suggestions(String typo) {...} } // 부적절한 싱글톤 사용 예 - 유연하지 않고 테스트 할 수 없다. public class SpellChecker { private final Lexicon dict..
이건 그렇게 어렵지 않은 내용이다. 이따금 static 메소드나 static 필드만을 담은 클래스를 만들고 싶다. 이런 클래스를 사용하는 용도에는 premitive 타입이나 배열 관련 메소드들 (Object를 상속받지 못해 타입마다 하나하나 만들어야 한다), 객체를 생성하는 static 메소드, final 클래스 관련 메소드들을 모은 클래스를 만들 수 있다. 이런 친구들은 인스턴스를 생성하지 않고 static 메소드 또는 필드를 사용하기 위해 설계된 클래스들이다. 생성자를 명시하지 않으면 자동으로 public 생성자를 만들어 주기 때문에 명시적으로 private 생성자를 만들어 줘 외부에서 인스턴스 생성을 막을 수 있다. package effectivejava.chapter2.item4; // 코드 4-..
내가 좋아하는 싱글톤이다. 주의해서 사용한다면 메모리를 폭발적으로 아낄 수 있다. 책에서 싱글톤의 단점부터 소개한다. 클래스를 싱글톤으로 만들면 클라이언트에서 테스트 코드를 작성하기 어렵다고 한다. 일단 이건 무슨 말인지 모르겠으니 그렇구나 하고 넘어가기로 하자. 싱글톤을 만드는 두 가지 방법 중 첫 번째를 소개한다. private static final 필드를 사용하고 생성자를 private으로 감춘다. package effectivejava.chapter2.item3.field; // 코드 3-1 public static final 필드 방식의 싱글턴 (23쪽) public class Elvis { public static final Elvis INSTANCE = new Elvis(); private..
static 팩토리 메소드와 생성자에는 똑같은 제약이 있다. 이는 입력 받는 파라미터의 개수가 많다면 코드를 알아보기 힘든 매우 화가 나는 상황이 생긴다. 전통 적으로 점층적 생성자(telescoping constructor) 패턴을 사용했다. public class NutritionFacts { private final int servingSize; // (mL, 1회 제공량) 필수 private final int servings; // (회, 총 n회 제공량) 필수 private final int calories; // (1회 제공량당) 선택 private final int fat; // (g/1회 제공량) 선택 private final int sodium; // (mg/1회 제공량) 선택 priva..
어떤 객체의 인스턴스를 얻기 위해 보통 public 생성자를 통해 객체를 생성한다. 이러한 방법 말고 public static 팩토리 메소드를 사용해 해당 클래스의 인스턴스를 만들 수 있다. static 팩토리 메소드에는 다음과 같은 장단점이 있다. 장점 1. 이름을 가질 수 있다. public class Person { String name; String address; int age; public Person(String name, String address,int age) { this.name = name; this.address = address; this.age = age; } public static Person 김꺽정() { return new Person("김꺽정", "북한",32); } ..