본문 바로가기

책/effective java29

[effective java] item 10. equals는 일반 규약을 지켜 재정의하라 결론 꼭 필요한 경우가 아니면 equals를 재정의하지 말자. 많은 경우에 Object의 equals가 여러분이 원하는 비교를 정확히 수행해준다. 정의해야할 때는 그 클래스의 핵심 필드 모두를 빠짐없이, 다섯 규약을 확실히 지켜가며 비교해야 한다. AutoValue 프레임워크를 사용하거나, IDE를 이용하는 것도 방법이다. AutoValue > IDE > 직접 작성 전형적인 equals 메서드의 예 (64쪽) public final class PhoneNumber { private final short areaCode, prefix, lineNum; public PhoneNumber(int areaCode, int prefix, int lineNum) { this.areaCode = rangeCheck(.. 2023. 7. 31.
[effective java] item 9. try-finally보다는 try-with-resources를 사용하라 결론 닫아야 하는 자원을 다룰 때는 try-finally 말고, try-with-resources를 사용하자. 예외는 없다. 코드는 더 짧아지고 분명해지며, 스택 추적 내역에 예외가 남겨지기 때문에 훨씬 유용하다. 단, 자원이 AutoCloseable 인터페이스를 구현해야 한다. try-with-resources + catch 예제 import java.io.*; public class Copy { private static final int BUFFER_SIZE = 8 * 1024; static void copy(String src, String dst) throws IOException { try (InputStream in = new FileInputStream(src); OutputStream o.. 2023. 7. 30.
[effective java] item 8. finalizer와 cleaner 사용을 피하라 결론 finalizer와 cleaner은 자원 해제 시 사용하는 객체입니다. 두 객체 모두 불확실성, 성능 저하 등 많은 문제를 일으키므로 사용을 피하고, 대신 try-with-resources 로 자원으로 자원을 해제할 것을 권장합니다. 하지만, cleaner(자바 8까지는 finalizer)는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로 사용할 수도 있습니다. 물론 이런 경우라도 불확실성과 성능 저하에 주의해야 합니다. 설명 자바는 두 가지 객체 소멸자를 제공합니다. finalizer와 cleaner입니다. finalizer는 많은 문제의 원인이 되므로 자바 9에서 finalizer를 사용 자제(deprecated) API로 지정하고, cleaner를 그 대안으로 소개했습니다. (하지만 자.. 2023. 7. 25.
[effective java] item 7. 다 쓴 객체 참조를 해제하라 결론 메모리 누수는 겉으로 잘 드러나지 않아 시스템에 수년간 잠복하는 사례도 있습니다. 다음과 같은 경우, 다 쓴 객체 참조를 명시적으로 해제하여 메모리 누수를 방지해야 합니다. 1. 메모리를 직접 관리하는 클래스 (ex) Stack) 2. 캐시에 저장된 객체 참조 3. 리스너(listener) 혹은 콜백(callback) 의 해제 설명 C, C++과 달리 자바와 같이 가비지 컬렉터가 메모리 관리를 해주는 경우, 자칫 메모리 관리에 더 이상 신경을 쓰지 않아도 된다고 오해할 수 있지만, 반드시 프로그래머가 직접적으로 참조를 해제해야 하는 경우가 있습니다. 예제 1: 메모리를 직접 관리하는 클래스 스택을 간단히 구현한 다음 코드를 봅시다. Stack - 메모리 누수 발생 (p. 36) public clas.. 2023. 7. 25.
[effective java] item 6. 불필요한 객체 생성을 피하라 결론 기존의 객체를 재사용할 수 있다면, 새로운 객체를 생성하지 마라. [재사용이 가능한 경우] 1. 기능이 같은 불변 객체 (ex) String) 2. 불변 클래스 3. 비싼 객체가 반복해서 필요한 경우 4. 어댑터 객체를 재사용할 수 있는 경우 1. 기능이 같은 불변 객체 (ex) String) 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많습니다. 특히, 불변 객체는 언제든 재사용할 수 있습니다. String 객체 생성 String s = new String("bikini"); 문장이 실행될 때마다 String 객체를 생성합니다. 생성자에 넘겨진 "bikini" 객체는 이 생성자로 만들어내려는 String과 완전히 똑같습니다. 완전히 똑같은 불필요한 객체를 계속해.. 2023. 7. 25.
[effective java] item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 결론 클래스는 다른 클래스를 의존합니다. 이때 해당 클래스가 다른 클래스를 직접 생성하게 해서는 안됩니다. 그럴 경우, 수정이 번거롭고 테스트가 하기가 어렵습니다. 대신, 필요한 의존관계를 (혹은 그 클래스 객체를 생성하는 팩토리를) 생성자에 (혹은 정적 팩토리나 빌더에) 넘겨 주도록 합시다. '의존 객체 주입'이라 하는 이 기법은 클래스의 유연성, 재사용성, 테스트 용이성을 개선해줍니다. 의존 객체 주입 패턴 - 생성자 (p. 29) public class SpellChecker { private final Lexicon dictionary; public SpellChecker(Lexion distionary) { this.dictionary = Objects.requireNonNull(dictiona.. 2023. 7. 24.