Java에서 식별자 예상 오류

Suraj P 2023년10월12일
  1. 이해 <identifier> expected Java의 오류
  2. 예 1: 메서드의 매개변수에 데이터 유형 또는 이름이 누락된 경우
  3. 예 2: 식 문이 잘못 배치된 경우
  4. 예 3: 선언문이 잘못 배치된 경우
  5. 결론
Java에서 식별자 예상 오류

이번 글에서는 Java의 <identifier> expected 오류에 대해 알아봅니다.

이해 <identifier> expected Java의 오류

<identifier> expected는 초보 프로그래머가 직면하는 가장 일반적인 Java 컴파일 타임 오류입니다. 이 오류는 메서드 매개 변수에 데이터 형식이나 이름이 선언되지 않았거나 식 문이 메서드, 생성자 또는 초기화 블록 외부에 작성되었을 때 발생합니다.

Java에서 식별자는 첫 번째 문자가 문자 또는 $ 또는 _여야 하는 하나 이상의 문자 시퀀스이며 후속 문자는 문자, 숫자, $ 또는 _일 수 있습니다.

이러한 식별자는 변수, 메서드, 클래스, 패키지, 인터페이스 등의 이름을 지정하는 데 사용됩니다.

Java 코드가 컴파일되면 초기 단계에는 프로그램의 어휘 분석이 포함됩니다. 여기서 프로그램은 토큰으로 분류되며 식별자를 포함한 모든 토큰은 일련의 문법 규칙에 대해 확인됩니다.

그리고 문법 규칙에 따라 식별자가 예상되지만 존재하지 않고 그 자리에서 다른 것이 발견될 때마다 컴파일러는 <identifier> expected 오류를 발생시킵니다. 여기서 각괄호는 토큰 개체에 대한 참조를 나타냅니다.

이제 더 잘 이해하기 위해 몇 가지 예를 살펴보겠습니다.

예 1: 메서드의 매개변수에 데이터 유형 또는 이름이 누락된 경우

메소드 내부의 매개변수에는 데이터 뒤에 식별자인 변수 이름이 와야 합니다. 둘 중 하나가 누락되면 불가피하게 <식별자>가 예상됨 오류가 발생합니다.

  1. 매개변수의 데이터가 누락되었습니다.

    public class Demo {
      public static int square(x) {
        return x * x;
      }
    
      public static void main(String[] args) {
        System.out.println(square(10));
      }
    }
    

    출력:

    square.java:9: error: <identifier> expected
    public static int square(x) {
            	        	  ^
    1 error
    

    위의 오류를 관찰하면 변수 x에 데이터 유형이 없음을 알 수 있습니다. 데이터 유형을 지정하면 제대로 작동합니다.

    public class Demo {
      public static int square(int x) {
        return x * x;
      }
    
      public static void main(String[] args) {
        System.out.println(square(10));
      }
    }
    

    출력:

    100
    
  2. 매개변수의 데이터 유형은 식별자입니다. 여기에 변수 이름이 없습니다.

    public class Demo {
      public static int square(int) {
        return x * x;
      }
    
      public static void main(String[] args) {
        System.out.println(square(10));
      }
    }
    

    출력:

    square.java:9: error: <identifier> expected
    public static int square(int) {
            	        	   ^
    1 error
    

    위의 오류를 관찰하면 데이터 유형을 지정했지만 변수 이름을 첨부하지 않았음을 분명히 알 수 있습니다.

    public class Demo {
      public static int square(int x) {
        return x * x;
      }
    
      public static void main(String[] args) {
        System.out.println(square(10));
      }
    }
    

    출력:

    100
    

예 2: 식 문이 잘못 배치된 경우

식 문이 메서드, 생성자 또는 초기화 블록 <identifier> expected 외부에 작성되면 컴파일러에서 오류가 발생합니다.

예제 코드:

public class Demo {
  private String name;
  name = "Naruto";
  System.out.println(name);
}

출력:

Demo.java:9: error: <identifier> expected
  name = "Naruto";
      ^
Demo.java:10: error: <identifier> expected
  System.out.println(name);
                    ^
Demo.java:10: error: <identifier> expected
  System.out.println(name);
                        ^
3 errors

위의 오류를 관찰하면 명령문이 함수 또는 생성자 내에 포함되어 있지 않기 때문에 오류가 발생합니다. print라는 메서드 안에 이 명령문을 작성해 보겠습니다.

public class Demo {
  private String name;

  public void print() {
    name = "Naruto";
    System.out.println(name);
  }

  public static void main(String[] args) {
    Demo obj = new Demo();
    obj.print();
  }
}

출력:

Naruto

예 3: 선언문이 잘못 배치된 경우

이것은 드물지만 try-with-resources 문으로 작업할 때 들어 본 적이 없는 것은 아닙니다. 이러한 모든 명령문에서는 try 키워드 바로 뒤에 닫을 수 있는 리소스를 선언해야 합니다.

리소스 변수가 try-with-resources 문 외부에서 선언되면 컴파일러에서 <identifier> expected 오류가 발생할 수 있습니다(컴파일러마다 다를 수 있음).

예제 코드: 여기서 닫을 수 있는 리소스는 BufferedReader입니다.

import java.io.*;

public class Demo {
  public static void main(String[] args) {
    StringBuilder obj = new StringBuilder();
    BufferedReader br = null;

    try (br = new BufferedReader(new InputStreamReader(System.in))) {
      String lines = "";
      while (!(lines = br.readLine()).isBlank()) {
        obj.append(lines);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

출력:

Demo.java:13: error: <identifier> expected
        try (br = new BufferedReader(new InputStreamReader(System.in))) {
              ^
1 error

try 블록 내부에 BufferedReader obj를 선언하면 오류가 해결됩니다.

import java.io.*;

public class Demo {
  public static void main(String[] args) {
    StringBuilder obj = new StringBuilder();

    try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
      String lines = "";
      while (!(lines = br.readLine()).isBlank()) {
        obj.append(lines);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

결론

이 기사에서는 컴파일러에서 <identifier> expected 오류가 발생하는 이유와 초보자가 직면하는 가장 일반적인 컴파일 시간 오류인 이유에 대해 배웠습니다. 또한 이 오류가 발생한 경우를 분석하는 다양한 예를 살펴보았습니다.

작가: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

관련 문장 - Java Error