brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Jan 14. 2019

Effective Java3/E - 클래스와 인터페이스

#25 톱 레벨 클래스는 한 파일에 하나만 담으라

Effective Java 3/E - 클래스와 인터페이스


#25 톱 레벨 클래스는 한 파일에 하나만 담으라


#01 여러 개의 톱 레벨 클래스 선언


하나의 소스 파일에 톱 레벨 클래스를 여러 개 선언해도 컴파일에는 문제가 없습니다.

하지만 어느 소스 파일을 먼저 컴파일하냐에 따라서 예상하지 못한 결과가 발생하기도 합니다.


하나의 소스 파일에 하나의 톱 레벨 클래스만 써야 하는 이유에 대해 살펴보겠습니다.




#01 컴파일 순서에 따른 상이한 결과


#02 Main class


하나의 Main 클래스에서 다른 톱 레벨 클래스(Coffee and Dessert) 2개를 참조하고 있습니다.


#03 Coffee.java and Dessert.java


이를 아래와 같이 컴파일할 수 있습니다.

$ javac Main.java
$ java Main
americano and cake

// 1. Main.java 컴파일
// 2. Coffee.java 컴파일 (코드 상 'Dessert.NAME' 보다 'Coffee.NAME' 이 먼저 나오기 때문)
// 3. Coffee.java 내의 Coffee.NAME = "americano"와 Dessert.NAME = "cake" 출력
$ javac Main.java Coffee.java 
$ java Main
americano and cake

// 1. Main.java 컴파일
// 2. Coffee.java 컴파일
// 3. Coffee.java 내의 Coffee.NAME = "americano"와 Dessert.NAME = "cake" 출력




만약 컴파일 순서를 바꾼다면, 결과는 달라집니다.

$ javac Dessert.java Main.java 
$ java Main
latte and pie

// 1. Dessert.java 컴파일
// 2. Main.java 컴파일
// 3. Dessert.java 내의 Coffee.NAME = "latte"와 Dessert.NAME = "pie" 출력


이 처럼 같은 코드라도, 컴파일 순서에 따라 결과가 달라질 수 있습니다.




#02 정적 멤버 클래스


#04 정적 멤버 클래스


해결 방법은 단순하게 톱 레벨 클래스들을 서로 다른 소스 파일로 분리하거나, 정적 멤버 클래스로 구현하면 됩니다.




아무 고민 없이 항상 정적 멤버 클래스로 이용했는데, 컴파일 순서에 따라 저런 결과가 나올 수 도 있네요.

매거진의 이전글 Effective Java3/E - 객체의 생성과 파괴
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari