스터디/이펙티브자바

[아이템7] 다 쓴 객체 참조를 해제하라

아이템 7 다 쓴 객체 참조를 해제하라 메모리 누수의 주범이다. 사용을 마친 객체의 참조를 해제할 때 null을 이용하여 객체 참조를 해제하는 방법도 있지만, 이는 지양하도록 하라. 가장 이상적인 방법은 참조를 담은 변수를 유효 범위 밖으로 밀어내는 것이다. 캐시 또한 메모리 누수를 일으키는 주범이니, 캐시 외부에서 키를 참조하는 동안만 엔트리가 살아 있는 캐시가 필요하다면 WeakHashMap을 사용해 캐시를 만들도록 하자. @DisplayName("HashMap 테스트") @Test void test1() { //given Map map = new HashMap(); Foo key = new Foo(); map.put(key, "1"); //when key = null; System.gc(); //t..

2020.01.28 게시됨

스터디/이펙티브자바

[아이템6] 불필요한 객체 생성을 피하라

아이템 6 불필요한 객체 생성을 피하라 String.matches(String regex); String 의 matches는 반복사용할 경우 그 비용이 매우 비싸다. 내부에서 Pattern 인스턴스를 생성했다가 GC의 대상이 되기 때문이다. 이를 Pattern 인스턴스를 미리 생성한 뒤 이용하여 성능 향상을 꾀하도록 하자. 내부적으로 new Pattern(regex,0) 을 하고 있다. Map.keySet(); Map.keySet 은 매번 새로운 인스턴스를 생성하는 것 처럼 보일 수 있으나 하나의 객체만을 반환하고 있다. 어댑터의 역할은 keySet이며 뒷단 객체는 Map을 의미한다. Map의 view역할을 keySet이 하여 Set으로 보여주고 있다. 따라서 keySet으로 반환된 Set 객체에서는 a..

2020.01.28 게시됨

스터디/이펙티브자바

[아이템5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

아이템 5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. ... 이 조건을 만족하는 간단한 패턴이 있으니, 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식이다. 직접 명시되어 고정되어 있는 변수는 테스트를 하기 힘들게 만든다. 즉, 의존성을 바깥으로 분리하여 외부로 부터 주입받도록 작성하여야 한다. (의존 객체 주입 패턴) Example code public class PriceCalculateService { private static final String EXCHANGE_URL = "https://somewhere.com"; private static final double FIX..

2020.01.18 게시됨

스터디/이펙티브자바

[아이템4] 인스턴스화를 막으려거든 private 생성자를 사용하라

아이템 4 인스턴스화를 막으려거든 private 생성자를 사용하라 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. case 정적 메서드와 정적 필드만을 담은 클래스를 만들경우 (ex. 유틸성 클래스) java.lang.Math java.util.Arrays Java.util.Collections final 클래스와 관련한 메서드를 모아 놓을 때 추상 클래스로 만드는 것은 상속을 하라는 의미로 받아 들여질 수 있으므로 인스턴스화를 막는데 아무런 도움이 되지 못한다. 기본적으로 아무런 생성자를 만들어 놓지 않으면 컴파일러가 기본 생성자를 public하게 만들기 때문에 명시적으로 private한 생성자를 만들어두어 인스턴스화를 막을 필요가 있다. 그렇지 않으면 기본 생성자를 컴파일러가 만..

2020.01.18 게시됨

스터디/이펙티브자바

[아이템3] private 생성자나 열거 타입으로 싱글턴임을 보증하라

아이템 3 private 생성자나 열거타입으로 싱글턴임을 보증하라 p.23 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 mock 구현으로 대체할 수 없기 때문이다. 인터페이스 없이 구현한 싱글턴 코드 public class Validator { private static final Validator INSTANCE = new Validator(); public static final Validator getInstance() { return INSTANCE; } private int bound; private Validator() { this.bound = 10; } public vo..

2020.01.17 게시됨

스터디/이펙티브자바

[아이템2] 생성자에 매개변수가 많다면 빌더를 고려하라

[아이템2] 생성자에 매개변수가 많다면 빌더를 고려하라 점층적 생성자 패턴 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다. public class Gradation { private String name; private int number; private long money; private double temperature; public Gradation(String name, int number, long money, double temperature) { this.name = name; this.number = number; this.money = money; this.temperature = temperature; } public Gradation(String name, int ..

2020.01.16 게시됨

스터디/이펙티브자바

[아이템1] 생성자 대신 정적 팩터리 메서드를 고려하라

이펙티브 자바 2장 객체 생성과 파괴 [아이템1] 생성자 대신 정적 팩터리 메서드를 고려하라 첫번째 장점, 이름을 가질 수 있다. Example code. public class Ladder { public static Ladder left() { return new Ladder(Direction.LEFT); } public static Ladder right() { return new Ladder(Direction.RIGHT); } public static Ladder down() { return new Ladder(Direction.DOWN); } private Direction direction; public Ladder(Direction direction) { this.direction = dir..

2020.01.15 게시됨