본문 바로가기
Language/Effective java

열거 타입과 애너테이션

by y.j 2022. 7. 23.
728x90

@Override 애너테이션을 일관되게 사용하라.

@Override는 메서드 선언에만 달 수 있으며, 이 애너테이션이 달렸다는 것은 상위 타입의 메서드를 재정의했음을 뜻한다. 잘 사용하게 되면 여러가지 악명 높은 버그들을 예방해준다.

public class Bigram {
    private final char first;
    private final char second;

    public Bigram(char first, char second) {
        this.first = first;
        this.second = second;
    }

    public boolean equals(Bigram b) {
        return b.first == first && b.second == second;
    }

    public int hashCode() {
        return 31 * first + second;
    }

    public static void main(String[] args) {
        Set<Bigram> s = new HashSet<>();
        for(int i = 0; i < 10; ++i)
            for(char ch = 'a'; ch <= 'z'; ++ch)
                s.add(new Bigram(ch, ch));
        System.out.println(s.size());
    }
}

위 코드는 260을 내보내게 된다. equals와 hashCode를 정의하는 것을 잊지 않았지만, 재정의가 아니라 다중정의가 되어버렸기 때문이다. Object의 equals를 재정의한게 아니라 개별의 객체로 인식되어버렸다.

@Override
public boolean equals(Object o) {
    if(!(o instanceof Bigram))
        return false;
    Bigram b = (Bigram) o;
    return b.first == first && b.second == second;
}

@Override
public int hashCode() {
    return 31 * first + second;
}

Override를 사용하면 버그를 잡을 수 있다. 구체 클래스에서 상위 클래스를 재정의 할 때 굳이 @Override를 쑤지 않아도 되지만 일괄로 붙여두는 것이 버그나 실수를 잡을 때 좋다.

 

정의하려는 것이 타입이라면 마커 인터페이스를 사용하라.

마커인터페이스란? 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해준다.

 

마커인터페이스가 마커애너테이션보다 나은 이유

1. 마커 인터페이스는 인스턴스들을 구분하는 타입으로 쓸 수 있어 런타임 오류를 컴파일 타임에 잡을 수 있다.

 - ObjectOutputSteam.writeObject는 Serializable을 구현한 객체가 올 것이라고 가정하지만 Object를 받도록 되어 있다.

   마커 인터페이스를 사용하면 컴파일 타임에 오류를 발견할 수 있다.

 

2. 적용대상을 더 정밀하게 지정 할 수 있다.

 - @Target의 ElementType.TYPE으로 선언한 애너테이션은 모든 타입에 달 수 있지만, 더 세밀하게 나누지는 못한다.

   반면에 마커인터페이스는 하위 타입으로 자동적으로 보장되기 때문에 더 세밀하게 타입을 정 할 수 있다.

 

마커애노테이션이 더 나은 점은?

거대한 애너테이션 시스템의 지원을 받는다는 점을 들 수 있다. 클래스와 인터페이스 외의 프로그램 요소( 모듈, 패키지, 필드, 지역변수 등) 에 마킹할 때 애너테이션을 쓸 수 밖에 없다. 

 

확장시킬 여지가 있다면 마커인터페이스를 없다면 마커애노테이션을 사용하도록 하자.

728x90

'Language > Effective java' 카테고리의 다른 글

람다와 스트림  (0) 2022.07.26
람다와 스트림  (0) 2022.07.24
열거 타입과 애너테이션  (0) 2022.07.20
열거 타입과 애너테이션  (0) 2022.07.18
열거 타입과 애너테이션  (0) 2022.07.13

댓글