소개
Java 개발자로서 컴파일 중에 답답한 'cannot find symbol' 오류를 마주칠 수 있습니다. 이 오류는 Java 컴파일러가 코드에서 참조된 특정 변수, 메서드 또는 클래스를 찾을 수 없음을 나타냅니다. 이 흔한 문제의 원인과 해결책을 이해하는 것은 정확하고 효율적인 Java 프로그램을 작성하는 데 필수적입니다. 이 랩에서는 'cannot find symbol' 오류의 원인을 식별하고 이를 해결하기 위한 효과적인 기술을 적용하는 방법을 배우게 됩니다.
'cannot find symbol' 오류 이해하기
'cannot find symbol' 오류는 Java 의 컴파일 오류입니다. Java 컴파일러가 코드에서 사용되는 심볼 (변수, 메서드 또는 클래스 등) 의 정의를 찾을 수 없을 때 발생합니다. 이는 컴파일러가 해당 심볼이 무엇을 참조하는지 알지 못한다는 것을 의미합니다.
이 오류를 발생시키는 간단한 예제를 살펴보겠습니다.
Terminal > New Terminal을 클릭하여 WebIDE 의 통합 터미널을 엽니다.
터미널에서 아직 해당 디렉토리에 있지 않다면 프로젝트 디렉토리로 이동합니다. 기본 디렉토리는 /home/labex/project입니다.
WebIDE 파일 탐색기 또는 명령줄을 사용하여 /home/labex/project 디렉토리에 SymbolErrorExample.java라는 새 Java 파일을 생성합니다.
touch /home/labex/project/SymbolErrorExample.java
이제 WebIDE 편집기에서 /home/labex/project/SymbolErrorExample.java를 열고 다음 코드를 추가합니다.
public class SymbolErrorExample {
public static void main(String[] args) {
int myVariable = 10;
System.out.println(myVariabel); // Intentional typo
}
}
Ctrl + S를 누르거나 File > Save를 사용하여 파일을 저장합니다.
이제 터미널에서 javac 명령을 사용하여 코드를 컴파일합니다.
javac /home/labex/project/SymbolErrorExample.java
다음과 유사한 오류 메시지가 표시됩니다.
/home/labex/project/SymbolErrorExample.java:4: error: cannot find symbol
System.out.println(myVariabel); // Intentional typo
^
symbol: variable myVariabel
location: class SymbolErrorExample
1 error
이 오류 메시지는 컴파일러가 myVariabel 심볼을 찾을 수 없음을 명확하게 나타냅니다. 오류 위치도 제공되어 오타가 있는 변수가 사용된 줄을 가리킵니다.

이것은 단순한 오타로 인해 발생하는 'cannot find symbol' 오류의 전형적인 예입니다. 다음 단계에서는 다른 일반적인 원인과 이를 해결하는 방법을 살펴보겠습니다.
원인 1: 오타 또는 잘못된 식별자
이전 단계에서 보았듯이, 'cannot find symbol' 오류의 일반적인 원인은 변수, 메서드 또는 클래스 이름의 오타 또는 잘못된 철자입니다. 컴파일러는 사용자가 사용하는 식별자와 정확히 일치하는 것을 찾습니다.
SymbolErrorExample.java 파일의 오타를 수정해 보겠습니다.
WebIDE 편집기에서 /home/labex/project/SymbolErrorExample.java를 엽니다.
오타가 있는 변수 이름 myVariabel을 올바른 이름 myVariable로 변경합니다.
public class SymbolErrorExample {
public static void main(String[] args) {
int myVariable = 10;
System.out.println(myVariable); // Corrected spelling
}
}
Ctrl + S를 누르거나 File > Save를 사용하여 파일을 저장합니다.
이제 터미널에서 코드를 다시 컴파일합니다.
javac /home/labex/project/SymbolErrorExample.java
이번에는 컴파일이 성공해야 하며 오류 메시지가 표시되지 않습니다. SymbolErrorExample.class 파일이 동일한 디렉토리에 생성됩니다.
그런 다음 java 명령을 사용하여 컴파일된 코드를 실행할 수 있습니다.
java SymbolErrorExample
출력은 다음과 같습니다.
10
이것은 간단한 오타를 수정하는 방법이 'cannot find symbol' 오류를 해결하는 방법을 보여줍니다. 항상 식별자의 철자를 다시 확인하십시오.
원인 2: 잘못된 패키지 또는 누락된 import
'cannot find symbol' 오류의 또 다른 빈번한 원인은 현재 패키지에 없고 명시적으로 import 되지 않은 클래스를 사용하려는 경우입니다. Java 는 클래스를 패키지로 구성합니다. 다른 패키지의 클래스를 사용하려면 해당 클래스의 정규화된 이름 (패키지 포함) 을 사용하거나 클래스를 import 해야 합니다.
이를 시연하기 위해 새 예제를 만들어 보겠습니다.
/home/labex/project 디렉토리에 MissingImportExample.java라는 새 Java 파일을 생성합니다.
touch /home/labex/project/MissingImportExample.java
WebIDE 편집기에서 /home/labex/project/MissingImportExample.java를 열고 다음 코드를 추가합니다.
public class MissingImportExample {
public static void main(String[] args) {
ArrayList<String> myList = new ArrayList<>(); // Missing import for ArrayList
myList.add("Hello");
System.out.println(myList);
}
}
Ctrl + S를 누르거나 File > Save를 사용하여 파일을 저장합니다.
이제 코드를 컴파일합니다.
javac /home/labex/project/MissingImportExample.java
다음과 유사한 오류가 발생합니다.
/home/labex/project/MissingImportExample.java:3: error: cannot find symbol
ArrayList<String> myList = new ArrayList<>(); // Missing import for ArrayList
^
symbol: class ArrayList
location: class MissingImportExample
/home/labex/project/MissingImportExample.java:3: error: cannot find symbol
ArrayList<String> myList = new ArrayList<>(); // Missing import for ArrayList
^
symbol: class ArrayList
location: class MissingImportExample
2 errors
컴파일러는 ArrayList 심볼을 찾을 수 없습니다. 왜냐하면 java.util 패키지에 속하며 import 되지 않았기 때문입니다.
이를 해결하려면 파일 시작 부분에 import 문을 추가해야 합니다.
다시 /home/labex/project/MissingImportExample.java를 열고 맨 위에 다음 줄을 추가합니다.
import java.util.ArrayList;
public class MissingImportExample {
public static void main(String[] args) {
ArrayList<String> myList = new ArrayList<>();
myList.add("Hello");
System.out.println(myList);
}
}
Ctrl + S를 누르거나 File > Save를 사용하여 파일을 저장합니다.
코드를 다시 컴파일합니다.
javac /home/labex/project/MissingImportExample.java
이제 컴파일이 성공해야 합니다.
코드를 실행합니다.
java MissingImportExample
출력은 다음과 같습니다.
[Hello]
이것은 다른 패키지의 클래스를 사용할 때 올바른 import 문을 추가하면 'cannot find symbol' 오류가 해결됨을 보여줍니다. 또는 import 대신 정규화된 이름 java.util.ArrayList를 사용할 수도 있지만, 가독성을 위해 일반적으로 import 를 선호합니다.
원인 3: 초기화되지 않은 변수
Java 에서는 로컬 변수를 사용하기 전에 선언하고 초기화해야 합니다. 선언되었지만 값이 할당되지 않은 로컬 변수를 사용하려고 하면 컴파일러는 변수 이름이 존재하더라도 'cannot find symbol' 오류를 보고합니다. 이는 컴파일러가 아직 심볼이 나타내는 값을 알지 못하기 때문입니다.
예제를 만들어 보겠습니다.
/home/labex/project 디렉토리에 UninitializedVariableExample.java라는 새 Java 파일을 생성합니다.
touch /home/labex/project/UninitializedVariableExample.java
WebIDE 편집기에서 /home/labex/project/UninitializedVariableExample.java를 열고 다음 코드를 추가합니다.
public class UninitializedVariableExample {
public static void main(String[] args) {
int uninitializedVariable;
System.out.println(uninitializedVariable); // Using an uninitialized variable
}
}
Ctrl + S를 누르거나 File > Save를 사용하여 파일을 저장합니다.
코드를 컴파일합니다.
javac /home/labex/project/UninitializedVariableExample.java
다음과 같은 오류 메시지가 표시됩니다.
/home/labex/project/UninitializedVariableExample.java:4: error: variable uninitializedVariable might not have been initialized
System.out.println(uninitializedVariable); // Using an uninitialized variable
^
1 error
여기서 오류 메시지는 약간 다르지만 ("variable might not have been initialized"), 컴파일러가 심볼과 관련된 값을 결정할 수 없다는 점에서 'cannot find symbol' 개념과 밀접하게 관련되어 있습니다. 일부 컨텍스트 또는 이전 Java 버전에서는 이것이 'cannot find symbol' 오류로 나타날 수 있습니다. 핵심 문제는 정의된 값이 없는 변수를 사용하는 것입니다.
이를 해결하려면 사용하기 전에 변수를 초기화합니다.
다시 /home/labex/project/UninitializedVariableExample.java를 열고 코드를 수정합니다.
public class UninitializedVariableExample {
public static void main(String[] args) {
int initializedVariable = 0; // Initialize the variable
System.out.println(initializedVariable);
}
}
Ctrl + S를 누르거나 File > Save를 사용하여 파일을 저장합니다.
코드를 다시 컴파일합니다.
javac /home/labex/project/UninitializedVariableExample.java
이제 컴파일이 성공해야 합니다.
코드를 실행합니다.
java UninitializedVariableExample
출력은 다음과 같습니다.
0
이것은 사용하기 전에 로컬 변수를 초기화하는 것이 정의되지 않은 심볼 또는 초기화되지 않은 변수와 관련된 컴파일 오류를 방지하는 데 중요하다는 것을 보여줍니다.
원인 4: 잘못된 메서드 시그니처 (Method Signature)
메서드를 호출할 때 컴파일러는 해당 이름과 올바른 수와 유형의 인수 (메서드 시그니처) 를 가진 메서드가 있는지 확인합니다. 호출과 일치하는 메서드를 찾을 수 없으면 'cannot find symbol' 오류가 발생합니다.
예제를 만들어 보겠습니다.
/home/labex/project 디렉토리에 IncorrectMethodCallExample.java라는 새 Java 파일을 생성합니다.
touch /home/labex/project/IncorrectMethodCallExample.java
WebIDE 편집기에서 /home/labex/project/IncorrectMethodCallExample.java를 열고 다음 코드를 추가합니다.
public class IncorrectMethodCallExample {
public static void greet(String name) {
System.out.println("Hello, " + name);
}
public static void main(String[] args) {
greet("Alice", 25); // Calling greet with incorrect arguments
}
}
Ctrl + S를 누르거나 File > Save를 사용하여 파일을 저장합니다.
코드를 컴파일합니다.
javac /home/labex/project/IncorrectMethodCallExample.java
다음과 유사한 오류 메시지가 표시됩니다.
/home/labex/project/IncorrectMethodCallExample.java:8: error: cannot find symbol
greet("Alice", 25); // Calling greet with incorrect arguments
^
symbol: method greet(String,int)
location: class IncorrectMethodCallExample
1 error
오류 메시지는 컴파일러가 String과 int를 인수로 받는 greet라는 메서드를 찾을 수 없음을 나타냅니다. greet 메서드가 있다는 것을 알고 있지만, 시그니처 greet(String,int)는 정의된 greet(String) 메서드와 일치하지 않습니다.
이를 해결하려면 메서드 호출이 메서드의 시그니처와 일치하는지 확인합니다.
다시 /home/labex/project/IncorrectMethodCallExample.java를 열고 main 메서드를 수정합니다.
public class IncorrectMethodCallExample {
public static void greet(String name) {
System.out.println("Hello, " + name);
}
public static void main(String[] args) {
greet("Alice"); // Calling greet with the correct argument
}
}
Ctrl + S를 누르거나 File > Save를 사용하여 파일을 저장합니다.
코드를 다시 컴파일합니다.
javac /home/labex/project/IncorrectMethodCallExample.java
이제 컴파일이 성공해야 합니다.
코드를 실행합니다.
java IncorrectMethodCallExample
출력은 다음과 같습니다.
Hello, Alice
이것은 메서드 시그니처와 관련된 'cannot find symbol' 오류를 방지하려면 메서드 호출의 인수 수와 유형이 메서드의 정의와 일치해야 함을 보여줍니다.
요약
이 랩에서는 Java 에서 흔히 발생하는 'cannot find symbol' 오류를 식별하고 해결하는 방법을 배웠습니다. 오타가 있는 식별자, 누락된 import, 초기화되지 않은 변수, 잘못된 메서드 시그니처 (method signature) 를 포함한 주요 원인을 살펴보았습니다. 이러한 문제들을 이해하고 해결책을 실습함으로써 이 오류를 효과적으로 해결하고 수정하여 더욱 강력하고 오류 없는 Java 프로그램을 만들 수 있습니다. 'cannot find symbol' 오류가 발생하면 이러한 일반적인 함정에 대해 코드를 주의 깊게 확인하십시오.



