반응형

effective

    어노테이션 - 규칙 37 자료형을 정의할 때 표식 인터페이스를 사용하라.

    표식 인터페이스(marker interface)는 아무런 메스드도 없는 인터페이스이다. 클래스를 선언할 때 이런 표식인터페이스를 선엉ㄴ하는 이유는 해당 클래스가 어떤 속성을 만족한다는 사실을 표시하는 것과 같다. 표식 인터페이스의 장점은 다음과 같다. 1. 표식 인터페이스는 자료형이기 때문에 컴파일 시 오류를 탐지할 수 있다. 예를 들어서 살펴보자. Wedul이라는 표식 인터페이스를 만들고 Cjung클래스는 이를 구현하고, Gglee 클래스는 이를 구현하지 않았다. 이때 Wedul 인터페이의 인자를 받는 메서드 makeBar를 선언해놓고, 이 메소드에 파라미터로 Cjung과 Gglee를 넣었다. 이때 Wedul 인터페이스를 구현하지 않은 gglee 클래스 객체는 넣을 때 컴파일러에서 오류를 뱉는다. 12..

    어노테이션 - 규칙 36 Override 어노테이션은 일관되게 사용하라.

    자바 1.5에 어노테이션이 추가되었을 때, 자바 기본 라이브러리에 몇 가지 어노테이션 자료형이 추가되었다. 그 중 대표적인 어노테이션 @Override이다. @Override 어노테이션은 메서드 선언부에서만 사용할 수 있고, 부모 자료형에 선언된 메서드를 재정의 할 때 사용한다. 만약 메서드를 재정의 할 때 @Override 어노테이션을 입력하지 않으면 다음과 같은 문제가 발생할 수 있다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162package effective36; import java.util.Objects; /** * Stdudent c..

    Enum - 규칙 35 작명 패턴 대신 어노테이션을 사용하라.

    만약 특정 작업을 수행할 메서드를 구별하는데 메서드 이름을 사용한다고 가정해보자. 만약 testRoute라는 메서드를 tsetRoute라고 잘못 기입했다면? 이는 실행되지 않을 것이다. 이렇게 이름을 통해서 특정 기능을 실행하게 한다면, 오타와 같이 특수상황에서 실행이 되지 않았다는 것을 알기 어려울 뿐만아니라, 사용하기에도 네이밍 규칙을 지켜야하기 때문에 좋은 방법이 아니다. 이를 해결하기 위해서 사용하는 방법이 자바 1.5버전에 나온 어노테이션이다. 어노테이션을 이용하게 되면 실행될 메소드 지정하기 수월할 뿐 아니라 해당 메서드 안에서 예외가 발생하면 메서드가 실패한 것으로 지정하기도 편하다. 어노테이션 만들기 어노테이션 선언부 위에 존재하는 Retention, Target이라는 어노테이션들은 메타-..

    Enum - 규칙 34 확장 가능한 enum을 만들어야 한다면 인터페이스를 이용하라.

    연산자를 정의해둔 Enum을 사용할 때 더많은 유형의 자료형을 사용하기 위해서 기존의 enum객체를 계승해서 작성하고 싶을 수 있다. 하지만 enum 자료형은 계승해서 사용하는 방법은 어렵다. 왜냐하면 모든 Enum 객체들은 함축적으로 Enum 객체를 상속받고 있다. 자바에서는 클래스는 하나이상의 부모를 가질 수 없으므로, enum 객체는 추가 상속이 어렵다. 그렇기에 인터페이스를 먼저 구현하고 그에 맞게 enum을 구현할 수 있도록 인터페이스를 활용하는 방식으로 대처할 수 있다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676..

    Enum - 규칙 33 ordinal을 배열 첨자로 사용하는 대신 EnumMap을 이용하라.

    Enum 상수별로 특정정보들을 저장하고 싶을 때 EnumMap을 사용한다. 12345678910111213141516Class Fruit { enum Type { APPLE, BANANA, PEAR } final String name; final Type type; Fruit(String name, Type type) { this.name = name; this.type = type; }} Map fruitByType = new EnumMap(Herb.Type.class);for (Fruit.Type t : Fruit.Type.values()) { fruitByType.put(t, new HashSet());}Colored by Color Scriptercs EnumMap을 사용하면 깔끔하고 안전하며, ..

    Enum - 규칙 32 비트 필드(bit field) 대신 EnumSet을 사용하라.

    123456789public class Text { public static final int STYLE_BOLD = 1

    Enum - 규칙 31 ordinal 대신 객체 필드를 사용하라.

    Enum 상수에는 그 순서에 맞는 int 값이 반환된다. 1234567891011public enum Fruit { APPLE, BANANA, PEAR;} public class Main { public static void main (String args[]) { System.out.println(Fruit.BANANA.ordinal()); }} // 출력결과 1Colored by Color Scriptercs 하지만 이렇게 Enum의 oridnal 기능을 사용하는 것은 단점이 있다. 1. 상수 순서를 변경하게 되면 순서를 사용하던 곳에서 문제가발생할 수 있다. 2. 이미 사용한 정수값에 대응하는 새로운 enum 상수를 정의하는 것이 불가능 하다. 3. ordinal 간격이 1이 아닌 2나 3정도의 간..

    Enum - 규칙 30 int 상수 대신 enum을 사용하라.

    기존의 프로젝트에서 자주 사용 사용하는 설정 값이나 이름들을 열거 자료형으로서 다음같이 사용했다. 1234567// int를 사용한 enum 패턴public static final int FAIL = 1;public static final int SUCCESS = 2; // string을 사용한 enum 패턴public static final String FEMAIL = "3";public static final String MAIL = "4";cs int를 사용한 설정 값은 int enum 패턴, 문자열로 되어 있는 경우에는 string enum 패턴 이라고 한다. 하지만 이런 설정은 다음과 같은 단점이 있다. 1. 편의성이 떨어진다. 2. 이는 컴파일 시점 상수(compile-time constant..

    제네릭 - 규칙 29 형 안전 다형성 컨테이너를 쓰면 어떨지 따져보라

    제네릭은 Set이나 Map과 같이 하나 자료형을 가진 원소들을 담는 컨테이너에 가장 많이 사용된다. ex) Map, Set 그렇기 때문에 형인자는 컨테이너별로 고정되게 되어있다. 그러나 가끔 여러개의 자료형을 Map과 콜렉션에 컨테이너로서 사용하고 싶을 경우가 있을 것이다. 이는 다음과 같은 접근법을 사용하면 가능하다. 123456789101112131415161718192021222324252627282930import java.util.HashMap;import java.util.Map; public class Rule29 { public Map map = new HashMap(); public void putData(Class type, T instance) { map.put(type, instan..

    제네릭 - 규칙 28 한정적 와일드 카드를 써서 API 유연성을 높여라

    List와 같은 형인자 자료형은 불변 자료형이다. 이는 저번 규칙에서 보았듯이 List은 List의 어떠한 하위 자료형도 아니라는 것을 확인 하였다. 하지만 가끔은 불변 자료형보다 높은 유연성이 필요할 때가 있다. 예를 들어 일련의 원소들을 인자로 받아 차례로 스택에 집어 넣는 메서드가 있다고 가정하여 보자. 1234567891011121314package rule28; import java.util.Stack; public class Rule28 extends Stack{ private static final long serialVersionUID = 1L; public void pushAll(Iterable src) { for (E e : src) { push(e); } }}Colored by Col..

반응형