본문 바로가기

programming/java

(17)
Item7. 다 쓴 객체 참조를 해제하라 [Why] 객체 참조를 가지고 있는 객체는 가비지 컬랙터의 메모리 회수 대상에서 제외되기 때문에 메모리가 부족할 경우가 발생할 수 있기 때문 [When] 객체를 더 이상 사용하지 않을 때 객체를 캐시할 때 [How] 참조를 다쓰면 null을 통해서 참조 해제를 한다. WeekHashMap 을 통해서 객체를 캐시한다. java.lang.ref 패키지를 활용한다.
Item 6. 불필요한 객체 생성을 피하라 [Why] 객체의 생성 비용이 비싸기 때문에. [When] 객체의 생성 비용이 어플리케이션의 성능에 큰 영향을 미칠 때 객체 재사용의 이득이 객체 재생산의 이점(유지보수성, jvm 최적화된 객체 생성 시간)보다 큰 경우 [How] 객체 풀에 객체를 등록하고 사용할 때 객체 풀에 객체를 꺼내서 사용한다. [Example] Pattern Pattern 객체 생성 비용이 크기 때문에 이점이 있다. before static boolean isRomanNumeral(String s){ return s.matches("^(?=.)M*(C[MD]|D?C{0,3}" + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$"); } after public class RomanNumerals{ private st..
Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 [Why] 클래스의 유연성, 재사용성, 테스트 용이성이 개선되기 때문 [When] 사용하는 자원(상태)에 따라 동작이 달라지는 클래스 [How] 의존성의 복잡도를 해결하기 위해서 Spring 과 같은 프레임워크를 사용한다. 생성자, 정적 팩터리, 빌더 패턴 등 객체 생성 관련 메서드에 필요한 자원을 파라미터로 제공한다.
Item4. 인스턴스화를 막으려거든 pricate 생성자를 사용하라 [Why] 정적 멤버나 정적 메서드로 구성된 유틸리티 클래스는 인스턴스로 사용하지 않도록 설계한 경우가 있다. 이렇게 인스턴스를 막게 설계된 클래스를 설계한데로 사용하기 위해서 [When] 객체 생성을 제한하고 싶을 때 유틸리티 클래스의 인스턴스화를 막고 싶을 때 [How] private 생성자를 통해서 클라이언트가 객체를 생성하지 못하도록 명시한다.
Item 55. 옵셔널 반환은 신중히 하라 [WHY] Optional을 사용한다고 무조건 득이 되는 것이 아니기 때문이다. Collection, Stream, 배열, Optional 같은 컨테이너 타입은 Optional을 사용할 필요가 없다. Wrapper 클래스에 Optional을 적용하는 것 보다 Primitive 타입을 Optional에서 사용하도록 구현한 OptionalInt와 같은 클래스를 사용하는 것이 좋기 때문 null을 박싱한 Optinal을 사용하면 안되기 때문 [WHEN] 결과가 없을 수 있으며, 클라이언트가 이 상황을 특별하게 처리해야 하는 경우 사용자에게 반환 값의 여부를 확인해야 한다는 것을 명시하는 상황 [HOW] Optional 의 메서드를 활용하자. get() 값을 조회한다. orElse() 값을 조회한다. 없다면 기..
Item 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라 [WHY] 1. null을 반환하는 메서드를 사용할 때면 방어 코드를 넣어야 하기 때문이다. - 코드가 지저분해주고 API를 사용하는 사용자 입장에서 사용하기 어렵다. - 잘못된 사용으로 버그의 원인이 될 가능성이 있다. 2. null을 반환함으로서 객체 생성 비용을 줄여 성능에 도움을 줄 수 있으나 더 좋은 기법이 있기 때문이다. [WHEN] 컬렉션이나 배열을 반환할 때 [HOW] 1. 간단한 방법 컬렉션 : 빈 컬렉션을 반환할 때마다 생성하여 요소의 개수가 0개이든 N개이든 넣어서 반환한다. private final List cheeseInStock = new LinkedList(); public List getCheese() { return new ArrayList(cheeseInStock); } ..
Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴 클래스를 만드는 방법 1. public static final 필드 public class Elvis { public static final Elvis INSTANCE = new Elvis(); public void leaveTheBuilding(){ } } AccessibleOject.setAccessible을 사용해 private 생성자를 호출할 가능성이 존재함 싱글턴임이 API에 명백히 드러난다. 간결하다. 2. 정적 팩터리 방식 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis(){} public static Elvis getInstance(){ return INSTANCE; }//Supp..
Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라 방법 1 점층적 생성자 패턴 public class Member { private String name; // 필수 private int age; // 필수 private String address; // 선택 private String phone; // 선택 private String email; // 선택 // 필수 매개변수를 가지는 생성자 public Member(String name, int age) { this(name, age, null, null, null); } // 선택 매개변수 address가 추가된 생성자 public Member(String name, int age, String address) { this(name, age, address, null, null); } // 선택 매..