초기화 지연은 신중하게 하라!

이펙이트 자바! 초기화 지연은 신중하게 하라 초기화 지연(Lazy initialization)은 필드 초기화를 실제로 그 값이 쓰일 때까지 미루는 것이다. 값을 사용하는 곳이 없다면 필드는 결코 초기화되지 않을 것이다. 이 기법은 static 필드와 객체 필드에 모두 적용 가능하다. 대부분의 최적화가 그렇듯이, 초기화 지연을 적용할 때 따라야 할 최고의 지침은 정말로 필요하지 않으면 하지마라라는 것이다. 클래스를 초기화하고 객체를 생성하는 비용은 줄이지만, 필드 사용 비용은 증가 시킨다. 초기화 지연이 적용된 필드 가운데 실제로 초기화되어야하는.. Read More

계승하는 대신 구성하라

이펙티브 자바! 계승하는 대신 구성하자! 계승(상속)은 코드 재사용을 돕는 강력한 도구지만, 항상 최선이라고는 할 수 없다. 계승(상속)을 적절히 사용하지 못한 소프트웨어는 깨지기 쉽다. 한 클래스가 다른 클래스를 상속(extends) 한다는 소리이다. 인터페이스의 상속을 말하는 것은 아니다. 또한 인터페이스가 인터페이스를 상속하는 것도 포함되지 않는다. 메서드 호출과 달리 계승(상속)은 캡슐화 원칙을 위반한다. 하위 클래스가 정상 동작하기 위해서는 상위 클래스의 구현에 의존할 수 밖에 없다. 상위 클래스의 구현이 릴리즈가 거듭되면서 자주 바뀌는데 그러다 보면.. Read More

equals를 재정의할 때는 반드시 hashCode도 재정의하라

equals를 재정의할 때는 반드시 hashCode도 재정의하라 예전에 동등성과 동일성에 대해 설명한 적이 있었다. 아마도 비슷한 내용이지 않나 싶다. 그래도 책에 나와있으니 다시 한번 포스팅해보자 Object 클래스 명세에서 복사해 온 일반 규약이다. 프로그램 실행 중에 같은 객체의 hashCode를 여러 번 호출하는 경우, eqauls가 사용하는 정보들이 변경되지 않는다면, 언제나 동일한 정수가 반환되어야 하지만 프로그램이 종료 되어 다시 실행 할 경우에는 그럴필요 없다. equals 메서드가 같다고 판정 되면 hashCode도 같아야 한다. equals 메서드가.. Read More