Java에서 식별자 예상 오류
-
이해
<identifier> expected
Java의 오류 - 예 1: 메서드의 매개변수에 데이터 유형 또는 이름이 누락된 경우
- 예 2: 식 문이 잘못 배치된 경우
- 예 3: 선언문이 잘못 배치된 경우
- 결론
이번 글에서는 Java의 <identifier> expected
오류에 대해 알아봅니다.
이해 <identifier> expected
Java의 오류
<identifier> expected
는 초보 프로그래머가 직면하는 가장 일반적인 Java 컴파일 타임 오류입니다. 이 오류는 메서드 매개 변수에 데이터 형식이나 이름이 선언되지 않았거나 식 문이 메서드, 생성자 또는 초기화 블록 외부에 작성되었을 때 발생합니다.
Java에서 식별자는 첫 번째 문자가 문자 또는 $
또는 _
여야 하는 하나 이상의 문자 시퀀스이며 후속 문자는 문자, 숫자, $
또는 _
일 수 있습니다.
이러한 식별자는 변수, 메서드, 클래스, 패키지, 인터페이스 등의 이름을 지정하는 데 사용됩니다.
Java 코드가 컴파일되면 초기 단계에는 프로그램의 어휘 분석이 포함됩니다. 여기서 프로그램은 토큰으로 분류되며 식별자를 포함한 모든 토큰은 일련의 문법 규칙에 대해 확인됩니다.
그리고 문법 규칙에 따라 식별자가 예상되지만 존재하지 않고 그 자리에서 다른 것이 발견될 때마다 컴파일러는 <identifier> expected
오류를 발생시킵니다. 여기서 각괄호는 토큰 개체에 대한 참조를 나타냅니다.
이제 더 잘 이해하기 위해 몇 가지 예를 살펴보겠습니다.
예 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
-
매개변수의 데이터 유형은 식별자입니다. 여기에 변수 이름이 없습니다.
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
오류가 발생하는 이유와 초보자가 직면하는 가장 일반적인 컴파일 시간 오류인 이유에 대해 배웠습니다. 또한 이 오류가 발생한 경우를 분석하는 다양한 예를 살펴보았습니다.