본문 바로가기

effective java17

Effective Java 아이템 11. equals를 재정의하려거든 hashCode도 재정의하라 Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다. 아이템 10에서 equals 메서드 재정의 규약에 대해서 알아봤다. 주의사항으로 equals 메서드를 재정의하는 경우 hashCode 메서드도 재정의해야 한다고 했다. equals를 재정의한 클래스에서는 hashCode도 재정의해야 한다. 이를 어길 경우에 HashMap, HashSet, HashTable 와 같은 해시 기반의 컬렉션에서 오동작이 발생한다. 다음은 Object 명세에서 발췌한 규약이다. 응용프로그램 실행 중에 같은 객체의 hashCode를 여러 번 호출하는 경우에 equals가 사용하는 정보들이 변경되지 않았다면, 언제나 동일한 해쉬값을 반환한다. 다만 프로그램이 재시작한 경우에는 동.. 2019. 4. 8.
Effective Java 아이템 10. equals는 일반 규약을 지켜 재정의하라 Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다. equals 메서드는 재정의하기 쉬워 보이지만 잘못된 재정의를 통해 프로그램 오류를 일으킬 수 있다. 이러한 문제를 회피하기 위한 가장 좋은 방법은 아예 재정의를 하지 않는 것이다. 그냥 두면 해당 인스턴스는 오직 자기 자신과만 같게 된다. equals 재정의 하기전 확인해야 할 사항 다음과 같은 조건 중 하나에 해당한다면 equals 메서드를 재정의하지 않는 것이 최선이다. 각각의 객체가 본질적으로 고유하다. 클래스에 논리적 동일성 검사 방법이 필요하지 않다. 상위 클래스에서 재정의한 equals가 하위 클래스에서도 사용하기에 적당하다. 클래스가 private 또는 package-private로 선.. 2019. 4. 8.
Effective Java 아이템 9. try-finally보다는 try-with-resources를 사용하라 Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다. 자바 라이브러리에는 close 메서드를 호출해서 직접 닫아줘야 하는 자원이 많다. InputStream, OutputStream, java.sql.Connection 등이 있다. 자원을 닫는 것을 잊어버리면 예상치 못한 문제로 이어질 수 있다. 아이템 8에서 살펴봤지만 finalizer, cleaner는 안전망 역할을 할뿐이지 즉시 해제 된다는 것을 보장 받지 못한다. 1. try-finally 자바 7 이전에는 try-finally을 통해 자원을 해제하는 로직을 작성했다. finally 블록은 반드시 호출되기 때문에 해당 블록에 자원을 해제하는 작업을 작성했다. 다음 코드는 try-finally를 .. 2019. 4. 6.
Effective Java 아이템 8. finalizer와 cleaner 사용을 피하라 Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다. 자바 객체 소멸자, finalizer와 cleaner 자바에서는 두 가지 객체 소멸자를 제공한다. 바로 finalizer와 cleaner가 있다. finalizer는 예측할 수 없으며, 상황에 따라 위험하므로 일반적으로 불필요하다. 자바 9부터는 finalizer를 deprecated API로 지정하고 대안으로 cleaner를 소개한다. cleaner는 별도의 스레드에서 동작해서 finalizer보다 덜 위험하다고 생각할 수 있다. 하지만, cleaner도 여전히 예측할 수 없으며, 느리고, 일반적으로 불필요하다. 1. finalizer 다음 이미지는 오라클 자바 9 API 문서에서 finalize .. 2019. 4. 6.
Effective Java 아이템 7. 다 쓴 객체 참조를 해제하라 Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다. C, C++ 언어는 명시적으로 메모리를 할당해서 사용하고 자원을 다 사용하고 나면 개발자가 명시적으로 해제를 한다. 가비지 컬렉터를 갖춘 자바와 같은 언어를 사용하면, 가비지 컬렉터가 다 쓴 객체를 알아서 회수한다. 그래서 메모리 문제를 개발자가 전혀 신경쓰지 않아도 된다고 오해할 수 있다. 가비지 컬렉션 (Garbage Collection) 시스템에서 더 이상 사용하지 않는 동적 할당된 메모리 블록 혹은 개체를 찾아서 자동적으로 다시 사용 가능한 자원으로 회수하는 것을 말한다. 가비지 컬렉션을 수행하는 부분을 가비지 컬렉터(Garbage Collector)라고 한다. Java에서는 개발자가 프로그램.. 2019. 4. 6.
Effective Java 아이템 6. 불필요한 객체 생성을 피하라 Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다. 똑같은 기능의 객체를 매번 생성하는 것보다 객체 하나를 재사용하는 편이 나은 경우가 많다. 재사용은 일단 매번 객체를 생성하는 것보다 빠르다. 특히 불변 객체는 언제든 재사용 할 수 있다. 변하지 않기 때문이다. 실무에서 개발 업무를 하다 보면 String을 많이 사용한다. 경험적으로 문자열 값을 처리하는 경우가 많았던 것 같다. String을 리터럴로 선언하면, 같은 객체를 재사용하게 된다. new String() 코드는 문자열 인스턴스를 매번 새로 생성하며, 동일한 문자열 값이더라도 다른 인스턴스를 생성한다. // String 리터럴로 선언해서 동일한 문자열이면 같은 객체를 사용하는 방식 Stri.. 2019. 4. 4.