[java] JSR 305과 자바 언어 기능 간의 비교 분석

소개

JSR 305는 자바 소스 코드에서 프로그래머의 의도와 규칙을 명확하게 표현하기 위한 어노테이션의 집합입니다. 이러한 어노테이션은 코드 리뷰, 정적 분석 도구, 문서 생성 등 다양한 방법으로 사용될 수 있습니다. 이번 글에서는 JSR 305의 어노테이션과 자바 언어 기능 간의 비교를 분석해보겠습니다.

JSR 305의 어노테이션

JSR 305은 다음과 같은 주요 어노테이션들을 포함하고 있습니다:

  1. @Nonnull: 해당 요소가 null이 될 수 없음을 나타냅니다.
  2. @Nullable: 해당 요소가 null이 될 수 있음을 나타냅니다.
  3. @CheckForNull: 해당 요소가 잠재적으로 null일 수 있음을 나타냅니다.
  4. @CheckReturnValue: 해당 메서드의 반환값이 무시되지 않아야 함을 나타냅니다.
  5. @Deprecated: 해당 요소가 더 이상 사용되지 않는 것을 나타냅니다.
  6. @Generated: 해당 요소가 코드 생성 도구에 의해 자동으로 생성되었음을 나타냅니다.
  7. @Immutable: 해당 클래스가 변경 불가능하다는 것을 나타냅니다.

자바 언어 기능과의 비교

위의 JSR 305의 어노테이션들과 비교하여 자바 언어가 제공하는 기능들은 다음과 같습니다:

  1. null 체크: 자바 8부터는 Objects.requireNonNull 메서드를 사용하여 null 체크를 수행할 수 있습니다. 이를 활용하여 @Nonnull, @Nullable, @CheckForNull과 같은 어노테이션 없이도 null 체크를 명시적으로 수행할 수 있습니다.
public void process(@Nonnull String data) {
    Objects.requireNonNull(data);
    // data 처리 로직
}
  1. @Override 어노테이션: 자바 5부터는 @Override 어노테이션을 사용하여 메서드 오버라이딩을 명시적으로 나타낼 수 있습니다. 이를 통해 오버라이드를 잘못하였을 경우 컴파일러가 경고를 표시해줍니다.
@Override
public String toString() {
    // toString 구현
}
  1. @Deprecated 어노테이션: 자바 5부터는 @Deprecated 어노테이션을 사용하여 더 이상 사용되지 않는 요소를 명시적으로 표시할 수 있습니다.
@Deprecated
public void legacyMethod() {
    // 구현
}
  1. 불변성: 자바에서는 final 키워드를 사용하여 변수, 메서드, 클래스를 변경 불가능하게 만들 수 있습니다.
public final class ImmutableClass {
    private final int id;
    
    public ImmutableClass(int id) {
        this.id = id;
    }
    
    public final int getId() {
        return id;
    }
}

결론

JSR 305의 어노테이션들은 자바 언어가 기존에 제공하는 기능들과 중복될 수 있는 경우가 있습니다. 자바 8부터 추가된 Objects.requireNonNull 메서드와 자바 5부터 제공되는 @Override, @Deprecated 어노테이션, 그리고 final 키워드를 사용함으로써 JSR 305에 의존하지 않고도 프로그래머의 의도와 규칙을 명확하게 표현할 수 있습니다.

참고 자료