Java 에서 'Could Not Find or Load Main Class' 오류 해결

JavaBeginner
지금 연습하기

소개

Java 프로그래밍을 배우다 보면 필연적으로 다양한 오류와 예외를 마주하게 됩니다. 많은 초보자들이 겪는 흔한 오류 중 하나는 "Could Not Find or Load Main Class" 오류입니다. 이 오류는 Java Virtual Machine (JVM) 이 애플리케이션의 진입점 역할을 하는 main 메서드를 포함하는 클래스를 찾거나 로드할 수 없을 때 발생합니다.

이 Lab 에서는 이 오류의 일반적인 원인을 살펴보고 이를 해결하기 위한 다양한 접근 방식을 배웁니다. 이 오류의 근본적인 원인을 이해함으로써, 앞으로 Java 프로그래밍을 하면서 유사한 문제를 더 잘 처리할 수 있게 될 것입니다.

간단한 Java 프로그램 생성

이 단계에서는 Java 컴파일 및 실행의 기본 사항을 이해하기 위해 간단한 Java 프로그램을 생성합니다.

  1. 먼저, 새로운 Java 파일을 생성해 보겠습니다. WebIDE 에서 프로젝트 디렉토리 (~/project) 로 이동하여 HelloWorld.java라는 새 파일을 생성합니다.

  2. 다음 코드를 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" 오류의 흔한 원인이 됩니다.

  1. Ctrl+S 를 누르거나 메뉴에서 파일 > 저장을 선택하여 파일을 저장합니다.

Java 프로그램 컴파일 및 실행

이제 Java 프로그램을 생성했으므로, 이를 컴파일하고 실행해야 합니다. Java 에서 컴파일은 사람이 읽을 수 있는 코드 (소스 코드) 를 Java Virtual Machine (JVM) 이 이해할 수 있는 바이트코드로 변환합니다.

  1. 메뉴에서 터미널 > 새 터미널을 클릭하여 WebIDE 에서 터미널을 엽니다 (아직 열려 있지 않은 경우).

  2. 올바른 디렉토리에 있는지 확인합니다:

cd ~/project
  1. javac 명령을 사용하여 Java 프로그램을 컴파일합니다:
javac HelloWorld.java

출력이 없으면 컴파일이 성공적으로 완료되었음을 의미합니다. 컴파일 프로세스는 동일한 디렉토리에 HelloWorld.class라는 파일을 생성합니다. 이 .class 파일에는 JVM 이 실행할 수 있는 바이트코드가 포함되어 있습니다.

디렉토리 내용을 나열하여 이 파일의 생성을 확인할 수 있습니다:

ls

출력에 HelloWorld.javaHelloWorld.class 파일이 모두 표시되어야 합니다:

HelloWorld.class  HelloWorld.java
  1. 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: 클래스 이름 불일치

이 오류의 가장 흔한 원인 중 하나는 코드의 클래스 이름과 파일 이름 간의 불일치입니다.

  1. 다음 내용으로 NameMismatch.java라는 새 파일을 생성합니다:
public class IncorrectName {
    public static void main(String[] args) {
        System.out.println("This program will cause an error!");
    }
}

클래스 이름 (IncorrectName) 이 파일 이름 (NameMismatch.java) 과 일치하지 않음을 확인합니다.

  1. 이 파일을 컴파일해 봅니다:
javac NameMismatch.java

컴파일은 성공해야 하지만, IncorrectName.class라는 파일이 생성됩니다 (파일 이름이 아닌 클래스 이름과 일치).

  1. 이제 파일 이름을 사용하여 프로그램을 실행해 봅니다:
java NameMismatch

다음 오류가 표시됩니다:

Error: Could not find or load main class NameMismatch
Caused by: java.lang.ClassNotFoundException: NameMismatch
  1. 이 오류를 해결하려면 올바른 클래스 이름을 사용하여 프로그램을 실행해야 합니다:
java IncorrectName

이제 다음 출력이 표시됩니다:

This program will cause an error!

오류 시나리오 2: 잘못된 디렉토리에서 실행

또 다른 일반적인 원인은 컴파일된 .class 파일이 포함되지 않은 디렉토리에서 Java 클래스를 실행하려고 할 때 발생합니다.

  1. 이 데모를 위해 하위 디렉토리를 생성합니다:
mkdir subdirectory
  1. 이 새 디렉토리로 변경합니다:
cd subdirectory
  1. 이 디렉토리에서 HelloWorld 프로그램을 실행해 봅니다:
java HelloWorld

다음 오류가 표시됩니다:

Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
  1. 이 오류를 해결하려면 다음 중 하나를 수행합니다:

    • .class 파일이 포함된 디렉토리로 다시 이동합니다:
    cd ..
    java HelloWorld
    
    • 또는 클래스 파일의 전체 경로를 지정합니다 (5 단계에서 살펴보겠습니다).

