[이펙티브 자바] Item 11. equals를 재정의하려거든 hashCode도 재정의하라
·
Java/Effective Java
핵심 정리equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 한다.HashSet 혹은 HashMap 같은 컬렉션의 원소로 사용할 경우, 문제를 일으킬 수 있기 때문이다.AutoValue 프레임워크를 사용하면 equals, hashCode를 자동으로 만들어 준다. hashCode를 재정의하지 않으면 발생하는 문제Map m = new HashMap();m.put(new PhoneNumber(707, 867, 5309), "제니");m.get(new PhoneNumber(707, 867, 5309)); // null위 코드에서 HashMap의 원소를 꺼내면 `null`을 반환한다.이는 논리적 동치인 두 객체가 서로 다른 해시코드를 반환하였기 때문이다.PhoneNumber의 `hashCode()..
[이펙티브 자바] Item 10. equals는 일반 규약에 지켜 재정의하라
·
Java/Effective Java
핵심 정리꼭 필요한 경우가 아니라면 equals를 재정의하지 말자.재정의가 필요한 경우에는 아래 설명되어진 다섯 가지의 규약을 지켜가며 비교하자.  다음 중 하나에 해당한다면 재정의하지 않는 것이 최선이다.각 인스턴스가 본질적으로 고유하다.값을 비교할 목적이 아닌 동작하는 개체를 표현하는 클래스가 해당한다. (ex. Thread ..)이러한 클래스들의 경우에는 재정의하지 않고, Object의 `equals`를 사용하여도 무방하다.인스턴스의 '논리적 동치성'을 검사할 일이 없다.여기서 논리적 동치성이란, 두 객체가 의미적으로 같은지를 뜻한다.정규 표현식 클래스인 `Pattern`의 객체는 서로 비교할 일이 없을 경우로, Object의 equals로 해결된다.상위 클래스에서 재정의한 `equals`가 하위 ..
[이펙티브 자바] Item 9. try-finally보다 try-with-resource를 사용하라
·
Java/Effective Java
핵심 정리반드시 회수해야할 자원일 경우, try-with-resource를 사용하자.try-finally로 작성할 경우보다 정확하고 쉽게 자원을 회수할 수 있으며, 코드 간결성과 예외 처리 역시 개선된다. 자원을 닫아줘야 하는 이유는 무엇인가?자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다.`InputStream`, `OutputStream`, `java.sql.Connection`이 예이다.자원을 닫는 작업은 클라이언트가 놓치기 쉬워 성능 문제로 이어지기 쉽다. 자원을 닫는 방법에는 무엇이 있을까?방법 1. try-finally public static String firstLineOfFile(String path) throw IOException { Buffered..
[이펙티브 자바] Item 8. finalizer와 cleaner 사용을 피하라
·
Java/Effective Java
핵심 정리cleaner는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자객체 소멸자를 믿지 말고, 자원은 명시적으로 정리하자 Finalizer와 Cleaner는 무엇인가자바에서는 두 가지 객체 소멸자를 제공한다.`finalizer`예측할 수 없고, 위험할 수 있어 일반적으로 불필요하여 기본적으로 사용하지 않는 것을 권고한다.그래서 자바 9부터는 deprecated API로 지정한다.`cleaner`finalizer의 대안으로 소개된 것으로, 덜 위험하지만 여전히 예측할 수 없으며 일반적으로 불필요하다. 두 가지 객체 소멸자를 사용하면 왜 안될까`finalizer`와 `cleaner`의 경우, 즉시 수행된다는 보장이 없다.즉, 이들을 이용하여 제 때 실행되어야 하는 작업은 수행할 수 없다..
[이펙티브 자바] Item 7. 다 쓴 객체 참조를 해제하라.
·
Java/Effective Java
핵심 정리메모리 누수는 겉으로 잘 드러나지 않아 코드 리뷰나 힙 프로파일러와 같은 디버깅 도구를 사용하여 파악하자.메모리 누수와 관련된 문제에 대한 예방법을 익혀두자.자바 GC가 모든 것을 해결해 주지 않는다. 참조를 해제하는 습관을 가지자. 사용이 끝난 객체 참조는 명시적으로 제거하자경우 1.  스택과 같이 내부적으로 메모리를 관리하는 자료 구조public class Stack { private Object[] elements; private int size = 0; public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (..
[이펙티브 자바] Item 6. 불필요한 객체 생성을 피하라
·
Java/Effective Java
핵심 정리불필요한 객체 생성은 그저 코드 형태와 성능에만 영향을 준다.오토방식은 성능 병목이 생길 수 있어 주의하자.추후에 다루겠지만 방어적 복사가 필요한 상황에서 객체를 재사용했을 때 반복 생성했을 때보다 피해가 더 크다. 불필요한 객체 생성은 피하라String s = new String("hello");String s = "hello";`new String("hello")`의 경우, 항상 새로운 인스턴스를 만듦으로 GC 부담이 증가하며 메모리 낭비로 이어진다.2번째 줄과 같이 하나의 String 인스턴스를 사용하자. 똑같은 객체를 재사용하는 것이 보장된다. 생성된 객체를 재사용하자Boolean b = Boolean.valueOf(true);정적 팩토리 메서드를 제공하는 불변 클래스에서는 정적 팩토리 ..
[이펙티브 자바] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
·
Java/Effective Java
핵심 정리하나 이상의 자원에 의존할 때, 클래스 동작에 영향을 끼칠 경우 싱글톤과 정적 유틸리티 클래스는 지양하자.의존 객체 주입은 재사용성, 테스트 용이성, 클래스의 유연성을 개선시킨다. 자원을 직접 명시할 때 생기는 문제는 무엇일까?public class SpellChecker { private static final Dictionary dictionary = new Dictionary(); // 직접 생성 private SpellChecker() {} // 인스턴스화 방지 public static boolean isValid(String word) { // ... }}위 방식은 다음과 같은 문제점을 파악할 수 있다.SpellChecker는 오직 하나의 Diction..
[이펙티브 자바] Item 4. private 생성자를 사용하여 인스턴스화를 막아라
·
Java/Effective Java
핵심 정리private 생성자를 추가하여 클래스의 인스턴스화를 막을 수 있다.추상 클래스로 만드는 것만으로는 막을 수 없으며, 생성자 내 예외 처리를 통해 실수로 호출하는 것을 막아보자. 클래스들은 무조건 인스턴스화를 필요로 하지 않는다.`java.lang.Math`와 `java.util.Arrays`와 같이 기본 타입 값이나 배열 관련 메서드들을 모아놓을 수 있다`java.util.Collections`처럼 특정 인터페이스 구현하는 개체를 생성해주는 정적 메서드를 모아놓을 수 있다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다.이 때, 매개변수를 받지 않는 `public 생성자`가 만들어진다.이로 인해 사용자는 사용하기 위한 생성자인지 구분할 수 없게 된다. 방법 1) ..
[이펙티브 자바] Item 3. private 생성자/열거 타입으로 싱글톤 보증하라
·
Java/Effective Java
핵심 정리대부분 상황에서는 원소가 하나뿐인 열거 타입이 싱글톤을 만드는 가장 좋은 방법이다.리플렉션 API 공격에 대해 조심하자. (AccessibleObject.setAccesible) 싱글톤이란?싱글톤은 클래스의 인스턴스를 오직 하나만 생성해서 사용하는 패턴이다.전역적으로 접근 가능하면서도, 단 하나의 인스턴스만 보장하는 구조이다. 싱글톤 구현 방식방법 1. public static final 필드 방식의 싱글톤public class Singleton { public static final Singleton INSTANCE = new Singleton(); private Singleton() {} public void doSomething() { System.out.pri..
[이펙티브 자바] Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라
·
Java/Effective Java
핵심 정리빌더 패턴은 무조건 좋은 것만은 아니다 성능에 민감할 경우에는 고려하자.매개변수 4개 이상이라면 빌더 패턴을 고려하자.API는 시간이 지날수록 매개변수가 많아지는 경향이 있음을 명심하자. 생성자에 매개변수가 많다면 어떻게 할까?public class NutritionFacts { private final int servingSize; // (ml) 필수 private final int servings; // (회분) 필수 private final int calories; // (kcal) 선택 private final int fat; // (g) 선택 private final int sodium; ..
[이펙티브 자바] Item 1. 생성자 대신 정적 팩토리 메서드를 고려하라
·
Java/Effective Java
핵심 정리정적 팩토리 메서드 사용을 강제하는 것은 아니다.하지만 생성자보다 정적 팩토리 메서드가 가지는 이점이 더 많다. 생성자 대신 정적 팩토리 메서드가 가지는 장점 5가지장점 1. 이름을 가질 수 있다.public class Example { public static void main(String[] args) { BigInteger bigInteger = new BigInteger(10, 100, new Random()); BigInteger probablePrime = BigInteger.probablePrime(10, new Random()); }}생성자 방식의 경우, 한 눈에 무슨 의도인지 파악하기 어렵다.정적 팩토리 메서드 방식의 경우, 메서드 이름을 통해 ..
maehyuk
'Java/Effective Java' 카테고리의 글 목록