본문 바로가기
Effective JAVA 2판

Effective JAVA Item19 인터페이스는 자료형을 정의할 때만 사용하라

by BroBroBro 2015. 6. 30.

------------------------------------------------

본글은 Effective JAVA 2판의 책의 내용을 토대로 작성하였으며
지극히 주관적인 사항들이 많이 있으므로 가려서 읽으시기바랍니다.
잘못된 내용이 있거나 의견이 있으시다면 언제든 댓글로^^~!

------------------------------------------------

CHAPTER 4 클래스와 인터페이스

4장에서는 클래스와 인터페이스를 설계할때 이용할 수 있는 강력한 요소들을 많이 갖추고 있다고 한다. 

[Item 13] 클래스와 그 멤버의 접근 권한을 최소화하자 부터 보도록 하자 

Item14 public 클래스 안에는 public 필드를 두지말고 접근자(accessor) 메소드를 사용한라
Item15 변경 기능성을 최소화 하라 
Item16 계승하는 대신 구성하라
Item17 계승을 위한 설계와 문서를 갖추거나, 그럴 수 없다면 계승을 금지하라
Item18 추상 클래스 대신 인터페이스를 사용하라
Item19 인터페이스는 자료형을 정의할 때만 사용하라
Item20 태그 달린 클래스 대신 클래스 계층을 활용하라
Item21 전략을 표현하고 싶을 때는 함수 객체를 사용하라
Item22 멤버 클래스는 가능하면 static으로 선언하라.

--page01


18장은 아직 포스팅 안했지만 이런내용을 적었었다.

int a = 1;
int b = 2;

Person p1 = new Singer();
Person p2 = new Writer();

여기서 자료형은 intPerson이 된다. int에는 정수 자료형인 1과 2를 넣을수있다.
Person은 그 자료형인 SingerWriter을 넣을수있다. Personimplement이거나 abstract인것이다.
자바에서는 자료형을 이 두가지를 통해서 제공해주고 있다.

그럼 본론으로 다시 돌아와서~

유틸리티 클래스를 사용자에게 제공하자. 응? 무슨말이야 뜬금없이?

유틸리티 클래스는 Item4에서 나왔다. 객체 생성 불가능 클래스이다. 

아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class PhysicalConstants {
    private PhysicalConstants() {
    } // Prevents instantiation
 
    // Avogadro's number (1/mol)
    public static final double AVOGADROS_NUMBER = 6.02214199e23;
 
    // Boltzmann constant (J/K)
    public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
 
    // Mass of the electron (kg)
    public static final double ELECTRON_MASS = 9.10938188e-31;
}
 
cs

1. 객체 생성이 불가능한 private생성자를 가지며 내부적으로 자주사용하는 상수가 public static final 로 선언이 되어있다.

이것을 사용해본다고 가정하면 아래와 같을것이다.

1
PhysicalConstants.AVOGADROS_NUMBER
cs

이게좀 이상하다 싶으면 jdk 1.5부터 도입된 Static import기능을 이용하자.

아래와 같다.

1
import static com.effectivejava.PhysicalConstants.* 
cs

위와 같이 사용하자라는게 이번장의 핵심이다. 다른용도로 사용하지 말자는 것이다.

다시말하면 인터페이스는 자료형을 정의할 때만 사용해야한다. 특정 상수를 API의 일부로 공개할 목적으로는 적절치 않다. 

그럼 잘못된 예를 볼까요? 아래와 같이 사용하지 말자는 것이다.

1
2
3
4
5
6
7
8
9
10
public interface PhysicalConstants {
    // Avogadro's number (1/mol) 
    public static final double AVOGADROS_NUMBER = 6.02214199e23;
 
    // Boltzmann constant (J/K)
    public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
 
    // Mass of the electron (kg)
    public static final double ELECTRON_MASS = 9.10938188e-31;
}
cs

이참에 아보가드로 수, 볼쯔만 상수, 전자 질량도한번 공부해보기를 바란다(쿨럭...)

이상~!