인터페이스는 보통 언제 사용하면 좋을까요?


인터페이스와 추상클래스의 차이는 대충 알겠는데 그렇다면 인터페이스를 올바르게 사용하려면 언제 사용하는게 좋을까요?

  • 2016년 02월 15일에 작성됨

조회수 173


1 답변


좋아요
0
싫어요
채택취소하기

클래스에서 인터페이스를 구현할때 구현 되는 인터페이스는 그 클래스의 인스턴스를 참조하는데 사용되는 일종의 타입같은 역할을 합니다. 그러므로 클래스가 구현하는 인터페이스는 클라이언트가 그 클래스의 인스턴스로 할 수 있는 일을 나타내야합니다. 이외의 다른 목적으로 인터페이스를 사용하는건 적합하지 않습니다. 예를들자면 상수 인터페이스 같은 것 입니다. 그런 인터페이스는 메소드를 갖지 않고 외부에 제공하는 상수값을 갖는 static final 필드만으로 구성되는데요. 그런 상수를 사용하는 클래스에서는 상수 필드명 앞에 클래스의 이름을 붙이지 않고 상수를 사용하기 위해 그 인터페이스를 구현합니다.

public interface PhysicalConstants{
    //아보가드로 수
    static final double AVOGARDROS_NUMBER = 6.02214199e23;
    //볼쯔만 상수
    static final double BOLTZMANN_CONSTANT= 1.3806503e-23;
    //전자 질량
    static final double ELECTRON_MASS = 9.10938188e-31;
}

상수 인터페이스 패턴은 인터페이스를 형편없이 사용합니다. 클래스가 내부적으로 사용하는 상수들은 그 클래스의 상세한 구현에 속하지만 상수 인터페이스를 구현하면 그런 상세한 구현이 그 클래스의 외부api로 노출되게 됩니다. 그 클래스가 상수 인터페이스를 구현한다는 것이 클래스 사용자에게는 중요하지 않습니다. 하지만 그들을 혼란스럽게 할수있습니다. 그리고 더 나쁜것은, 그런 구현이 앞으로의 약속 이행을 나타낸다는 것이죠. 무슨 말이냐면 향후 배포판에서 그 상수를 더 이상 사용할 필요가 없어서 클래스를 변경하더라도 바이너리 호환성을 유지하기 위해 여전히 그 상수 인터페이스를 구현해야합니다. 만일 final이 아닌 클래스가 상수 인터페이스를 구현한다면, 그 클래스의 모든 서브 클래스들이 갖는 네임 스페이스가 줄어들것입니다. (상수 인터페이스에 있는 상수 필드명과 같은 이름은 사용할수없으므로)

그렇다면 상수를 외부에 제공하고싶을때는 어떻게하냐면 상수 유틸리티 클래스를 만드는것이 좋다.

package com.effectivejava.science;

public class PhysicalConstants{
    private PhysicalConstants(){}//인스턴스 생성 방지

    public static final double AVOGARDROS_NUMBER = 6.02214199e23;
    public static final double BOLTZMANN_CONSTANT= 1.3806503e-23;
    public static final double ELECTRON_MASS     = 9.10938188e-31;
}

이런식으로 만들어주는게 더 낫습니다.

  • 2016년 02월 15일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close