[Effective Java] 19. Interface는 자료형을 정의할 때만 사용하라

1 분 소요

인터페이스를 구현하는 클래스를 만들면 그 인터페이스는 해당 클래스 객체를 참조할 수 있는 자로형의 역할을 하게 된다.

인터페이스를 구현해 클래스를 만든다는 것은 해당 클래스의 객체로 어떤일을 할 수 있다라는 것을 클라이언트에게 알리는 행위로, 이 외에 다른 용도로 인터페이스를 사용하는 것은 적절하지 못하다.

1. 상수 인터페이스(constant interface)

인터페이스를 잘못 사용하는 대표적인 예이다.

메서드 없이 static final 상수만 존재한다.
이런 구현을 사용하는 이유는 대게 상수 사용 시 앞에 class명을 붙이는 번거로움을 피하려는 것뿐이다.

public interface Constants {
	static final double A = 1;
	static final double B = 2;
	static final double C = 3;
}

이런 구현은 좋지 않다.
클래스가 어떤 상수를 사용하는 것은 클래스의 구현 세부 사항이다. interface는 public 이기 때문에 이렇게 상수를 interface에 포함시키면 클래스의 공개 api에 상수가 포함되게 되버린다.

그리고 만약 이를 구현한 클래스의 하위 클래스를 만들었을때 하위클래스의 namespace까지 인터페이스의 상수들에 의해 오염된다.

2. 상수 API

상수 일부를 API로 공개하고 싶은 경우가 있다면 해당 상수를 사용하고 있어 강하게 결합되어 있는 클래스나 인터페이스에 직접 추가해야 한다.

예를 들면 Integer.MAX_VALUE 와 같은 것이다.
아니면 enum으로 공개를 하던가 상수를 위한 유틸리티성 클래스를 만드는것도 한 예이다.

public class Constants {
	// 객체 생성을 막는다.
	private Constants() { }
	static final double A = 1;
	static final double B = 2;
	static final double C = 3;
}

댓글남기기