본문 바로가기

STUDY/이펙티브자바

4-8) 인터페이스는 타입을 정의하는 용도로만 사용하라

인터페이스

 

MyInf instance1 = new MyInfImpl();
MyInf instance2 = new YourInfImpl();

자바의 인터페이스는 (일반적으로) 구현이나 필드 없이 메소드만 정의되어있는 추상화된 요소이다. 개발자는 인터페이스를 구현하여 동일한 기능을 내부 구현을 다르게하여 만들 수 있다. 클라이언트에서는 다르게 만들어진 인터페이스의 구현체들을 내부 모습을 모른체로 사용할 수 있다. 이처럼 인터페이스는 다양한 구현체의 인스턴스를 참조할 수 있는 타입 역할을 한다.

 

 


상수 인터페이스 안티패턴

 

// 수학 상수들을 정의한 인터페이스
public interface Math {
    static final double pi = 3.141592;
    ...
}

상수 인터페이스란 메소드 없이 상수값들을 static final 필드로 정의한 인터페이스를 말한다. 이러한 패턴은 인터페이스를 잘못 사용한 예다. 인터페이스를 구현하는 클래스 내부에서 사용해야하는 상수라면 이를 외부에 노출하면 안된다. 인터페이스나 클래스에 강하게 연관되어 있고 사용자에게 공개할 상수라면 클래스나 인터페이스 자체에 추가해야한다.  실제로 Integer과 Double에는 MIN_VALUE, MAX_VALUE가 상수로 정의되어있다. 상수만을 나타내는 요소가 필요하다면 enum이나 class를 활용해야 한다.

 

// enum을 활용한 상수 표현
public enum PhonePrefixEnum {
	PREFIX_010("010"), PREFIX_011("011"), PREFIX_017("017");  
	
	private String value;
	
	PhonePrefixEnum(String value) {
		this.value = value;
	}
}

// class를 활용한 상수표현
public class PhonePrefixConstants {
	private PhonePrefixConstants() {}
	
	public static final PREFIX_010 = "010";
	public static final PREFIX_011 = "011";
	public static final PREFIX_017 = "017";
}
728x90