본문 바로가기

이펙티브자바10

Effective Java #09 equals를 재정의할 때는 반드시 hashCode도 재정의하라 equals 함수를 재정의하는 클래스는 반드시 hashCode 함수도 재정의 해야 한다.그렇지 않으면 Object.hashCode의 일반 규약을 어기게 되므로, HashMap, HashSet, Hashtable같은 해시(hash) 기반 컬렉션과 함꼐 사용하면 오동작하게 된다. Object 클래스 명에서 복사해 온 일반 규약은 다음과 같다. 응용프로그램 실행 중에 같은 객체의 hashCode를 여러 번 호출하는 경우 equals가 사용하는 정보들이 변경되지 않았다면 언제나 동일한 정수(integer)가반환되야 한다.다만 프로그램이 종료되었다가 다시 실행되어도 같은 값이 나올 필요는 없다. equals(Object) 함수가 같다고 판정한 두 객체의 hashCode 값은 같아야 한다. equals(Object.. 2016. 4. 17.
Effective Java #08 equals를 재정의할 때는 일반 규약을 따르라 equals 함수는 재정의하기 쉬워 보이지만 실수할 여지도 많고, 그 결과는 끔찍하다고 한다.가장 간단한 방법은 equals 함수를 재정의 하지 않는 것인데 개인적으로 공통 함수로 제공되는 것들은 그냥 사용하는 것이좋다고 생각한다. 꼭 필요할 경우에만 재정의 하도록 하자. 그렇다면 Object.equals를 재정의하는 것이 바람직할 때는 언제인가?객체동일성(object equality)이 아닌 논리적 동일성(logical equality)의 개념을 지원하는 클래스일 때, 그리고 상위 클래스의 equals가 하위 클래스의 필요를충족하지 못할 때 재정의해야 한다. equals 함수를 정의할 때 준수해야 하는 일반 규약은 다음과 같다.(Object 클래스 명세에서 복사한 것이다.)동치 관계(equivalenc.. 2016. 4. 17.
Effective Java #07 종료자 사용을 피하라 종료자(finalizer)는 예측 불가능하며, 대체로 위험하고 일반적으로 불필요하다. c++에서 소멸자는 메모리 이외의 자원을 반환하는 데도 사용되는데, 자바에서는 보통 try-finally 블록이 그런 용도로 사용된다.종료자의 한가지 단점은 즉시 실행되리라는 보장이 전혀 없다는 것이다.따라서 긴급한(time-critical) 작업을 종료자 안에서 처리하면 안된다.예를 들면 종료자 안에서 파일을 닫도록 하면 치명적이다. 그 외, 주요정보, 동기화나 입출력 및 자원을 점유하고 반환해야 하는 곳에서 종료자를 사용하여 처리하면 메모리 타이밍이 맞질 않을 것 같다.System.gc나 System.runFinalization 같은 함수에 마음이 흔들리면 곤란하다.이런 함수들은 종료자가 실행될 가능성을 높여주긴 하.. 2016. 4. 13.
Effective Java #06 유효기간이 지난 객체 참조는 폐기하라 C나 C++ 처럼 손수 메모리를 관리 해야 하는 언어를 쓰다 가비지 컬렉터가 있는 언어를 사용하게 되면 프로그래밍이 아주 쉬워진다.하지만 필자 생각엔 어떤 언어든 메모리 관리가 제일 중요하다고 생각한다. 자바나 C#에서 가장 큰 고민은 얼마나 효율적으로 코드를 구현할 것인가 인 것 같다.이 이야기는 재사용해야 하는 객체는 재사용하고 폐기하여 반환해야 하는 객체는 반환해야 한다는 것이다.초급 개발자와 중급, 고급 개발자에 차이점도 이 부분에서 나타나는 것 같다. 아래의 간단한 스택(stack) 구현 사례를 보자. 123456789101112131415161718192021222324252627282930// 메모리 누수(memory leak)가 어디서 생기는지 보이는가?public class Stack {.. 2016. 4. 13.