소개
Java 프로그래밍을 배우다 보면 필연적으로 다양한 오류와 예외를 마주하게 됩니다. 많은 초보자들이 겪는 흔한 오류 중 하나는 "Could Not Find or Load Main Class" 오류입니다. 이 오류는 Java Virtual Machine (JVM) 이 애플리케이션의 진입점 역할을 하는 main 메서드를 포함하는 클래스를 찾거나 로드할 수 없을 때 발생합니다.
이 Lab 에서는 이 오류의 일반적인 원인을 살펴보고 이를 해결하기 위한 다양한 접근 방식을 배웁니다. 이 오류의 근본적인 원인을 이해함으로써, 앞으로 Java 프로그래밍을 하면서 유사한 문제를 더 잘 처리할 수 있게 될 것입니다.
간단한 Java 프로그램 생성
이 단계에서는 Java 컴파일 및 실행의 기본 사항을 이해하기 위해 간단한 Java 프로그램을 생성합니다.
먼저, 새로운 Java 파일을 생성해 보겠습니다. WebIDE 에서 프로젝트 디렉토리 (
~/project) 로 이동하여HelloWorld.java라는 새 파일을 생성합니다.다음 코드를
HelloWorld.java파일에 추가합니다.
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java World!");
}
}
이 코드가 무엇을 하는지 이해해 봅시다:
public class HelloWorld: HelloWorld 라는 public 클래스를 정의합니다.public static void main(String[] args): 모든 Java 애플리케이션의 진입점인 main 메서드를 정의합니다.System.out.println("Hello, Java World!"): 콘솔에 "Hello, Java World!" 텍스트를 출력합니다.
가장 중요한 부분은 클래스 이름 (HelloWorld) 이 파일 이름 (HelloWorld.java) 과 일치한다는 것입니다. 이 명명 규칙은 Java 에서 매우 중요하며, 이를 따르지 않으면 "Could Not Find or Load Main Class" 오류의 흔한 원인이 됩니다.
- Ctrl+S 를 누르거나 메뉴에서 파일 > 저장을 선택하여 파일을 저장합니다.
Java 프로그램 컴파일 및 실행
이제 Java 프로그램을 생성했으므로, 이를 컴파일하고 실행해야 합니다. Java 에서 컴파일은 사람이 읽을 수 있는 코드 (소스 코드) 를 Java Virtual Machine (JVM) 이 이해할 수 있는 바이트코드로 변환합니다.
메뉴에서 터미널 > 새 터미널을 클릭하여 WebIDE 에서 터미널을 엽니다 (아직 열려 있지 않은 경우).
올바른 디렉토리에 있는지 확인합니다:
cd ~/project
javac명령을 사용하여 Java 프로그램을 컴파일합니다:
javac HelloWorld.java
출력이 없으면 컴파일이 성공적으로 완료되었음을 의미합니다. 컴파일 프로세스는 동일한 디렉토리에 HelloWorld.class라는 파일을 생성합니다. 이 .class 파일에는 JVM 이 실행할 수 있는 바이트코드가 포함되어 있습니다.
디렉토리 내용을 나열하여 이 파일의 생성을 확인할 수 있습니다:
ls
출력에 HelloWorld.java와 HelloWorld.class 파일이 모두 표시되어야 합니다:
HelloWorld.class HelloWorld.java
java명령을 사용하여 컴파일된 프로그램을 실행합니다:
java HelloWorld
다음 출력이 표시되어야 합니다:
Hello, Java World!
이는 프로그램이 성공적으로 컴파일되고 실행되었음을 나타냅니다.
다음 단계에서 "Could Not Find or Load Main Class" 오류를 살펴보기 전에 이 기본적인 워크플로우를 이해하는 것이 필수적입니다.
"Could Not Find or Load Main Class" 오류 이해하기
이제 Java 프로그램을 컴파일하고 실행하는 기본 사항을 이해했으므로, "Could Not Find or Load Main Class" 오류와 그 일반적인 원인을 살펴보겠습니다.
오류 시나리오 1: 클래스 이름 불일치
이 오류의 가장 흔한 원인 중 하나는 코드의 클래스 이름과 파일 이름 간의 불일치입니다.
- 다음 내용으로
NameMismatch.java라는 새 파일을 생성합니다:
public class IncorrectName {
public static void main(String[] args) {
System.out.println("This program will cause an error!");
}
}
클래스 이름 (IncorrectName) 이 파일 이름 (NameMismatch.java) 과 일치하지 않음을 확인합니다.
- 이 파일을 컴파일해 봅니다:
javac NameMismatch.java
컴파일은 성공해야 하지만, IncorrectName.class라는 파일이 생성됩니다 (파일 이름이 아닌 클래스 이름과 일치).
- 이제 파일 이름을 사용하여 프로그램을 실행해 봅니다:
java NameMismatch
다음 오류가 표시됩니다:
Error: Could not find or load main class NameMismatch
Caused by: java.lang.ClassNotFoundException: NameMismatch
- 이 오류를 해결하려면 올바른 클래스 이름을 사용하여 프로그램을 실행해야 합니다:
java IncorrectName
이제 다음 출력이 표시됩니다:
This program will cause an error!
오류 시나리오 2: 잘못된 디렉토리에서 실행
또 다른 일반적인 원인은 컴파일된 .class 파일이 포함되지 않은 디렉토리에서 Java 클래스를 실행하려고 할 때 발생합니다.
- 이 데모를 위해 하위 디렉토리를 생성합니다:
mkdir subdirectory
- 이 새 디렉토리로 변경합니다:
cd subdirectory
- 이 디렉토리에서 HelloWorld 프로그램을 실행해 봅니다:
java HelloWorld
다음 오류가 표시됩니다:
Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
이 오류를 해결하려면 다음 중 하나를 수행합니다:
.class파일이 포함된 디렉토리로 다시 이동합니다:
cd .. java HelloWorld- 또는 클래스 파일의 전체 경로를 지정합니다 (5 단계에서 살펴보겠습니다).
다음 단계를 위해 프로젝트 디렉토리로 다시 이동합니다:
cd ~/project
Java 패키지 사용법
Java 의 패키지는 클래스를 네임스페이스 (namespace) 로 구성하는 데 사용됩니다. 이름 충돌을 방지하고 접근 제어를 제공하여 대규모 애플리케이션을 관리하는 데 도움이 됩니다. 그러나 패키지를 잘못 사용하면 "Could Not Find or Load Main Class" 오류가 발생할 수도 있습니다.
패키지 구조 이해
- 먼저, 패키지를 위한 디렉토리 구조를 생성해 보겠습니다. Java 에서 패키지 구조는 디렉토리 구조와 일치해야 합니다:
mkdir -p ~/project/com/example
com/example디렉토리 내에PackagedClass.java라는 새 Java 파일을 생성합니다:
cd ~/project/com/example
PackagedClass.java에 다음 코드를 추가합니다:
package com.example;
public class PackagedClass {
public static void main(String[] args) {
System.out.println("This class is in a package!");
}
}
파일 상단에 있는 package com.example; 선언에 유의하십시오. 이는 Java 에 이 클래스가 com.example 패키지에 속한다는 것을 알려줍니다.
- 프로젝트 디렉토리로 다시 이동하여 파일을 컴파일합니다:
cd ~/project
javac com/example/PackagedClass.java
- 클래스 이름만 사용하여 클래스를 실행하려고 하면 오류가 발생합니다:
java PackagedClass
출력:
Error: Could not find or load main class PackagedClass
Caused by: java.lang.ClassNotFoundException: PackagedClass
- 패키지 내의 클래스를 실행하는 올바른 방법은 정규화된 클래스 이름 (패키지 포함) 을 사용하는 것입니다:
java com.example.PackagedClass
이제 다음 출력이 표시됩니다:
This class is in a package!
패키지에 대한 중요 사항
- 패키지 선언은 파일의 첫 번째 문장이어야 합니다.
- 디렉토리 구조는 패키지 구조와 일치해야 합니다.
- 패키지된 클래스를 실행할 때는 정규화된 클래스 이름을 사용해야 합니다.
- 컴파일 명령에는 소스 파일의 경로가 포함되어야 하지만, 실행 명령은 파일 경로가 아닌 패키지 및 클래스 이름을 사용해야 합니다.
이 패키지 시스템은 Java 개발, 특히 대규모 애플리케이션에 필수적입니다.
Classpath 를 사용하여 클래스 로딩 문제 해결하기
클래스패스 (classpath) 는 Java Virtual Machine(JVM) 에 클래스와 패키지를 어디에서 찾아야 하는지 알려주는 매개변수입니다. 특히 더 복잡한 프로젝트에서 "Could Not Find or Load Main Class" 오류를 해결하려면 클래스패스를 사용하는 방법을 이해하는 것이 필수적입니다.
클래스패스란 무엇인가?
클래스패스는 클래스 파일을 포함하는 디렉토리, JAR 파일 및 ZIP 파일의 목록입니다. JVM 은 프로그램을 로드하고 실행할 때 이 목록을 사용하여 클래스를 검색합니다.
클래스패스 매개변수 사용
클래스패스 사용법을 시연하기 위해 새로운 디렉토리 구조를 만들어 보겠습니다:
- 컴파일된 클래스를 위한 새 디렉토리를 생성합니다:
mkdir -p ~/project/classes
- 프로젝트 디렉토리에
ClasspathDemo.java라는 새 Java 파일을 생성합니다:
public class ClasspathDemo {
public static void main(String[] args) {
System.out.println("Successfully loaded class using classpath!");
}
}
- Java 파일을 컴파일하지만,
.class파일이classes디렉토리에 배치되도록 지정합니다:
javac -d classes ClasspathDemo.java
-d 옵션은 컴파일된 클래스 파일의 대상 디렉토리를 지정합니다. 클래스 파일이 지정된 디렉토리에 생성되었는지 확인할 수 있습니다:
ls classes
다음과 같은 출력이 표시되어야 합니다:
ClasspathDemo.class
- 이제 클래스패스를 지정하지 않고 프로그램을 실행해 봅니다:
java ClasspathDemo
다음 오류가 표시됩니다:
Error: Could not find or load main class ClasspathDemo
Caused by: java.lang.ClassNotFoundException: ClasspathDemo
- 이 오류를 해결하려면 프로그램을 실행할 때 클래스패스를 지정해야 합니다:
java -classpath classes ClasspathDemo
또는 더 짧은 -cp 옵션을 사용할 수 있습니다:
java -cp classes ClasspathDemo
이제 다음 출력이 표시됩니다:
Successfully loaded class using classpath!
클래스패스 환경 변수 설정
Java 프로그램을 실행할 때마다 클래스패스를 지정하는 대신, CLASSPATH 환경 변수를 설정할 수 있습니다:
export CLASSPATH=~/project/classes:$CLASSPATH
이 환경 변수를 설정한 후에는 -classpath 옵션 없이 프로그램을 실행할 수 있습니다:
java ClasspathDemo
그리고 동일한 출력이 표시되어야 합니다:
Successfully loaded class using classpath!
클래스패스를 사용해야 하는 경우
다음과 같은 경우 클래스패스를 사용해야 합니다:
- 클래스가 현재 디렉토리에 없는 경우
- 타사 라이브러리 (JAR 파일) 를 사용하는 경우
- 여러 소스 디렉토리가 있는 복잡한 프로젝트 구조를 가진 경우
- Maven 또는 Gradle 과 같은 빌드 도구를 사용하는 경우 (클래스패스를 관리해 줍니다)
클래스패스를 이해하는 것은 간단한 단일 파일 프로그램을 넘어선 Java 개발에 매우 중요하며, 더 복잡한 설정에서 "Could Not Find or Load Main Class" 오류에 대한 해결책인 경우가 많습니다.
요약
이 랩을 통해 Java 에서 흔히 발생하는 "Could Not Find or Load Main Class" 오류를 살펴보고 이를 해결하기 위한 여러 가지 방법을 배웠습니다. 다음은 우리가 다룬 내용의 요약입니다:
기본적인 Java 컴파일 및 실행:
javac및java명령을 사용하여 간단한 Java 프로그램을 생성, 컴파일 및 실행하는 방법을 배웠습니다.일반적인 오류 원인:
- 코드와 파일 이름 간의 클래스 이름 불일치
- 잘못된 디렉토리에서 실행
- 잘못된 패키지 사용
- 클래스패스 문제
패키지 사용: 패키지 구조와 디렉토리 구조 간의 관계, 패키지된 클래스를 올바르게 실행하는 방법을 포함하여 Java 에서 패키지가 작동하는 방식을 살펴보았습니다.
클래스패스 사용: 특히 복잡한 프로젝트에 유용한 클래스를 찾을 위치를 JVM 에 알려주는 클래스패스 옵션을 사용하는 방법을 배웠습니다.
"Could Not Find or Load Main Class" 오류는 처음에는 답답하게 느껴질 수 있지만, 그 원인을 이해하면 진단하고 수정하기가 훨씬 쉬워집니다. 다음 핵심 사항을 기억하십시오:
- 코드의 클래스 이름은 파일 이름과 일치해야 합니다 (
.java확장자 제외) - 패키지를 사용할 때는 디렉토리 구조가 패키지 구조와 일치해야 합니다
- 항상 올바른 디렉토리에서 Java 프로그램을 실행하거나 클래스패스를 사용하여 클래스가 있는 위치를 지정하십시오
- 패키지된 클래스의 경우 프로그램을 실행할 때 정규화된 클래스 이름 (패키지 포함) 을 사용하십시오
이러한 개념을 숙달하면 Java 개발 여정에서 이 일반적인 오류를 피하거나 빠르게 해결할 수 있습니다.



