-
Item 25. 톱레벨 클래스는 한 파일에 하나만 담으라백수의 개발/이펙티브 자바 2019. 10. 13. 12:09
다중 톱레벨 클래스 정의
소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 컴파일을 하는데 아무런 문제는 없다.
그러나 이러한 방식은 아무런 득이 없을 뿐더러 심각한 위험을 감수해야하는 행위이다.
이는 한 클래스를 여러 가지로 정의할 수 있으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라지기 때문이다.
간단한 예를 보자.
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"; } // Dessert.java class Utensil { static final String NAME = "pot"; } class Dessert { static final String NAME = "pie"; }
위와 같이 Utensil과 Dessert 두가지 동일한 클래스를 다른 파일에 정의하게 되면 문제가 발생할 수 있다.
Utensil.java와 Dessert.java를 함께 컴파일하게 되면 클래스를 중복 정의 했다고 컴파일 요류가 발생하거나, 순서에 따라 원하지 않는 클래스가 먼저 컴파일 되어 의도하지 않은 결과를 가져올 수 있다.
해결책
해결책은 간단하다. 단순히 톱레벨 클래스들을 서로 다른 소스 파일로 분리하면 그만이다.
굳이 여러 톱레벨 클래스를 한 파일에 담고 싶다면 아래 처럼 정적 멤버 클래스를 사용하는 방법을 고민해볼 수 있다.
public class Main { public static void main(String[] args) { System.out.println(Utensil.NAME + Dessert.NAME); } private static class Utensil { static final String NAME = "pan"; } private static class Dessert { static final String NAME = "cake"; } }
마무리
소스 파일 하나에는 반드시 톱레벨 클래스를 하나만 담자. 이 규칙만 따른다면 컴파일러가 한 클래스에 대한 정의를 여러개 만들어 내는 일은 사라진다. 소스 파일을 어떤 순서로 컴파일하든 바이너리 파일이나 프로그램의 동작이 달라지는 일은 결코 일어나지 않을 것이다.
'백수의 개발 > 이펙티브 자바' 카테고리의 다른 글
Item 27. 비검사 경고를 제거하라 (0) 2019.10.15 Item 26. 로 타입은 사용하지 말라 (0) 2019.10.14 Item 24. 멤버 클래스는 되도록 static으로 만들라 (0) 2019.10.12 Item 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) 2019.10.11 Item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라 (0) 2019.10.08