본문 바로가기
[Effective Java] 매개 변수가 유효한지 검사하기. [Effective Java] 매개 변수가 유효한지 검사하기. - 대부분의 메소드와 생성자는 자신들의 매개 변수로 전달될 수 있는 값에 제한을 둔다. 그런 모든 제약은 명확하게 문서화해야 하며, 메소드 몸체 코드의 맨 앞에서 검사하도록 해야 한다. 이것은 에러가 발생한 후 가능한 빨리 검출해야 한다는 일반적 원칙의 특별한 경우이다. 만일 사전 검사에 실패하면 에러의 검출이 불확실하게 되고, 에러가 생긴 소스 코드를 찾기가 더욱 어려워진다. - public 메소드의 경우는 javadoc 의 @throws 태그를 사용해서 매개 변수 값의 제약을 위반했을 때 발생되는 예외를 문서화한다. 일반적으로 IllegalArgumentException, IndexOutOfBoundsException, NullPointe.. 2017. 1. 9.
[Effective Java] ordinal 인덱스 대신 EnumMap 을 사용하자. [Effective Java] ordinal 인덱스 대신 EnumMap 을 사용하자. - EnumMap 은 enum 을 키로 사용하도록 설계된 가장 빠른 Map 이다. 서수를 인덱스로 사용하는 배열에 비해 처리 속도도 견줄만 하다. 내부적으로 그런 배열을 사용하기 때문이다. Map 의 풍부한 기능과 타입 안전 및 배열의 처리 속도를 모두 가지고 있으면서 상세한 내역은 프로그래머에게 숨기고 있다. EnumMap 은 생성자에 class 를 인자로 받는다. Summary ordinal 을 사용해서 배열을 인덱싱하는 것은 적합하지 않다. 만일 표현하고자 하는 관계가 다차원적이라면 EnumMap 을 사용하자. CLASS, Effective JAVA, enum, enummap, index, ordinal, type.. 2016. 12. 27.
[Effective Java] ordinal 대신 인스턴스 필드를 사용하자. [Effective Java] ordinal 대신 인스턴스 필드를 사용하자. - 모든 enum 은 ordinal 메소드를 갖고 있으며, 이 메소드는 enum 타입에 있는 각 enum 상수의 위치를 서수(첫번째, 두번째와 같이 순서의 의미를 가진 수)로 반환한다. 이 ordinal 메소드는 enum 의 순서에 절대 변화가 없다면 사용할 수 있지만, 유지보수가 있을 시에는 문제가 된다. 상수 값의 순서가 바뀌면 바로 값이 바뀌어 기존 int 상수를 사용하는 것과 별반 다를 바 없어진다. 아니 오히려 더 유지보수가 어려워질 수 있다. - 만일 int 값이 필요하다면 ordinal 을 사용하지 않고, 생성자에 번호를 넣는 방법으로 따로 variable 을 지정해서 사용하는 것이 좋다. - ordinal 은 En.. 2016. 12. 20.
[Effective Java] int 상수 대신 enum 을 사용하자. [Effective Java] int 상수 대신 enum 을 사용하자. - int enum pattern 이라고 불리는 int 를 이용한 분기는 단점이 많다. - 타입 안전을 보장하지도 않고, 편리하게 사용할 수 있는 방법도 제공하지 않는다. 즉 취약하다. - int enum 상수를 출력 가능한 문자열로 쉽게 바꾸는 방법도 없다. - 하나의 int enum 그룹에 있는 모든 상수를 loop 처리하거나, 그룹 사이즈를 알 수 있는 좋은 방법도 없다. - int enum 패턴의 변이로 String enum 패턴이 있는데 더더욱 바람직하지 않다. print 하는 부분에서는 좋지만, 문자열 비교에 의존하여 성능 문제가 생길 수도 있다. 더욱 문제가 되는 것은 필드명 대신 string 상수 값을 클라이언트 코드에.. 2016. 12. 19.
[Effective Java] 태그(tagged) 클래스보다는 클래스 계층을 사용하자. [Effective Java] 태그(tagged) 클래스보다는 클래스 계층을 사용하자. - 인스턴스들이 두 개 이상의 특성으로 분류되고 그런 특성을 나타내는 태그(tag) 필드를 갖는 클래스들을 태그 클래스라고 한다. 예를 들어 Figure 라는 class 가 있는데, 생성자의 종류에 따라 Rectangle 도 되었다가 Circle 도 될 수 있는 녀석. 한 Class 가 조건에 따라 많이 다른 특성의 class 의 형태로 변하는 녀석을 말한다. - 태그 클래스(Tagged class) 는 단점 투성이다. enum 선언, 태그 필드, switch, if 문 등을 포함해서 각종 복잡한 코드로 가독성을 떨어뜨린다. 다른 종류의 인스턴스에 속하는 부적절한 필드를 인스턴스가 가지고 있어 필요 없는 메모리 할당과.. 2016. 11. 14.
[Effective Java] 상속을 위한 설계와 문서화를 하자. 그렇지 않다면 상속의 사용을 금지시킨다. 상속을 위한 설계와 문서화를 하자. 그렇지 않다면 상속의 사용을 금지시킨다. - 메소드 오버라이딩으로 인한 파급 효과를 분명하게 문서화해야 한다. 같은 클래스의 다른 메소드들이 호출하는지에 대해 반드시 문서화해야 한다. ( self-use ) - 각각의 public 이나 protected 메소드 및 생성자가 어떤 오버라이드 가능한 메소드를 호출하는지, 어떤 순서로 하는지, 호출한 경로가 다음 처리에 어떤 영향을 주는지에 대해서도 반드시 문서화해야 한다. 오버라이드 가능하다는 것은 final 이 아니면서 public 이나 protected 인 경우를 의미한다. - 관례적으로 오버라이드 가능한 메소드를 호출하는 메소드에는 문서화 주석의 제일 끝에 그런 호출에 대한 설명을 추가한다. 그리고 설명의 시작은 "이.. 2016. 11. 1.
[Effective Java] 가변성을 최소화 하자. [Effective Java] 가변성을 최소화 하자. -불변 클래스는 자신의 인스턴스가 갖는 값을 변경할 수 없는 클래스. - 불변 클래스는, 가변 클래스에 비해 설계와 구현 및 사용이 더 쉽다. 에러 발생이 적으며 보안이나 사용 측면에서 더 안전하다. - 불변 클래스를 만들 때는 다음 다섯 가지 규칙을 따르자. 1. 객체의 상태를 변경하는 그 어떤 메소드도 제공하지 않는다. 2. 상속을 할 수 없도록 하자. ( class 에 final 을 주어 막을 수 있다. ) 3. 모든 필드를 final 로 지정한다. 4. 모든 필드를 private 으로 지정한다. 5. 가변 컴포넌트의 직접적인 외부 접근을 막자. 생성자와 접근자 메소드 및 readObject 메소드에서 해당 객체의 방어 복사본을 만들어 사용하도록.. 2016. 10. 24.
[Effective Java] clone 메소드는 신중하게 오버라이드 하자. [Effective Java] clone 메소드는 신중하게 오버라이드 하자. - Cloneable 인터페이스는 복제를 허용하는 객체라는 것을 알리는 목적으로 사용하는 믹스인 인터페이스( mixin interface ) 이다. 믹스인 인터페이스이기 때문에 자신이 clone method 를 가지고 있는 것도 아니다. Object 의 clone 은 Cloneable 을 implement 하지 않으면 사용할 수 없다. - Cloneable 을 implements 한 class 에 clone 을 호출하면, 해당 객체의 복제본을 만들어 반환한다. 복제 객체는 원본 객체와 같은 필드를 가지며 각 필드의 값도 복사된다. 하지만 reference 를 가진 녀석들은 deep copy 가 아닌 soft copy 를 수행한다.. 2016. 10. 10.
[Effective Java] 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자. 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자. - static 팩토리 메소드와 생성자는 공통적 제약이 있다. 선택가능한 매개변수가 많아질 경우 신축성 있게 처리하지 못한다. - 텔레스코핑 생성자(telescoping constructor) 패턴이 대안이 될 수 있으나, 마찬가지로 매개변수 수가 증가하면 무척 번거로워 진다. 가독성도 떨어지고, 유지보수도 어려워진다. ( 갯수를 세고 의미를 파악하는데만도 한세월~ ) - 자바빈즈(Java Beans) 패턴이 두번째 대안이 될 수 있으나, 이 패턴은 심각한 단점을 가지고 있다. 여러 번의 메소드 호출로 나누어져 인스턴스가 완성되기 때문에 객체가 일관된 상태를 유지하지 못할 수 있다. ( multi thread 환경 ) 또한 자바빈즈는 불변 .. 2015. 2. 8.
반응형