Java 에서 'package does not exist' 오류 해결 방법

JavaBeginner
지금 연습하기

소개

Java 개발자라면 프로그래밍 여정 중에 "package does not exist" 오류를 접하게 될 가능성이 높습니다. 이 오류는 Java 컴파일러가 코드에서 사용하려는 패키지를 찾을 수 없을 때 발생합니다. 이 실습에서는 Java 패키지를 이해하고, 오류를 시연하는 프로젝트를 생성한 다음, 문제를 올바르게 해결하는 과정을 안내합니다.

초보자를 위한 중요 사항: 이 튜토리얼에서 Java 코드를 복사할 때 구문에 주의를 기울이십시오. Java 는 대소문자를 구분하며 정확한 구문을 요구합니다. 일반적인 실수는 다음과 같습니다.

  • package 선언 앞에 public과 같은 추가 키워드 추가
  • 잘못된 공백 또는 구두점
  • 세미콜론 또는 중괄호 누락

이 튜토리얼이 끝나면 Java 애플리케이션에서 이 일반적인 오류를 수정하고 방지하는 방법을 이해하게 될 것입니다.

패키지를 사용한 Java 프로젝트 생성

이 단계에서는 Java 에서 패키지가 작동하는 방식을 이해하기 위해 패키지를 사용한 간단한 Java 프로젝트를 생성합니다.

Java 패키지 이해

Java 패키지는 관련 클래스를 구성하는 방법입니다. 패키지는 다음과 같은 기능을 제공합니다.

  • 이름 충돌 방지를 위한 네임스페이스 (namespace)
  • 코드의 더 나은 구성
  • 클래스 및 해당 멤버에 대한 접근 제어

프로젝트 구조 생성

간단한 프로젝트 구조를 만들어 보겠습니다. WebIDE 에서 터미널을 열고 다음 명령을 실행합니다.

mkdir -p ~/project/src/com/example/util
mkdir -p ~/project/src/com/example/app

이 명령은 com.example.utilcom.example.app이라는 두 개의 패키지 디렉토리를 생성합니다.

유틸리티 클래스 생성

이제 com.example.util 패키지에 간단한 유틸리티 클래스를 만들어 보겠습니다. ~/project/src/com/example/util 디렉토리에 StringUtils.java라는 새 파일을 만들고 다음 내용을 포함시킵니다.

참고: 다음 코드를 표시된 대로 정확하게 복사하십시오. 패키지 선언이 package로 시작하는지 확인하십시오 (추가 키워드 public 없이).

package com.example.util;

public class StringUtils {
    public static String reverse(String input) {
        StringBuilder reversed = new StringBuilder();
        for (int i = input.length() - 1; i >= 0; i--) {
            reversed.append(input.charAt(i));
        }
        return reversed.toString();
    }
}

이 클래스는 문자열을 뒤집는 간단한 유틸리티 메서드를 제공합니다.

메인 애플리케이션 클래스 생성

다음으로, 유틸리티 클래스를 사용할 메인 애플리케이션 클래스를 만들어 보겠습니다. ~/project/src/com/example/app 디렉토리에 MainApp.java라는 새 파일을 만들고 다음 내용을 포함시킵니다.

중요: 아래 코드를 표시된 대로 정확하게 복사하십시오. 패키지 선언에 특별히 주의하십시오. package로 시작해야 합니다 (public package가 아님).

package com.example.app;

import com.example.util.StringUtils;

public class MainApp {
    public static void main(String[] args) {
        String original = "Hello, Java!";
        String reversed = StringUtils.reverse(original);

        System.out.println("Original: " + original);
        System.out.println("Reversed: " + reversed);
    }
}

이 메인 클래스는 유틸리티 패키지의 StringUtils 클래스를 가져와 사용합니다.

프로젝트 컴파일 및 실행

이제 프로젝트를 컴파일해 보겠습니다. 올바른 순서로 파일을 컴파일하고 클래스 경로 (classpath) 를 올바르게 설정해야 합니다. 터미널에서 다음 명령을 실행합니다.

cd ~/project
javac src/com/example/util/StringUtils.java
javac -cp src src/com/example/app/MainApp.java

중요: MainApp.java를 컴파일할 때 컴파일된 StringUtils.class 파일을 찾을 위치를 컴파일러에 알리기 위해 -cp src 옵션을 사용한다는 점에 유의하십시오. 이는 패키지 종속성을 해결하는 데 중요합니다.

클래스 경로 이해: 클래스 경로는 Java 가 컴파일된 클래스를 검색할 위치를 알려줍니다. MainApp.javacom.example.util.StringUtils를 가져오려고 할 때 Java 는 src/com/example/util/StringUtils.class 디렉토리 구조에서 컴파일된 StringUtils.class 파일을 찾아야 합니다. -cp src 옵션이 없으면 Java 는 이 컴파일된 클래스를 어디서 찾아야 하는지 알 수 없습니다.

문제 해결: 컴파일 오류가 발생하는 경우:

  1. "class, interface, or enum expected" - 패키지 선언이 package로 시작하는지 ( public package가 아님) 확인하고 클래스 선언 앞에 추가 키워드가 없는지 확인하십시오.
  2. "package does not exist" - 다른 패키지에서 가져오는 파일을 컴파일할 때 -cp src를 사용하는지 확인하십시오.
  3. "cannot find symbol" - 유틸리티 클래스가 먼저 성공적으로 컴파일되었는지 확인하십시오.

컴파일이 성공적으로 완료되면 애플리케이션을 실행합니다.

java -cp src com.example.app.MainApp

다음과 같은 출력이 표시됩니다.

Original: Hello, Java!
Reversed: !avaJ ,olleH

이는 프로젝트가 올바르게 작동하고 있음을 보여줍니다. 메인 애플리케이션이 다른 패키지의 유틸리티 클래스를 성공적으로 사용했습니다.

"Package Does Not Exist" 오류 생성하기

이 단계에서는 "package does not exist" 오류를 유발하는 상황을 의도적으로 생성하여 무엇이 오류를 트리거하는지 이해해 보겠습니다.

패키지 오류 소개

존재하지 않는 패키지를 사용하려는 새 Java 파일을 만들어 보겠습니다. ~/project/src/com/example/app 디렉토리에 ErrorDemo.java라는 새 파일을 만들고 다음 내용을 포함시킵니다.

package com.example.app;

// 존재하지 않는 패키지를 참조하는 import 문입니다.
import com.example.math.Calculator;

public class ErrorDemo {
    public static void main(String[] args) {
        // 존재하지 않는 패키지의 클래스를 사용하려고 시도합니다.
        int result = Calculator.add(5, 3);
        System.out.println("Result: " + result);
    }
}

이 파일은 프로젝트에 존재하지 않는 com.example.math 패키지의 Calculator 클래스를 가져오려고 시도합니다.

오류가 있는 코드 컴파일하기

이 파일을 컴파일해 보세요.

cd ~/project
javac src/com/example/app/ErrorDemo.java

다음과 유사한 오류 메시지가 표시됩니다.

src/com/example/app/ErrorDemo.java:4: error: package com.example.math does not exist
import com.example.math.Calculator;
                       ^
src/com/example/app/ErrorDemo.java:9: error: cannot find symbol
        int result = Calculator.add(5, 3);
                     ^
  symbol:   variable Calculator
  location: class ErrorDemo
2 errors

이것이 이 실습에서 중점적으로 다루는 "package does not exist" 오류입니다.

오류 이해하기

오류는 다음과 같은 이유로 발생합니다.

  1. Java 는 프로젝트 어디에서도 com.example.math 패키지를 찾을 수 없습니다.
  2. 패키지가 존재하지 않으므로 해당 패키지 내의 Calculator 클래스도 존재하지 않습니다.

Java 는 다음 위치에서 패키지를 찾습니다.

  • 현재 디렉토리
  • 클래스 경로 (classpath) 에 지정된 디렉토리
  • 시스템 라이브러리

이러한 위치 중 어느 곳에서도 패키지를 찾을 수 없으면 "package does not exist" 오류를 보고합니다.

"Package Does Not Exist" 오류 수정하기

"package does not exist" 오류의 원인을 이해했으니, 이를 수정하는 방법을 살펴보겠습니다. 이 문제를 해결하는 데는 몇 가지 접근 방식이 있습니다.

