본문 바로가기
[Effective Java] equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자. [Effective Java] equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자. - 인스턴스의 동일 여부를 판정하는 equals 메소드의 오버라이딩은 간단한 것 같지만, 잘못되는 경우가 많아서 참담한 결과를 초래할 수 있다. ( 기본 equals 는 참조를 비교한다. ) - 다음의 조건이 만족된다면 슈퍼 클래스의 equals 를 그냥 사용해도 된다. 1. 클래스의 각 인스턴스가 본래부터 유일한 경우. 2. 두 인스턴스가 논리적으로 같은지 검사하지 않아도 되는 클래스의 경우. 3. 수퍼 클래스에서 equals 메소드를 이미 오버라이딩 했고, 그 메소드를 그대로 사용해도 좋은 경우. 4. private 이나 패키지 전용(package private) 클래스라서 이 클래스의 equals 메소드가.. 2015. 12. 31.
[Effective Java] Chap 3. 모든 객체에 공통적인 메소드. [Effective Java] Chap 3. 모든 객체에 공통적인 메소드. - Object 는 실체 클래스( concrete class ) 지만 원래 상속을 목적으로 설계되었다. equals, hashCode, toString, clone, finalize 는 다른 모든 자바 클래스에서 전체적으로 준수해야 하는 보편적 계약을 내포하고 있다. Object 의 모든 서브 클래스에서 그메소드들을 오버라이드 하도록 설계되었기 때문이다. - 어떤 클래스에서 보편적 계약 준수에 실패하면 그 계약에 준하는 HashMap 이나 HashSet, ArrayList 등과 같은 다른 클래스들과 함께 사용할 때 올바르게 동작하지 않는다. [Effective Java] equals 메소드를 오버라이드 할 때는 hashCode 메.. 2015. 12. 23.
[Effective Java] 파이날라이저 ( finalizer ) 의 사용을 피하자. [Effective Java] 파이날라이저 ( finalizer ) 의 사용을 피하자. - 파이널라이저는 예측 불가에다가 위험하기도 하며 일반적으로 불필요하다. - 파이널라이저의 큰 단점은 신속하게 실행된다는 보장이 없다는 것. 즉 파이널라이저에서 time critical 하게 중요한 일을 해서는 안 된다는 것. - 파이널라이저가 얼마나 빨리 실행되는가는 가비지 컬렉션 알고리즘에 달려있으며, 이는 JVM 종류에 따라 다양하다. - 자바 언어 명세에는 파이널라이저가 신속하게 실행된다는 보장이 없는 것은 물론, 반드시 실행될것인지도 보장하고 있지 않다. - System.gc() 와 System.runFinalization() 메소드들을 사용하지 말자. 그 메소드들은 파이널라이저가 실행될 가능성을 높여주긴 하.. 2015. 12. 15.
[Effective Java] 불필요한 객체의 생성을 피하자. 불필요한 객체의 생성을 피하자. - 기능적으로 동일한 객체를 필요할 때마다 매번 새로 생성하기보다는 하나의 객체를 재사용하는 것이 좋을 때가 많다. 재사용을 하면 객체 생성에 소요되는 비용(시간과 자원)이 절감되어 실행 속도가 더 빨라지고 코드도 보기 좋게 작성할 수 있다. 불변(immutable) 객체는 항상 재사용이 가능하다. - 불 필요한 객체 생성을 막기 위한 첫번째 좋은 방법은 static 팩토리 메소드를 사용하는 것이다. - 불변객체가 아닌 가변객체더라도 상태가 변경되지 않는 것이 보장되면 재사용 가능하다. - 재사용을 막기 위한 static 팩토리 메소드에서 늦 초기화 ( lazy initialization ) 을 하는 경우가 있는데, 후에 다루겠지만 두드러진 성능 개선이 나타나진 않고, 오.. 2015. 4. 30.
[Effective Java] private 생성자를 사용해서 인스턴스 생성을 못하게 하자. private 생성자를 사용해서 인스턴스 생성을 못하게 하자. - static 메소드와 static 필드만을 모아 놓은 클래스를 만들 경우 private 생성자를 사용해서 인스턴스 생성을 못하게 하자. - 명시적으로 지정한 생성자가 없을 때는 컴파일러가 디폴트 생성자 ( default constructor ) 를 생성한다. 이는 javadoc 프로그램으로 생성하는 API 문서에도 나타나므로 인스턴스 생성이 가능한 클래스로 오인될 수 있다. public class UnilityClass{ private UtilityClass(){ throw new AssertError(); } ... } - 이 방법은 sub class 를 가질 수 없다는 단점이 있지만, Utility 함수들은 대부분 상속을 위해 설계되지.. 2015. 4. 5.
[Effective Java] private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자. [Effective Java] private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자. -싱글톤(singleton) 은 정확히 하나의 인스턴스만 생성되는 클래스. -기존에 싱글톤을 구현하는 구현하는 방법은 2가지.1. 생성자를 private 으로 하고, 유일한 인스턴스에 접근할 수 있도록 public static 맴버를 외부에 제공.2. 위와 조건은 같지만 member 변수를 public 으로 하는 대신 factory 메소드를 통해 instance 를 전달한다. 2번의 방법은 factory 메소드의 장점을 함께 갖기 때문에 조금 더 좋은 방법이다.( 조건에 따라 다른 instance 를 return 할 수 있다. ) 위의 두가지 방법은 해당 class 를 직렬화 할 때 손이 많이 간다... 2015. 2. 25.
[Effective Java] 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자. 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자. - static 팩토리 메소드와 생성자는 공통적 제약이 있다. 선택가능한 매개변수가 많아질 경우 신축성 있게 처리하지 못한다. - 텔레스코핑 생성자(telescoping constructor) 패턴이 대안이 될 수 있으나, 마찬가지로 매개변수 수가 증가하면 무척 번거로워 진다. 가독성도 떨어지고, 유지보수도 어려워진다. ( 갯수를 세고 의미를 파악하는데만도 한세월~ ) - 자바빈즈(Java Beans) 패턴이 두번째 대안이 될 수 있으나, 이 패턴은 심각한 단점을 가지고 있다. 여러 번의 메소드 호출로 나누어져 인스턴스가 완성되기 때문에 객체가 일관된 상태를 유지하지 못할 수 있다. ( multi thread 환경 ) 또한 자바빈즈는 불변 .. 2015. 2. 8.
[Effective Java] 생성자 대신 static 팩토리(factory) 메소드 사용을 고려하자. 생성자 대신 static 팩토리(factory) 메소드 사용을 고려하자. -일반적인 instance 생성 방법은 생성자(constructor)를 이용하는 것. - 클래스에 public static 팩토리 메소드를 두는 것이 더 유용하다. - public static 팩토리 메소드의 장점 1. 생성자와 달리 자기 나름의 이름을 가질 수 있다. 2. 동일한 시그너처를 갖는 복수의 생성자를 갖는 효과를 누린다. 3. 호출될 때마다 매번 새로운 객체를 생성할 필요가 없다. 불변 클래스의 경우 이미 생성된 인스턴스를 다시 사용할 수 있다. 중복 생성 방지를 할 경우에도 사용된다. ( singleton ) 4. 자신이 아닌 서브타입(subtype) 객체도 반환할 수 있다. interface 와 혼합하여 사용하면 유.. 2014. 9. 8.
[Effective Java] 핵심정리 다시 시작. Java 프로그래머라면 누구나라도 읽어봐야 할 필독서 중 하나인 Effective Java. 이전에 정리를 진행했었는데, 누군가가 내 글을 심도있게 볼 수 있다는 가정 하에 너무 형식을 맞추어 쓰다 보니, 의지박약에 빠지면서 얼마 하다가 접었었다. 이번에 다시 처음부터 정리해봐야겠다. 원래 취지에 맞게 나의 저장소의 느낌으로 내가 깔끔하게 알아보면 되는 방식으로 정리해봐야지. 아!! 혹시라도 이 포스트 시리즈를 열독하실 분이시라면, 꼭 책을 사서 한번은 정독한 후에 다시 한 번 보며 정리하시길 강추 드립니다. 책 내용이 조금 어렵기는 하지만 자바 중급 개발자 이상으로 성장하고 싶으시다면 읽어볼 가치가 충만한 그런 책입니다. 그럼 다시다시 화이팅~!! 2014. 9. 6.
반응형