1 minute read

자바 버전 인식 불가 에러

💡 java: warning: source release 17 requires target release 17


나는 본 프로젝트를 자바 17를 사용하여 진행했다. Instanceof 매칭 등 자바 16버전 이후 지원하는 기능들을 코드에 반영했기 때문이다. 나의 경우 buld.gradle 에서 17버전으로 정상 세팅이 되어있었지만 이상하게도 해당 오류가 발생했다.

image

해결 방법


해당 오류는 프로젝트의 java 버전을 일관되게 설정해주지 않아서 발생하는 에러이다.

  1. 좌측 상단에 IDEA 메뉴 → 설정 → Gradle 메뉴에서 아래와 같이 설정을 잡아주었다.

image

자바 버전 17로 지정

  1. 어플리케이션 빌드 재구성 하기

image

image

해당 화면에서 java 11 버전을 17 로 바꾸어 주었다.

  1. 프로젝트 구조에서 버전 변경

image

파일 → 프로젝트 구조 변경 에서 SDK 와 언어 수준을 17로 통일 해주었더니 바로 정상적인 화면이 뜨는 걸 볼 수 있다.

자바 17 버전 업데이트 후 내가 사용한 Instanceof 매칭이란?

이전 버전 경우 Instanceof 내부에서 객체를 캐스팅 하는 과정이 필요하였으나, 캐스팅 과정을 내부에서 지원할 수 있도록 변경한 것을 의미한다.

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof ArticleComment)) return false;
    ArticleComment that = (ArticleComment) o;
    return id != null && id.equals(that.id);
}

자바 16이전 이전 코드

instanceof 다음에 변수를 선언하여 사용하는 Pattern Matching for instanceof는 Java 16부터 도입된 기능이므로 Java 11에서는 해당 문법을 직접 사용할 수 없다. Java 11에서는 이전의 방식을 사용하여 instanceof 연산자와 캐스팅 코드를 분리해서 작성해야 한다.

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof ArticleComment that)) return false;
        return id != null && id.equals(that.id);
    }

자바 17버전 사용 코드 (Instanceof 사용)

해당 에러를 해결하면서 느낀점은 에러를 방지하기 위해선 스탭 1부터 꼼꼼하게 확인하고 진행해야된다 것을 또 한번 느낄 수 있었다. 해당 에러는 금방 해결했지만, 별거 아닌 에러도 이렇게 글로 작성해서 기록해두면 추 후 개발시에 해당 오류를 사전에 방지하지 않을까 싶어 해당 글을 작성해본다.

Leave a comment