본문 바로가기

전체 글94

이펙티브 자바 2장 규칙 6. 유효기간이 지난 객체참조는 폐기하라 Effective Java 2장 객체의 생성과 삭제 규칙 6. 유효기간이 지난 객체 참조는 폐기하라 자바와 같은 언어에서는 GC가 메모리 관리를 잘 해주기 때문에, 메모리 관리에 대한 필요성을 망각할 수 있음. 하지만, 메모리 누수가 생기는 경우가 존재하며, 다시 이용되지 않을 참조에 대해 아직 사용하고 있다고 생각하고 쓰레기 수집기가 처리하지 않음. 자체적으로 관리하는 메모리가 있는 클래스를 만들 때는, 메모리 누수가 발생하지 않도록 주의해야 하며, 사용하지 않는 원소 안에 있는 객체참조는 null 로 변경해주어야 함. 보통, 캐시(cache) 의 경우, 메모리 누수가 자주 발생함. -> WeakHashMap사용하면 됌. 캐시를 구성할 때 캐시 바깥에서 키를 참조하고 있을 때만 값을 보관하면 될 때 쓸.. 2021. 2. 17.
이펙티브 자바 2장 규칙 5. 불필요한 객체는 만들지 말라 Effective Java 2장 객체의 생성과 삭제 규칙 5. 불필요한 객체는 만들지 말라 기능적으로 동일한 객체는 필요 시마다 만드는 것보다는 재사용하는 것이 좋음. // 안좋은 예 String s = new String("stringette"); // 실행 시마다 String 객체를 만듬. // 개선 String s = "stringette"; 생성자나 정적팩터리 메서드(규칙1)를 함께 제공하는 클래스의 경우, 정적팩터리 메서드를 사용하면 불필요한 객체 생성을 피할 수 있다. (ex) 규칙1 의 Boolean.valueOf 의 예 변경가능한 객체도 재사용 가능. 단, 최초 한 번 초기화 되면 변경 불가능해야 함. final static 멤버변수 선언, 정적 초기화 블록 사용. public class .. 2021. 2. 17.
이펙티브자바 2장 규칙4. 객체생성을 막을 때는 private 생성자를 사용하라 Effective Java 2장 객체의 생성과 삭제 규칙 4. 객체생성을 막을 때는 private 생성자를 사용하라 정적메서드나 필드만 모은 클래스를 만드는 상황이 생길 수 있음. 유틸성 클래스들(static 필드나 메서드만을 가지고 있는) ex) java.util.Math 보통 아무런 인자가 없는 default 생성자가 기본적으로 만들어지기 때문에, 클래스를 abstract 으로 선언하는 것은 소용 없음. 따라서, 객체생성을 막고 싶다면 private 생성자를 클래스에 생성해 객체를 생성하는 것을 방지해야 함. private AClass(){ throw new AssertionError(); } 위와같이 private 생성자 안에 AssertionError를 예외처리 해줄 수 있음. 해당 방법을 사용하.. 2021. 2. 17.
이펙티브 자바 2장 규칙3. private 생성자나 enum 자료형은 싱글턴 패턴 따르도록 설계하라 규칙 3. private 생성자나 enum 자료형은 싱글턴 패턴 따르도록 설계하라 싱글턴 객체를 하나만 만들 수 있는 클래스 방법 1. static 멤버변수로 선언(생성자를 private으로) public class Elvis{ public static final Elvis INSTANCE = new Elvis(); private Elvis(){...} } 클래스가 싱글턴인지 선언만 보면 금방 알 수 있어 좋음. public static final 선언하였으므로 같은 객체 참조. JVM의 경우, 정적팩토리 메서드 호출을 inline으로 처리하므로 정적 팩터리 메서드 방법을 사용하는게 좋음. 방법 2. 정적 팩토리 메서드 이용(변수 선언은 private으로) public class Elvis{ privat.. 2021. 2. 2.
이펙티브 자바 2장 규칙2.생성자 인자가 많을 경우, Builder 패턴을 적용하라 규칙 2. 생성자 인자가 많을 경우, Builder 패턴 적용하라 생성자와 정적팩터리의 한계 선택적 인자가 많은 상황에 놓였을 때, 잘 적응하지 못함. (꼭 초기화 되지 않아도 되는 인자) 대안 1. 점층적 생성자 패턴 필수인자만 받는 생성자 정의, 선택적 인자를 추가 (예시) 영양분석표를 클래스로 나타낸 상황이며, servingSize, servings 만 필수인자 NutritionFacts.java public class NutritionFacts{ private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; public.. 2021. 2. 2.
이펙티브 자바 2장 규칙1. 생성자 대신 정적 팩터리 메서드를 사용하라 규칙 1. 생성자 대신 정적 팩터리 메서드를 사용하라 장점 생성자와 달리 정적팩터리 메서드의 경우, 이름을 정할 수 있음. (이해가 쉬움) 인자의 순서만 다른 생성자 두 개 존재 시, 이름이 동일하므로 API설명서를 읽지 않고는 이 두개를 구분하기 어려움. 정적 팩터리 메서드의 경우, 이름으로 의미를 표현 가능하므로 이런 문제가 발생하지 않음. (예시) 소수일 가능성이 높은 BigInteger객체를 생성하는 생성자인 BigInteger(int, int, Random) -> BigInteger.probablePrime 과 같은 이름의 정적 팩터리 메서드로 표현했다면 더 이해하기 쉬웠을 것. 생성자와 달리, 호출될 때 마다 새로운 객체를 생성하지 않아도 된다. 이미 만들어둔 객체 사용 / 객체 캐시(Cach.. 2021. 2. 2.