HOWTO · Java

Java의 `.class expected` 컴파일러 진단

이 가이드에서는 Java 컴파일러의 `.class expected` 진단이 무엇을 의미하는지 살펴봅니다.

이 페이지의 내용

Java 컴파일러의 .class expected 진단은 표시된 모든 줄에 .class 리터럴을 추가해야 한다는 뜻이 아닙니다. 의미는 소스 코드의 문맥에 따라 달라집니다. 아래 예제에서는 sorting[] 인수가 문제입니다. Java에서는 int[] 같은 배열 타입에 []를 사용할 수 있지만, 메서드에 전달하는 식은 이미 존재하는 변수 sorting입니다.

.class expected 진단의 의미

이것은 컴파일 시점에 발생하는 진단입니다. 프로그램을 실행하기 전에 컴파일러가 소스를 파싱하거나 컴파일하면서 보고합니다. 컴파일러 메시지에는 소스 줄 번호와 파싱이 멈춘 위치를 가리키는 표시가 포함되는 경우가 많습니다. 이 위치는 유용한 단서지만, 실제 실수는 표시 바로 앞에 있을 수도 있습니다. 예를 들어 예상하지 못한 대괄호가 있거나 구분 기호가 빠졌을 수 있습니다.

.class expected라는 문구는 해당 파싱 문맥에서 컴파일러가 기대한 것을 나타냅니다. 이 진단의 원인이 하나로 정해지는 것은 아니며, 모든 Java 구문 오류가 이 진단을 발생시키는 것도 아닙니다. 여기서 살펴볼 문맥은 Arrays.sort에 전달하는 배열 인수입니다. 변수 자체가 이미 배열 값을 가리키므로, 변수 뒤에 빈 대괄호를 붙이는 것은 유효한 식 문법이 아닙니다.

sorting[]으로 오류 재현하기

살펴볼 부분은 sorting[] 식입니다. 변수 선언에서 int[] sorting의 대괄호는 배열 타입의 일부입니다. 메서드를 호출할 때 sorting은 배열 객체를 가리킵니다. 대괄호는 배열의 타입을 전달하거나 새 배열을 만들라는 뜻이 아닙니다.

예를 들어 다음 호출에는 오류가 있습니다. Arrays.sort(sorting[]);. 제공된 컴파일러 진단은 .class expected입니다. 정확한 문구와 줄 번호는 Java 컴파일러 버전이나 주변 소스 코드에 따라 달라질 수 있습니다. 중요한 단서는 표시가 잘못된 인수 부분을 가리킨다는 점입니다. 여기에 .class를 추가하면 식이 달라질 뿐 배열이 정렬되지는 않습니다.

배열 인수 수정하기

배열 변수 자체를 전달하세요: Arrays.sort(sorting);. 다음 완전한 프로그램은 올바르게 수정한 형태를 보여 줍니다. 지역 배열을 사용해 제자리에서 정렬한 다음, 값을 읽기 쉬운 형식으로 표시합니다.

이 예제를 실행하세요:

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] sorting = {3, 1, 2};
        Arrays.sort(sorting);
        System.out.println(Arrays.toString(sorting));
    }
}
[1, 2, 3]

Arrays.sort는 배열 값을 인수로 받으며, 정렬한 뒤에도 같은 변수가 정렬된 배열을 가리킵니다. 핵심 수정은 배열 선언을 바꾸거나 클래스 리터럴을 추가하는 것이 아니라 인수 뒤의 []를 삭제하는 것입니다.

빈 배열도 이 오버로드에 유효한 입력입니다. 수정된 이 예제는 성공적으로 실행되어 빈 목록을 출력했습니다:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] sorting = {};
        Arrays.sort(sorting);
        System.out.println(Arrays.toString(sorting));
    }
}
[]

요소가 없는 배열도 같은 호출에 변수로 전달할 수 있습니다. 선언에는 여전히 int[]를 사용하고, 메서드 인수에는 sorting을 전달합니다.

컴파일러가 가리킨 위치 진단하기

진단이 나타나면 다음의 짧고 반복 가능한 절차로 코드를 살펴보세요.

  1. 컴파일러 메시지 전체를 읽고 파일, 줄 번호, 표시 위치를 확인합니다. 원래 오타보다 뒤에서 파싱이 실패할 수도 있으므로 표시 위치를 조사 시작점으로 삼으세요.
  2. 해당 줄과 바로 앞 줄을 살펴봅니다. 대괄호, 괄호, 쉼표, 세미콜론이 주변 식과 맞게 짝을 이루는지 확인하세요.
  3. 코드가 타입을 선언하는지 값을 사용하는지 구분합니다. int[] sorting은 선언이고, Arrays.sort(sorting)은 변수를 사용하는 메서드 호출입니다.
  4. 식이 메서드가 요구하는 인수와 맞는지 비교합니다. 이 예제에서 Arrays.sort에는 배열 참조를 전달해야 하며, 변수 뒤에 대괄호를 붙이지 않습니다.
  5. 수정한 뒤 다시 컴파일하고 새 진단이 있으면 확인합니다. 처음 보고된 문제부터 고쳐서 반복하세요. 하나의 구문 오류가 뒤에 있는 오류를 가릴 수 있습니다.

컴파일러가 가리킨 위치와 소스 코드가 뒷받침하지 않는 한, 여분의 중괄호, 잘못 배치된 메서드, import 또는 파일 이름 불일치가 이 특정 메시지의 원인이라고 단정하지 마세요. 이런 문제는 다른 컴파일 오류를 일으킬 수 있습니다. 일반적인 .class 해결책을 적용하는 대신 실제 소스와 메시지를 기준으로 조사하세요.

수정된 프로그램 확인하기

인수를 sorting으로 바꾼 뒤 프로젝트와 설치된 JDK에 맞는 명령으로 소스를 컴파일하고 클래스를 실행하세요. 프로그램의 정렬 호출은 배열을 제자리에서 변경하며, Arrays.toString은 요소를 읽기 쉬운 문자열로 바꿉니다. 제공된 실행 증거에 따르면 수정된 두 예제는 모두 성공적으로 실행되었습니다. 요소가 있는 배열은 [1, 2, 3]을 출력했고, 빈 배열은 []를 출력했습니다. 이 증거는 수정된 호출만 다루며 잘못된 sorting[] 호출이 실행되었다는 뜻은 아닙니다.

같은 진단이 계속 나타나면 편집한 파일이 실제로 컴파일되는 파일인지, 보고된 줄 번호가 현재 소스와 일치하는지 확인하세요. 그런 다음 주변 구두점과 여는 괄호와 닫는 괄호를 포함한 전체 호출을 살펴보세요. 컴파일러 문구와 줄 표시는 버전에 따라 달라질 수 있으므로, 메시지만 믿지 말고 코드와 함께 확인하세요. 이 예제의 해결 방법은 분명합니다. 타입 선언에는 []를 사용하고, 배열 변수는 sorting으로 전달하세요.