티스토리 뷰

Java/Effective Java

[Item22] 규칙 준수

ryumodern 2022. 2. 28. 17:06

Interface는 언제 그리고 왜 쓸까?

행동에 제약을 걸기 위한 추상화로만 사용하자

책의 예제는 상수 인터페이스를 보여주는데 얼핏 보면 괜찮은 생각처럼 보일 수도 있다

상수 인터페이스를 구현한 모든 클래스에서 이 상수들을 이용하면 편할 거 같은데 두 가지 문제가 있다

 

https://www.geeksforgeeks.org/interfaces-in-java/

 

첫번째는 타입 정의를 위해 사용해야 할 인터페이스를 올바르게 사용하지 않은 것이다

관례와 규칙을 따르지 않은 방식이므로 본인은 편하게 사용할지 몰라도 해당 코드를 본 대부분의 사람은 의문을 품게 될 것이다

 

wtf 대잔치

 

둘째, 바이너리 호환성

인터페이스에서 상수를 공개했으므로 이를 사용하는 쪽에서 상수에 강하게 결합된다

상수를 수정할 일이 있을 때 인터페이스에서만 바꾸고 끝이 아니라 클라이언트 코드까지 전부 컴파일 해줘야 한다

게다가 인터페이스에서 상수에는 접근 제한을 걸 수 없어 어차피 public으로 공개된다

만약 이에 대해 접근 제어를 하고 싶었다면 Interface의 기초 뼈대인 Abstract 추상 클래스를 만들고

차라리 여기서 protected로 내려주는 게 나은 선택이다, 다만 이 방식도 최악이 아닌 차악일뿐..

기초 뼈대 추상 클래스란 List 인터페이스의 하위 추상 클래스 AbstractList를 참고해보자

 

인터페이스에서 public static final이 자동으로 들어가니 상수를 모아둔 Constants 클래스를 이용하는 것과 차이가 없다

구현체나 하위 인터페이스에 이 속성을 내려주느냐 마느냐인데 이 상수는 구현체마다 다른 값이 필요할 수도 있다

따라서 상수는 규약이 아닌 내부 구현이다, 지겹도록 들어온 그 말을 되새기자

내부 구현을 노출하지 말자

 

 

 

'Java > Effective Java' 카테고리의 다른 글

[Item24] Nested Class  (0) 2022.03.01
[Item23] boolean 대신 타입으로  (0) 2022.02.28
[Item21] 인터페이스 default method는 만능이 아니다  (0) 2022.02.28
[Item20] 항상 인터페이스로  (0) 2022.02.26
[Item19] 꼼꼼 코딩  (0) 2022.02.26
댓글
링크
글 보관함
«   2024/11   »
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
Total
Today
Yesterday