개발하는 두더지

[Effective Java 규칙19] 인터페이스는 자료형을 정의할 때만 사용하라 본문

Java,Android

[Effective Java 규칙19] 인터페이스는 자료형을 정의할 때만 사용하라

덜지 2018. 9. 26. 17:32

[Effective Java 규칙19] 인터페이스는 자료형을 정의할 때만 사용하라

Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다.



인터페이스를 구현해 클래스를 만든다는 건, 해당 클래스의 객체로 어떤 일을 할 수 있는지 클라이언트에게 알리는 것이다.

이진호환성이란 "클래스를 변경할 때, 그 클래스를 사용하는 클래스들에서 리컴파일 할 필요가 없어야된다" 라는 말이다. 

자바에서 이진호환성이란 무엇인가?

자바에서 이진호환성 예시


상수 인터페이스 패턴은 인터페이스를 잘못 사용한 패턴이다.

public interface Constants {
static final double AVOGADROS_NUMBER = 6.02214199e23;
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
}


이진호환성(Binary Compatibility)를 보장하지 않고, 자바 플랫폼 라이브러리에서도 실수로 포함된 상수 인터페이스가 몇개 있다. 그중에 하나는 java.io.StreamConstants 


상수를 API 일부로 공개하고 싶고, 이미 존재하는 클래스나 인터페이스에 강하게 연결되어 있다면 그 상수를 해당 클래스나 인터페이스에 추가해야 한다. enum 자료형(규칙30)으로 공개하거나 객체 생성 불가능한 유틸리티 클래스(규칙4)에 넣어서 공개해야 한다.

public class Constants {
private Constants() {} // 객체 생성 막음
static final double AVOGADROS_NUMBER = 6.02214199e23;
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
}


이렇게 사용하면 상수 앞에 클래스 이름을 붙이는데 정적 임포트(static import) 방식으로 클래스 이름을 제거할 수 있다.


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












Comments