자바 프로그램에서 외부 클래스나 인터페이스(직접 작성한 클래스 또는 JDK에 내장된 클래스)를 사용하려면 import 키워드를 통해 해당 클래스를 현재 프로그램으로 가져와야 합니다.
'기호를 찾을 수 없음' 오류가 발생하는 원인
클래스를 가져올(import) 때 아래와 같은 문제가 있으면 컴파일러는 "cannot find symbol"(기호를 찾을 수 없음) 오류를 발생시킵니다.
- 가져오려는 클래스/인터페이스의 경로가 JVM에서 인식되지 않는 경우
- import 문에 명시한 클래스 이름이 정확하지 않은 경우 (패키지명과 클래스명 전체 포함)
- 코드에서 사용한 클래스나 인터페이스를 아예 가져오지 않은 경우
그 밖에도 변수나 메서드를 선언하지 않고 사용했거나, 대소문자를 잘못 입력한 경우에도 동일한 오류가 발생할 수 있습니다.
오류 발생 예제
다음 예제는 키보드(System.in)로부터 사용자 이름을 문자열로 입력받는 코드입니다. 입력 처리를 위해 java.util 패키지의 Scanner 클래스를 사용합니다.
public class ReadingData {
public static void main(String args[]) {
System.out.println("Enter your name: ");
Scanner sc = new Scanner(System.in);
String name = sc.next();
System.out.println("Hello " + name);
}
}
컴파일 타임 오류
위 코드는 Scanner 클래스를 사용하면서도 이를 import하지 않았습니다. 따라서 컴파일 시 다음과 같은 오류가 발생합니다.
ReadingData.java:4: error: cannot find symbol
Scanner sc = new Scanner(System.in);
^
symbol: class Scanner
location: class ReadingData
ReadingData.java:5: error: cannot find symbol
String name = sc.next();
^
symbol: variable sc
location: class ReadingData
2 errors
해결 방법
- 필요한 클래스가 포함된 JAR 파일의 클래스패스(classpath)를 올바르게 설정합니다.
- import 키워드를 사용해 해당 패키지에서 필요한 클래스를 가져옵니다. 이때 패키지와 하위 패키지를 모두 포함하는 전체 경로(정규화된 클래스명)를 정확하게 지정해야 합니다.
수정된 예제
import java.util.Scanner;
public class ReadingData {
public static void main(String args[]) {
System.out.println("Enter your name: ");
Scanner sc = new Scanner(System.in);
String name = sc.next();
System.out.println("Hello " + name);
}
}
실행 결과
Enter your name: krishna Hello krishna
이처럼 'cannot find symbol' 오류는 대부분 클래스 선언부 누락, import 문 누락 또는 오타에서 비롯됩니다. 오류 메시지에 표시된 심볼(symbol)과 위치(location)를 먼저 확인하면 원인을 빠르게 파악할 수 있습니다.