본문 바로가기
728x90

Books/Effective-Java 3판18

10.equals는 일반 규약을 지켜 재정의하라(3) 1. 반사성 : null이 아닌 모든 참조 값 x에 대해, x.equals(x)는 true다. 2. 대칭성 : null이 아닌 모든 참조 값 x, y에 대해, x.equals(y)가 true면 y.equals(x)도 true다. 3. 추이성 : null이 아닌 모든 참조 값 x, y, z에 대해 x.equals(y)가 true이고 y.equals(z)도 true면 x.equals(z)도 true다. 4. 일관성 : null이 아닌 모든 참조 값 x, y에 대해 x.equals(y)를 반복해서 호출하면 항상 true를 반환하거나 항상 false를 반환함 5. null-아님 : null이 아닌 모든 참조 값 x에 대해, x.equals(null)은 false다. 4. 일관성 - 두 객체가 같다면 (어느 하나.. 2021. 10. 1.
10.equals는 일반 규약을 지켜 재정의하라(2) 1. 반사성 : null이 아닌 모든 참조 값 x에 대해, x.equals(x)는 true다. 2. 대칭성 : null이 아닌 모든 참조 값 x, y에 대해, x.equals(y)가 true면 y.equals(x)도 true다. 3. 추이성 : null이 아닌 모든 참조 값 x, y, z에 대해 x.equals(y)가 true이고 y.equals(z)도 true면 x.equals(z)도 true다. 4. 일관성 : null이 아닌 모든 참조 값 x, y에 대해 x.equals(y)를 반복해서 호출하면 항상 true를 반환하거나 항상 false를 반환함 5. null-아님 : null이 아닌 모든 참조 값 x에 대해, x.equals(null)은 false다. 1. 반사성 - 객체는 자기 자신과 같아야 한.. 2021. 9. 29.
10.equals는 일반 규약을 지켜 재정의하라(1) equals 메서드는 재정의하기 쉬워 보이지만 곳곳에 함정이 도사리고 있어 끔찍한 결과를 초래할 수 있다 문제를 회피하는 가장 쉬운길은 아예 재정의 하지 않는 것이다 (4가지 방법) 1. 각 인스턴스가 본질적으로 고유하다 - 값을 표현하는게 아니라 동작하는 개체를 표현하는 클래스가 여기에 해당한다 - ex) Thread 좋은 예로, Object의 equals 메서드는 이러한 클래스에 딱 맞게 구현돼 있다 2. 인스턴스의 '논리적 동치성' 을 검사할 일이 없다 - java.util.regex.Pattern은 equals를 재정의해서 두 Pattern의 인스턴스가 같은 정규 표현식을 나타내는지를 검사하는, 즉 논리적 동치성을 검사하는 방법도 있다 - 하지만 설계자는 클라이언트가 이 방식을 원하지 않거나 애초.. 2021. 9. 28.
9.try-finally보다는 try-with-resources를 사용하라 자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. ex) InputStream, OutputStream, java.sql.Connection 코드 9-1 try-finally - 더 이상 자원을 회수하는 최선의 방책이 아니다! // 코드 9-1 try-finally - 더 이상 자원을 회수하는 최선의 방책이 아니다! (47쪽) static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } } - 자원을 하나 더 사용한다.. 2021. 9. 27.
8.finalizer와 cleaner 사용을 피하라 자바는 두 가지 객체 소멸자를 제공한다 finailzer , cleaner - finailzer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다 - 자바 9 에서는 finalizer 사용 자제 API로 지정하고 cleaner를 대안으로 소개하고 있다 - cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일 반 적으로 불필요하다 - 프로그램 생애주기와 상관없는, 상태를 영구적으로 수정하는 작업에서는 절대 finalizer나 cleaner에 의존하면 안 된다 cleaner와 finalizer 적절한 쓰임새 2가지 방법 - 1. 자원 소유자가 close 메서드를 호출하지 않는 것에 대비한 안전망 역할 - cleaner나 finalizer가 즉시 호출.. 2021. 9. 25.
7.다 쓴 객체 참조를 해제하라 c, c++처럼 메모리를 직접 관리해야 하는 언어를 쓰다가 자바처럼 가비지 컬렉터를 갖춘 언어로 넘어오면 평안한다 다 쓴 객체를 알아서 회수해가기 때문이다 그러나 메모리 관리에 더 이상 신경 쓰지 않아도 된다고 오해하면 안 된다 7-1 메모리 누수가 일어나는 위치는 어디인가? // 코드 7-1 메모리 누수가 일어나는 위치는 어디인가? (36쪽) public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public voi.. 2021. 9. 24.
728x90