다음 단계를 위해 프로젝트 디렉토리로 다시 이동합니다:

cd ~/project

Java 패키지 사용법

Java 의 패키지는 클래스를 네임스페이스 (namespace) 로 구성하는 데 사용됩니다. 이름 충돌을 방지하고 접근 제어를 제공하여 대규모 애플리케이션을 관리하는 데 도움이 됩니다. 그러나 패키지를 잘못 사용하면 "Could Not Find or Load Main Class" 오류가 발생할 수도 있습니다.

패키지 구조 이해

  1. 먼저, 패키지를 위한 디렉토리 구조를 생성해 보겠습니다. Java 에서 패키지 구조는 디렉토리 구조와 일치해야 합니다:
mkdir -p ~/project/com/example
  1. com/example 디렉토리 내에 PackagedClass.java라는 새 Java 파일을 생성합니다:
cd ~/project/com/example
  1. 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 패키지에 속한다는 것을 알려줍니다.

  1. 프로젝트 디렉토리로 다시 이동하여 파일을 컴파일합니다:
cd ~/project
javac com/example/PackagedClass.java
  1. 클래스 이름만 사용하여 클래스를 실행하려고 하면 오류가 발생합니다:
java PackagedClass

출력:

Error: Could not find or load main class PackagedClass
Caused by: java.lang.ClassNotFoundException: PackagedClass
  1. 패키지 내의 클래스를 실행하는 올바른 방법은 정규화된 클래스 이름 (패키지 포함) 을 사용하는 것입니다:
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 은 프로그램을 로드하고 실행할 때 이 목록을 사용하여 클래스를 검색합니다.

클래스패스 매개변수 사용

클래스패스 사용법을 시연하기 위해 새로운 디렉토리 구조를 만들어 보겠습니다:

  1. 컴파일된 클래스를 위한 새 디렉토리를 생성합니다:
mkdir -p ~/project/classes
  1. 프로젝트 디렉토리에 ClasspathDemo.java라는 새 Java 파일을 생성합니다:
public class ClasspathDemo {
    public static void main(String[] args) {
        System.out.println("Successfully loaded class using classpath!");
    }
}
  1. Java 파일을 컴파일하지만, .class 파일이 classes 디렉토리에 배치되도록 지정합니다:
javac -d classes ClasspathDemo.java

-d 옵션은 컴파일된 클래스 파일의 대상 디렉토리를 지정합니다. 클래스 파일이 지정된 디렉토리에 생성되었는지 확인할 수 있습니다:

ls classes

다음과 같은 출력이 표시되어야 합니다:

ClasspathDemo.class
  1. 이제 클래스패스를 지정하지 않고 프로그램을 실행해 봅니다:
java ClasspathDemo

다음 오류가 표시됩니다:

Error: Could not find or load main class ClasspathDemo
Caused by: java.lang.ClassNotFoundException: ClasspathDemo
  1. 이 오류를 해결하려면 프로그램을 실행할 때 클래스패스를 지정해야 합니다:
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" 오류를 살펴보고 이를 해결하기 위한 여러 가지 방법을 배웠습니다. 다음은 우리가 다룬 내용의 요약입니다:

  1. 기본적인 Java 컴파일 및 실행: javacjava 명령을 사용하여 간단한 Java 프로그램을 생성, 컴파일 및 실행하는 방법을 배웠습니다.

  2. 일반적인 오류 원인:

    • 코드와 파일 이름 간의 클래스 이름 불일치
    • 잘못된 디렉토리에서 실행
    • 잘못된 패키지 사용
    • 클래스패스 문제
  3. 패키지 사용: 패키지 구조와 디렉토리 구조 간의 관계, 패키지된 클래스를 올바르게 실행하는 방법을 포함하여 Java 에서 패키지가 작동하는 방식을 살펴보았습니다.

  4. 클래스패스 사용: 특히 복잡한 프로젝트에 유용한 클래스를 찾을 위치를 JVM 에 알려주는 클래스패스 옵션을 사용하는 방법을 배웠습니다.

"Could Not Find or Load Main Class" 오류는 처음에는 답답하게 느껴질 수 있지만, 그 원인을 이해하면 진단하고 수정하기가 훨씬 쉬워집니다. 다음 핵심 사항을 기억하십시오:

  • 코드의 클래스 이름은 파일 이름과 일치해야 합니다 (.java 확장자 제외)
  • 패키지를 사용할 때는 디렉토리 구조가 패키지 구조와 일치해야 합니다
  • 항상 올바른 디렉토리에서 Java 프로그램을 실행하거나 클래스패스를 사용하여 클래스가 있는 위치를 지정하십시오
  • 패키지된 클래스의 경우 프로그램을 실행할 때 정규화된 클래스 이름 (패키지 포함) 을 사용하십시오

이러한 개념을 숙달하면 Java 개발 여정에서 이 일반적인 오류를 피하거나 빠르게 해결할 수 있습니다.