책리뷰 (40) 썸네일형 리스트형 [이펙티브자바] 아이템7. 다 쓴 객체 참조를 해제하라 자바에서는 다쓴 객체를 알아서 회수해가는 가비지 컬렉터가 있다. 자칫 메모리 관리에 신경을 쓰지 않아도 된다고 오해할 수 있는데 절대 아니다. Stack클래스의 메모리 누수 public class Stack { private Object[] elements; private int size = 0; // 처음 stack 사이즈 private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); // 배열 사이즈 체크 elements[size++] = e; } public .. [이펙티브자바] 아이템6. 불필요한 객체 생성을 피하라 똑같은 기능을 하는 객체는 매번 생성하기보다 재사용하는 편이 빠르고 세련되다. String s = new String("bikini"); String s = "bikini"; 첫 번째 코드는 실행될 때마다 String 인스턴스를 새로 만들고 두 번째 코드는 하나의 String인스턴스를 재사용한다. 정적 팩터리 메서드 사용 생성자 대신 정적팩터리 메서드를 사용하면 불필요한 객체 생성을 막을 수 있다. Boolean(String) 생성자 대신 Boolean.valueOf(String)팩터리 메서드 사용하는 것이 좋은 예이다. (생성자는 자바9에서 deprecated됨) 생성 비용이 비싼 객체 사용 지양 static boolean isRomanNumeral(String s) { return s.matches(.. [이펙티브자바] 아이템5. 의존 객체 주입을 사용해라. 많은 클래스가 하나이상의 자원에 의존한다. 정적 유틸리티 클래스를 예로 들어볼 수 있다. 정적유틸리티 잘못 사용한 예 - 유연하지 않고 테스트 하기 어렵다. 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 static final Lexicon dictionary = ...; p.. [이펙티브자바] 아이템4. 인스턴스화를 막으려면 private을 강제하라 정적메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있다. 예를 들면 java.lang.Math, java.util.Arrays와 같은 기본 타입의 값이나 배열 관련 메서드를 모아놓을 수 있다. java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓을 수도 있다. 컴파일러는 생성자를 명시하지 않으면 public 생성자를 만들어준다. 의도하지 않아도 인스턴스화할 수 있게 된다. public class UtilClass { public static String getName() { return "heypli"; } public static void main(String[] args) { UtilClass utilClass = new UtilClas.. [이펙티브자바] 아이템3. private생성자나 열거타입으로 싱글턴 보증 싱글턴 인스턴스를 오직 하나만 생성할 수 있는 클래스. 클라이언트를 테스트 하기 어려워질 수 있다. 싱글턴을 만드는 방법은 두 가지가 있는데 두 가지 모두 생성자는 private으로 감춰두고 static멤버를 이용해서 인스턴스에 접근할 수 있다. 첫 번째 싱글턴 생성방법 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis(){ } public void leaTheBuild() {} } private 생성자는 Elvis.INSTANCE를 초기화할 때 한 번만 호출된다. 그런데 리플렉션 API AccessibleOjbect.setAccessible을 사용해 생성자를 호출 할 수 있다. // 기존에 static.. [이펙티브자바] 아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라 정적 팩터리와 생성자는 선택적 매개변수가 많으면 대응하기 어렵다. 영양 정보를 제공하는 클래스이다. 점층적 생성자 패턴 - 확장이 어려움 pubic class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; public NutritionFacts(int servingSize, int servings) { this(servingSize, servings, 0); } public NutritionFacts(int servingSi.. [이펙티브자바] 아이템1. 생성자 대신 정적 팩터리 메서드를 고려해야하는 이유 public static Boolean valueOf(boolean b) { return b? Boolean.TRUE : Boolean.FALSE; } 클래스는 정적팩터리 메서드를 제공 할 수 있는데 위 예제는 메서드의 기본타입인 boolean을 받아서 Boolean객체 참조로 변환해준다. 클래스는 public 생성자 대신 정적 팩터리 메서드를 제공할 수 있다. 장점과 단점을 알아본다. 정적 팩터리 메소드 장점 첫 번째, 이름을 가질 수 있다. 생성자에 넘기는 매새변수와 생성자 자체만으로는 반환될 객체의 특성을 제대로 설명하지 못한다. 정적 팩터리 메서드는 이름을 잘 지으면 반환될 객체의 특성을 잘 묘사할 수 있다. ex) BigInteger(int, int, Random) vs BigInteger.pr.. 모던자바인액션 13강 디폴트 메서드 ❓ 디폴트 메서드가 나온 배경 자바 8이전에 자바에서는 인터페이스를 구현하는 클래스는 인터페이스에서 정의하는 모든 메서드를 구현하여 제공하거나 슈퍼클래스의 구현을 상속받아야 한다. 그런데 인터페이스에 새로운 메서드를 추가하는 경우가 있으면 해당 인터페이스를 구현했던 모든 클래스의 구현을 고쳐야 한다. 자바8 API에서 List 인터페이스에 sort같은 메서드를 추가했기 때문에 문제가 발생할 수 있다. 자바 8에서 기본 구현을 포함하는 인터페이스를 정의하는 두 가지 방법을 제공하는데 첫 번째, 인터페이스 내부에 정적 메서드를 사용하는 것 두 번째, 인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드 기능을 사용하는 것 기존 인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메서드의 디.. 이전 1 2 3 4 5 다음