네로개발일기

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

 

# 아이템25. 톱레벨 클래스는 한 파일에 하나만 담아라.

## 한 파일에 톱레벨 클래스가 여러 개일 때 문제점
public class Main {
  public static void main(String[] args) {
    System.out.println(Utensil.NAME + Dessert.NAME);
  }
}
// Utensil.java
class Utensil {
  static final String NAME = "pan";
}

class Dessert {
  static final String NAME = "cake";
}
javac Main.java Utensil.java
> pancake
Main 클래스를 실행하면 pancake가 출력된다.
이 상태에서 똑같은 두 클래스를 담은 Dessert.java가 추가되면
class Utensil {
  static final String NAME = "pot";
}

class Dessert {
  static final String NAME = "pie";
}
javac Main.java Dessert.java
> Duplicate class found in the file '~/src/main/java/Dessert.java'
javac Main.java Dessert.java 명령어로 컴파일을 한다면 컴파일 오류가 발생하고 클래스가 중복 정의되었다고 알려준다.
컴파일은 가장먼저 Main.java를 컴파일하고, 그 안에서 Utensil 참조를 먼저 만나 Utensil.java 파일을 살펴서 Utensil, Dessert 클래스를 모두 찾아낸다. 그 다음 두번째로 참조되는 Dessert에 따라 Dessert.java를 처리하려고 할 때 같은 클래스의 정의가 이미 되어있음을 알게 된다.
javac Main.java
> pancake
javac Main.java Utensil.java
> pancake
javac Dessert.java Main.java
> potpie
이처럼 컴파일러에 어느 소스파일을 먼저 전달하느냐에 따라 동작이 달라진다.

 

## 해결책
톱클래스를 서로 다른 소스 파일로 분리하면 된다.
// Utensil.java
class Utensil {
  static final String NAME = "pan";
}
// Dessert.java
class Dessert {
  static final String NAME = "cake";
}

 

## 정적 멤버 클래스
굳이 한 파일에 담고싶다면 정적 멤버 클래스를 사용하는 방법을 고려하자. 부차적인 클래스를 정적 멤버 클래스로 만들면 가독성도 높아지고, private로 선언하여 접근 범위도 최소로 관리할 수 있다.
단, 정적 멤버 클래스는 보통 하나의 클래스에 딸린 부차적인 클래스를 추가하는데 사용되므로, 패턴을 유지하기 위해 부차적인 클래스를 추가하는 경우에만 사용하자.
// example
class Utensil {
  static final String NAME = "pan";

  private static class Dessert {
    static final String Name = "cake";
  }
}
class Test {
  public static void main(String[] args) {
    System.out.println(Utensil.NAME + Dessert.NAME);
  }

  private static class Utensil {
    static final String NAME = "fan";
  }

  private static class Dessert {
    static final String NAME = "cake";
  }
}
## 정리
소스 파일 하나에는 반드시 톱레벨 클래스(혹은 인터페이스)를 하나만 담자. 이 규칙만 따른다면 소스파일을 어떤 순서로 컴파일 하든 프로그램의 동작이 달라지지 않는다.

 

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !