티스토리 뷰
(Effective Java) 규칙25. 톱레벨 클래스는 한 파일에 하나만 담으라
소스 파일 하나에 여러 클래스 선언
- 소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 불평하지 않는다.
- 다만, 아무런 득이 없을 뿐더러 심각한 위험을 감수해야 하는 행위다.
- 한 클래스를 여러 가지로 정의할 수 있으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라지기 때문
문제 상황
-
아래 소스 파일은
Main
클래스 하나를 담고 있고, 다른 톱레벨 클래스는 다른 톱레벨 클래스 2개(Utensil
과Dessert
)를 참조한다.public class Main { public static void main(String[] args) { System.out.println(Utensi.NAME + Dessert.NAME); } }
-
집기 (
Utensil
)와 디저트(Dessert
) 클래스가Utensil.java
라는 한 파일에 정의 되어 있다고 해보자class Utemsil { static final String NAME = "pan"; } class Dessert { static final String NAME = "cake"; }
-
물론
Main
을 실행하면"pancake"를 출력함
-
-
만약 우연히 똑같은 두 클래스를 담은
Dessert.java
라는 파일을 만들었다고 해보자.class Utemsil { static final String NAME = "pot"; } class Dessert { static final String NAME = "pie"; }
-
운 좋게
javac Main.java Dessert.java
명령으로 컴파일한다면 컴파일 오류가 나면서Utensil
과Dessert
클래스를 중복 정의했다고 알려줄 것이다.- 컴파일러는 먼저
Main.java
를 컴파일 하고 그 안에서(Dessert
참조보다 먼저 나오는)Utensil
참조를 만나면Untensil.java
파일을 살펴Utensil
과Dessert
를 모두 찾아낼 것임 - 후 컴파일러가 두 번째 명령줄 인수인
Dessert.java
를 처리하여 할 때 같은 클래스가 이미 있음을 알게 됨
- 컴파일러는 먼저
-
컴파일러에 어떤 소스를 먼저 건네느냐에 따라 동작이 달라지는 문제가 생긴다.
javac Main.java
나javac Main.java Utensil.java
명령으로 실행하면 의도한pancake
를 출력함- 그러나
javac Dessert.java Main.java
명령으로 컴파일 하면potpie
를 출력함
해결책
-
단순히 톱레벨 클래스들(
Utensil
과Dessert
)을 서로 다른 소스 파일로 분리하면 그만이다. -
굳이 여러 톱레벨 클래스를 한 파일에 담고 싶다면 정적 멤버 클래스(규칙 24)를 사용하는 방법을 고민해볼 수 있다.
- 다른 클래스에 딸린 부차적인 클래스라면 정적 멤버 클래스로 만드는 쪽이 일반적으로 더 나을 것임
- 읽기 좋고,
private
으로 선언하면 (규칙 15)접근 범위도 최소로 관리할 수 있기 때문
-
위 예제를 정적 멤버 클래스로 바꿔본 예제
public class Main { public static void main(String[] args) { System.out.println(Utensi.NAME + Dessert.NAME); } private static class Utensil { static final String NAME = "pan"; } private static class Dessert { static final String NAME = "cake"; } }
결론
-
소스 파일 하나에는 반드시 톱레벨 클래스(혹인 톱레벨 인터페이스)를 하나만 담자.
- 이 규칙만 따른다면 컴파일러가 한 클래스에 대한 정의를 여러 개 만들어 내는 일은 사라짐
끝으로
이 글이 도움이 되었다면, 하단의 Google 광고 👎👎👎 한번씩 클릭 부탁 드립니다. 🙏🙏🙏
광고 클릭은 많은 힘이 됩니다!
반응형
'프로그래밍 > EffectiveJava' 카테고리의 다른 글
(이펙티브 자바) 규칙23. 태그달린 클래스보다는 클래스 계층구조를 활용하라 (0) | 2020.03.26 |
---|---|
(이펙티브 자바) 규칙24. 멤버 클래스는 되도록 static으로 만들라 (0) | 2020.03.17 |
(이펙티브 자바) 규칙26. 로 타입은 사용하지 말라 (0) | 2020.03.13 |
(이펙티브 자바) 규칙63. 문자열 연결은 느리니 주의하라 (0) | 2020.03.12 |
(이펙티브 자바) 규칙64. 객체는 인터페이스를 사용해 참조하라 (0) | 2020.03.11 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- springboot
- effectivejava
- windows
- 자바
- TableView
- 인텔리제이
- 배낭여행
- 일본 여행
- 일본 자전거 여행
- Java UI
- java
- 텐트
- 일본 배낭여행
- JavaFX 테이블뷰
- 방통대 과제물
- 이펙티브
- 일본여행
- git
- intelij
- JavaFX
- 자전거 여행
- effective java
- JavaFX Window Close
- 스프링부트
- 이펙티브 자바
- JavaFX Table View
- 자전거
- JavaFX 종료
- 배낭 여행
- 이펙티브자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함