해결 방법 1: 누락된 패키지 및 클래스 생성

가장 간단한 해결책은 누락된 패키지와 클래스를 만드는 것입니다. 이를 구현해 보겠습니다.

mkdir -p ~/project/src/com/example/math

이제 ~/project/src/com/example/math 디렉토리에 Calculator.java라는 새 파일을 만들고 다음 내용을 포함시킵니다.

package com.example.math;

public class Calculator {
    public static int add(int a, int b) {
        return a + b;
    }

    public static int subtract(int a, int b) {
        return a - b;
    }

    public static int multiply(int a, int b) {
        return a * b;
    }

    public static int divide(int a, int b) {
        if (b == 0) {
            throw new ArithmeticException("Division by zero");
        }
        return a / b;
    }
}

이제 파일을 다시 컴파일해 보세요. 먼저 Calculator.java 파일을 컴파일하고, 그런 다음 올바른 클래스 경로 (classpath) 로 ErrorDemo.java를 컴파일합니다.

cd ~/project
javac src/com/example/math/Calculator.java
javac -cp src src/com/example/app/ErrorDemo.java

중요: 이전과 마찬가지로 ErrorDemo.java를 컴파일할 때 -cp src를 사용하여 컴파일된 Calculator.class 파일을 찾을 수 있도록 해야 합니다.

이번에는 컴파일이 오류 없이 성공해야 합니다. 이제 프로그램을 실행할 수 있습니다.

java -cp src com.example.app.ErrorDemo

다음과 같은 출력이 표시됩니다.

Result: 8

해결 방법 2: import 문 수정

다른 패키지나 클래스를 사용하려고 했다면, import 문을 수정하는 것이 또 다른 해결책입니다. 예를 들어, 이전에 생성한 StringUtils 클래스를 사용하려고 했다고 가정해 보겠습니다.

~/project/src/com/example/app 디렉토리에 CorrectedDemo.java라는 새 파일을 만들고 다음 내용을 포함시킵니다.

package com.example.app;

// 수정된 import 문
import com.example.util.StringUtils;

public class CorrectedDemo {
    public static void main(String[] args) {
        String original = "Hello, Java!";
        String reversed = StringUtils.reverse(original);

        System.out.println("Original: " + original);
        System.out.println("Reversed: " + reversed);
    }
}

이 파일을 컴파일하고 실행합니다.

cd ~/project
javac -cp src src/com/example/app/CorrectedDemo.java
java -cp src com.example.app.CorrectedDemo

다음과 같은 출력이 표시됩니다.

Original: Hello, Java!
Reversed: !avaJ ,olleH

해결 방법 3: 전체 정규화된 클래스 이름 사용

import 문을 완전히 생략하고 싶다면, 전체 정규화된 클래스 이름 (fully qualified class names) 을 사용할 수 있습니다.

~/project/src/com/example/app 디렉토리에 FullyQualifiedDemo.java라는 새 파일을 만들고 다음 내용을 포함시킵니다.

package com.example.app;

// import 문이 필요하지 않습니다.

public class FullyQualifiedDemo {
    public static void main(String[] args) {
        String original = "Hello, Java!";
        String reversed = com.example.util.StringUtils.reverse(original);

        System.out.println("Original: " + original);
        System.out.println("Reversed: " + reversed);
    }
}

이 파일을 컴파일하고 실행합니다.

cd ~/project
javac -cp src src/com/example/app/FullyQualifiedDemo.java
java -cp src com.example.app.FullyQualifiedDemo

이전과 동일한 출력이 표시됩니다.

패키지 관리 모범 사례

"package does not exist" 오류를 수정하는 방법을 알았으니, 앞으로 이 오류를 방지하기 위한 Java 패키지 관리 모범 사례를 살펴보겠습니다.

프로젝트 구조 모범 사례

잘 구성된 프로젝트 구조는 패키지 관련 오류를 방지하는 데 도움이 됩니다.

  1. 패키지 명명 규칙 따르기:

    • 소문자를 사용합니다.
    • 회사 또는 조직의 도메인 이름을 역순으로 시작합니다.
    • 예: com.company.project.module
  2. 디렉토리 구조와 패키지 계층 구조 일치시키기:

    • 클래스가 com.example.util 패키지에 있다면, /src/com/example/util/와 같은 디렉토리 경로에 있어야 합니다.
  3. 소스 코드와 컴파일된 코드 분리:

    • 소스 파일은 /src 디렉토리에 보관합니다.
    • 컴파일된 .class 파일은 별도의 /bin 또는 /target 디렉토리에 배치합니다.

