728x90 JAVA/Effective Java65 item 11. equals를 재정의하려거든 hashCode도 재정의하라 hashCode란? 간단히 말해, hashCode() 는 해싱 알고리즘에 의해 생성된 정수 값을 반환합니다. ( equals() 에 따라) 동일한 객체는 동일한 해시 코드를 반환해야 합니다. 다른 객체는 다른 해시 코드를 반환할 필요가 없습니다. As much as is reasonably practical, the hashCode() method defined by class Object does return distinct integers for distinct objects. hashCode의 일반 규약 equals 비교에 사용되는 정보가 변경되지 않았다면 애플리케이션이 실행되는 동안 그 객체의 hashCode는 항상 같은 값을 반환해야한다. 단, 애플리케이션이 재실행하는 경우 값이 달라질 수는 있.. 2022. 4. 19. item 10. equals는 일반 규약을 지켜 재정의하라 * 전 page에 대해 공부하였으나, 모든 책의 내용을 다 적기 보다는 꼭 필요한 내용을 추려 이해하기로 하였음 !!! (많아서) equals method란? -> call by value로 객체 값을 비교하는 메소드 (==는 call by reference로 주소값 비교) 어떤 경우에 equals를 재정의하고, 하지 말아야 할까? [equals를 재정의하지 않는 경우] - 각 인스턴스가 본질적으로 고유한 경우 (값 클래스가 아닌 경우에 해당한다. ex) thread) - 인스턴스의 논리적 동치성을 검사할 필요가 없는 경우 - 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는 경우 - 클래스가 private이거나 package-private이고, equals method를 호출할 일이.. 2022. 4. 19. item 9. try-finally 보다는 try-with-resources를 사용하라 - 자바 라이브러리에는 InputStream, OutputStream 그리고 java.sql.Connection과 같이 close를 이용해 직접 닫아줘야 하는 리소스가 많은데, 그런 리소스를 사용하는 클라이언트 코드가 보통 리소스 정리를 잘 안하거나 잘못하는 경우가 있다. - 안전망으로 finalizer을 사용하는 경우가 많으나, item8과 같은 다양한 문제들이 있을 수 있다. => 전통적인 방법 : try-finally - 자원이 제대로 닫힘을 보장하는 수단이다. 예외가 발생하거나, 메서드에서 반환되는 경우도 포함한다. - 자원이 여러개가 되는 경우, try~finally의 사용은 코드를 지저분하게 만들 수 있다. - 또한, 예외는 try, finally모두에서 발생할 수 있는데, 이런 상황에서 두번.. 2022. 4. 16. item 8. finalizer과 cleaner 사용을 피하라. Finalizer - Object에 존재하는 finalize()를 의미한다. - 객체 소멸자이다. - 클래스 객체가 더 이상 사용되지 않으면 GC가 자동으로 호출된다. - 예측 불가하고 느리다. [ 사용 ] - 안전망 역할로 자원을 반납하고자 하는 경우에 사용된다. - 네이티브 피어와 연결된 객체에서 네이티브 리소스를 정리해야 하는 경우에 사용한다. Cleaner - 객체 소멸자이다. - Java9에서 finalizer가 deprecated 됐고, cleaner이 새로 생겼다. - 별도의 thread를 사용해 finalizer보다 덜 위험하지만, 예측 불가하고 느리다. finalizer과 cleaner는 객체 소멸자지만 c++의 파괴자와는 다르다. c++에서의 destructor 역할 1 : 특정 객체와.. 2022. 4. 16. item7. 다 쓴 객체 참조를 해제하라 Java의 특징 : GC! GC가 있어 다 쓴 객체를 알아서 회수해간다. - 따라서 메모리 관리를 개발자가 신경쓰지 않아도 될까? -> NO! -> 자칫하다간 메모리 누수 문제가 일어날 수 있다. 메모리를 직접 관리하는 클래스는 개발자가 메모리 누수에도 신경써야 한다. [메모리 문제가 일어날 수 있는 경우] 1. Stack 사용 시 스택은 자기 메모리를 직접 관리한다. 배열로 저장소 풀(pool^.^)을 만들어 원소들을 관리한다. 가용 영역은 사용되며, 유효 영역 밖의 원소는 사용하지 않는데, GC는 이러한 정보를 해석할 수 없다. // Can you spot the "memory leak"? public class Stack { private Object[] elements; private int si.. 2022. 4. 16. item 6. 불필요한 객체 생성을 피하라 기능적으로 동일한 객체를 매번 생성하는 것은 비효율적일 수 있다. -> 객체 하나를 재사용 하는 것이 훨씬 적절한 방법이다. 특히, 불변 개체는 언제든지 재사용할 수 있다. 불변 객체의 대표적인 예로는 String, Integer, Boolean 등이 있다. String bad = new String("bad"); // 따라 하지 말 것 String good = "good"; new로 생성한 코드는 실행될 때마다 String 인스턴스를 새로 만든다. 쓸데없는 String 인스턴스가 여러 개 만들어질 수 있다. * 아래 코드는, 새로운 인스턴스를 매번 만드는 대신 String 인스턴스 하나를 재사용한다. -> Java의 가상머신 안에서 똑같은 문자열 리터럴에 대해서 동일 코드, 같은 객체를 사용하는 재사용.. 2022. 4. 12. 이전 1 ··· 7 8 9 10 11 다음 728x90