본문 바로가기
[Effective Java] 외부에 제공하는 모든 API 요소에 대해 문서화 주석을 넣자. [Effective Java] 외부에 제공하는 모든 API 요소에 대해 문서화 주석을 넣자. - 사용 가능한 API 라면 반드시 문서화해야 한다. 만일 문서화 주석 규칙에 친숙하지 않다면 배워야 한다. - API 를 문서화하려면, 외부에 제공하는 모든 클래스, 인터페이스, 생성자, 메소드, 필드의 선언부 앞에 문서화 주석을 넣어야 한다. 만일 어떤 클래스가 직렬화될 수 있다면 직렬화 형태도 문서화해야 한다. - 문서화 주석이 빠진 API 를 사용하는 것은 실망스럽고 에러가 생길 가능성이 많다. 유지보수 하기 쉬운 코드를 작성하려면 외부에 공개되지 않는 대부분의 클래스, 인터페이스, 생성자, 메소드, 필드에 대해서도 문서화 주석을 작성해야 한다. - 메소드의 문서화 주석에서는 메소드와 클라이언트 사이의 계.. 2017. 1. 23.
[Effective Java] 가변인자(varargs)를 분별력 있게 사용하자. [Effective Java] 가변인자(varargs)를 분별력 있게 사용하자. - 1.5 이후에 사용 가능한 가변 인자. - 가변 인자만 받는 method 는 문제가 많다. 가장 심각한 것은 클라이언트가 인자를 주지 않고 메소드를 호출하면 Runtime Exception 이 나기 쉽다. ( 파라미터 없이 call 해도 args 값은 null 은 아니다. ) 또한 validity 를 명시적으로 추가해야 하며, 그 코드가 복잡해질 수 있다. - 가변 인자만 받는 method 대신 어떤 의미를 담은 하나의 인자를 더 받아서 처리하는 것이 좋다. - 성능이 중요한 상황에서 가변 인자를 사용하는 것을 주의하자. 가변 인자 메소드는 호출할 때마다 배열 생성과 초기화가 일어난다. 가변 인자의 유연함이 필요하다면 아.. 2017. 1. 17.
[Effective Java] 메소드 시그니처를 신중하게 설계하자. [Effective Java] 메소드 시그니처를 신중하게 설계하자. - 메소드 이름을 신중하게 짓자. 이름은 항상 표준 작명 규칙을 따라야 한다. 이름에는 일관성이 있어야 한다. 폭넓게 공감 가는 이름을 선택해야 한다. - 편리한 메소드를 만드는데 너무 열중하지 말자. 모든 메소드는 자신의 역할을 해야 한다. 메소드가 너무 많으면, 클래스를 배우고 사용하고 문서화하고 테스트하고 유지하기가 어렵다. 클래스나 인터페이스가 지원하는 각 동작에 대해서 충분한 기능을 수행하는 메소드를 제공하자. - 너무 많은 매개 변수를 피하자. 매개 변수는 네 개 이하를 목표로 하자. 매개 변수가 네 개를 넘으면 시종일관 문서를 참조하지 않고는 그 메소드 API 를 사용할 수 없다. 같은 타입의 매개 변수가 길게 나오면 특히 .. 2017. 1. 12.
[Effective Java] 인터페이스를 사용해서 확장 가능한 enum 을 만들자. [Effective Java] 인터페이스를 사용해서 확장 가능한 enum 을 만들자. - 대개의 경우 enum 의 확장은 좋지 않은 생각으로 밝혀졌다. - 확장 가능한 enum 타입을 사용해야 할 경우가 최소한 한 가지가 있는데, 작동 코드(operation code) 또는 opcode 라고 하는 것으로 특정 머신의 작동을 나타내는 요소들을 갖는 enum 타입이다. - 인터페이스를 구현한 enum 에 generic 을 설정할 경우는 아래와 같이 할 수 있다. bounded wild card Class opSet // class 객체가 enum 과 Operation 서브 타입 모두임을 나타냄. unbounded wild card Collection 2016. 12. 29.
[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] 비트(bit) 필드 대신 EnumSet 을 사용하자. [Effective Java] 비트(bit) 필드 대신 EnumSet 을 사용하자. - 보통 비트 값을 constant 로 사용할 때 아래와 같이 int enum 패턴을 사용하여 각 상수에 2의 n승을 대입한다. // 비트 필드 public static final int STYLE_BOLD = 1 2016. 12. 26.
[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.
반응형