Fix The Compile Error: class X is public should be declared in a file named X.java

1. 개요

자바 개발자라면 모두 컴파일 타임 오류를 경험했을 것입니다. 그중 하나는 “클래스 X는 public이며 X.java라는 이름의 파일에 선언되어야 합니다”입니다.

이 짧은 튜토리얼에서는 이 오류가 무엇을 의미하는지, 왜 발생하는지, 그리고 어떻게 신속하게 해결할 수 있는지를 설명하겠습니다.

2. 문제 소개

문제를 예제를 통해 이해해 봅시다.

간단한 축구 게임 애플리케이션을 만들고 싶다고 가정해 봅시다. 우선, FootballGame.java 소스 파일에 선수와 클럽을 모델링해 보겠습니다:

// 파일 이름: FootballGame.java

public class FootballPlayer {
    private String name;
    private Club club;

    public FootballPlayer(String name, Club club) {
        this.name = name;
        this.club = club;
    }

    // ... 표준 getter 및 setter는 생략됨
}

class Club {
    private String name;

    public Club(String name) {
        this.name = name;
    }

    //... getter 및 setter는 생략됨
}

코드를 보면 두 클래스는 꽤 간단합니다. 하지만 이 코드를 컴파일하면 컴파일러가 다음과 같이 불평을 합니다:

java: class FootballPlayer is public, and should be declared in a file named FootballPlayer.java

이 컴파일러 오류는 특히 자바 초보자에게 혼란스러울 수 있습니다. 다음으로, 이 오류가 무엇을 의미하는지 이해하고 문제를 해결해 봅시다.

3. 오류 이해하기

먼저, 자바에서는 소스 파일 (.java)가 여러 클래스를 포함할 수 있지만 오직 하나의 public 클래스만 포함될 수 있습니다. 우리의 경우, FootballPlayerClub 클래스가 하나의 파일에 있습니다. 단, FootballPlayer 클래스만이 public입니다. 그래서 모든 것이 괜찮아 보입니다.

하지만 우리가 public 클래스를 선언할 때는 반드시 파일 이름이 클래스 이름과 정확히 일치해야 합니다. 이것은 자바가 코드의 구조와 일관성을 강제하는 방식입니다. 우리의 public 클래스 이름은 FootballPlayer지만 파일 이름은 FootballGame.java입니다. 따라서 이 규칙을 위반한 것입니다.

이제 이 컴파일러 오류의 의미를 이해했으니, 문제를 해결해 보겠습니다.

4. 해결 방법

이 문제를 해결하는 방법에는 두 가지가 있습니다. 각 방법을 살펴보겠습니다.

4.1. 파일 이름 변경

오류 메시지는 “…FootballPlayer는 FootballPlayer.java라는 이름의 파일에 선언되어야 합니다”라고 말합니다. 따라서 첫 번째 해결 방법은 파일 이름을 public 클래스 이름으로 변경하는 것입니다. 이 예제에서는 파일 이름을 FootballPlayer.java로 변경해야 합니다.

파일 이름을 변경한 후 코드는 오류 없이 컴파일됩니다. 또한 두 클래스가 예상대로 작동하는지 확인하기 위해 작은 테스트를 생성할 수 있습니다:

Club manUnited = new Club("Manchester United F.C.");
FootballPlayer rooney = new FootballPlayer("Wayne Rooney", manUnited);

assertEquals("Wayne Rooney", rooney.getName());
assertEquals("Manchester United F.C.", rooney.getClub().getName());

따라서 문제는 해결됩니다. 파일 이름과 public 클래스 이름이 일치하도록 보장하면, 자바의 관행에 맞춰 코드를 보다 조직적으로 관리할 수 있습니다.

다음으로 다른 해결 방법으로 넘어가겠습니다.

4.2. public 수정자 제거

우리는 이 오류의 근본 원인이 파일 이름 (FootballGame.java)와 public 클래스 이름 (FootballPlayer) 간의 불일치임을 알고 있습니다. 다른 해결 방법은 FootballPlayer 클래스에서 public 수정자를 제거하는 것입니다:

// 파일 이름: FootballGame.java

class FootballPlayer {
    // ... 동일한 코드는 생략됨
}

class Club {
    // ... 동일한 코드는 생략됨
}

이 파일에 public 클래스가 없으므로 파일 이름이 클래스 이름과 일치해야 할 필요성이 없어집니다. 이제 동일한 테스트를 실행하면 코드가 컴파일되고 테스트가 통과합니다:

Club manUnited = new Club("Manchester United F.C.");
FootballPlayer rooney = new FootballPlayer("Wayne Rooney", manUnited);

assertEquals("Wayne Rooney", rooney.getName());
assertEquals("Manchester United F.C.", rooney.getClub().getName());

문제가 해결되었습니다. 하지만 public 수정자를 제거하면 클래스를 package-private (같은 패키지 내에서만 접근 가능)으로 만듭니다. 따라서 위의 테스트 클래스와 FootballGame.java 파일은 동일한 패키지에 있어야 합니다.

5. 결론

이번 글에서는 컴파일러 오류 “클래스 X는 public이며 X라는 이름의 파일에 선언되어야 한다”를 이해하고 문제를 해결할 수 있는 두 가지 방법을 explored했습니다.

다시 이 오류를 마주치게 되면 우리는 정확히 어떻게 해결해야 할지 알게 될 것입니다. 몇 번의 연습을 통해 이러한 오류는 개발 과정에서 쉬운 수정사항이 될 것입니다.

항상 그랬듯이, 예제를 위한 전체 소스 코드는 GitHub에서 확인할 수 있습니다.

원본 출처

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다