빌드 디렉토리를 생성하여 프로젝트를 더 잘 구성해 보겠습니다.

mkdir -p ~/project/build

빌드 도구 사용

실제 프로젝트에서는 Maven 또는 Gradle 과 같은 빌드 도구가 종속성 (dependencies) 과 클래스 경로 (classpath) 를 자동으로 관리합니다. 이 실습에서는 간단한 스크립트를 사용하겠습니다.

~/project 디렉토리에 build.sh라는 파일을 만듭니다.

#!/bin/bash
## 간단한 빌드 스크립트

## 빌드 디렉토리가 없으면 생성합니다.
mkdir -p build

## 모든 Java 파일 컴파일
javac -d build src/com/example/util/*.java
javac -d build src/com/example/math/*.java
javac -d build -cp build src/com/example/app/*.java

echo "컴파일 완료. 클래스 파일은 build 디렉토리에 있습니다."

실행 가능하게 만듭니다.

chmod +x ~/project/build.sh

빌드 스크립트를 실행합니다.

cd ~/project
./build.sh

이제 빌드 디렉토리를 클래스 경로로 사용하여 모든 애플리케이션을 실행할 수 있습니다.

java -cp build com.example.app.MainApp

출력:

Original: Hello, Java!
Reversed: !avaJ ,olleH

종속성 문서화

프로젝트에 필요한 외부 종속성을 문서화하는 것은 항상 좋은 습관입니다.

~/project 디렉토리에 README.md라는 파일을 만듭니다.

## Java 패키지 데모

이 프로젝트는 Java 패키지 관리와 "package does not exist" 오류를 해결하는 방법을 보여줍니다.

### 프로젝트 구조

- src/com/example/util: 유틸리티 클래스
- src/com/example/math: 수학 연산
- src/com/example/app: 애플리케이션 클래스

### 프로젝트 빌드

빌드 스크립트를 실행합니다.

./build.sh

### 애플리케이션 실행

메인 애플리케이션을 실행하려면:

java -cp build com.example.app.MainApp

오류 데모를 실행하려면:

java -cp build com.example.app.ErrorDemo

README.md 파일은 다른 개발자가 프로젝트 구조를 이해하고 빌드 및 실행 방법을 파악하는 데 도움이 되므로 패키지 관련 오류를 방지할 수 있습니다.

"Package Does Not Exist" 오류 해결책 요약

  1. 패키지가 프로젝트에 실제로 존재하는지 확인합니다.
  2. 패키지 및 import 문에서 오타를 확인합니다.
  3. 프로젝트 구조가 패키지 계층 구조와 일치하는지 확인합니다.
  4. 클래스 경로 (classpath) 를 올바르게 설정합니다.
  5. 필요한 경우 전체 정규화된 클래스 이름을 사용합니다.
  6. 더 큰 프로젝트의 경우 빌드 도구 사용을 고려합니다.

이러한 모범 사례를 따르면 Java 프로젝트에서 "package does not exist" 오류 발생 빈도를 최소화할 수 있습니다.

요약

이 실습에서는 Java 에서 "package does not exist" 오류를 처리하는 방법을 배웠습니다. 다음과 같은 실질적인 경험을 쌓았습니다.

  • 올바른 프로젝트 구조에서 Java 패키지를 생성하고 구성하는 방법
  • "package does not exist" 오류의 원인 이해
  • 오류를 수정하기 위한 다양한 솔루션 구현
  • Java 패키지 관리를 위한 모범 사례 따르기

이러한 기술은 더 견고한 Java 애플리케이션을 구축하고 패키지 관련 문제가 발생했을 때 신속하게 해결하는 데 도움이 될 것입니다. Java 개발 여정을 계속하면서, 깔끔하고 유지보수 가능하며 오류 없는 코드를 유지하는 데 있어 적절한 패키지 구성이 핵심임을 기억하십시오.