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

조회수 2279회

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

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;
    }
    

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)