[Java] 인터페이스 구조파악하고 구현해보기

    인터페이스의 역할
    인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다. 
    가장 큰 이유는 개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 하기 위해서 이다. 


    인터페이스 구조
    1
    [publicinterface 인터페이스명 {....}
    cs

    클래스는 필드, 생성자, 메소드를 구성 멤버로 가지는데 비해, 인터페이스는 상수와 메소드만을 구성 멤버로 가진다. 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다. 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    interface 인터페이스명 {
        // 상수
        타입 상수명 = 값
     
        // 추상 메소드
        타입 메소드명(매개변수,,)
     
        // 디폴트 메소드
        default 타입 메소드명(매개변수,...) {}
     
        // 정적 메소드
        static 타입 메소드명(매개변수,...) {}
    }
     
    cs


    상수필드
    인터페이스는 객체 사용 설명서이므로 런타임 시 데이터를 저장할 수 있는 필드를 선언할 수 없다. 그러나 상수 필드는 선언이 가능하다. 상수는 런터임 시 데이터를 바꿀 수 없다. 상수를 선언할 때는 반드시 초기값을 대입해야 한다.


    추상 메소드
    추상 메소드는 객체가 가지고 있는 메소드를 설명한 것으로 호출할 떄 어떤 매개값이 필요하고, 리ㄴ턴 타입이 무엇인지만 알려준다. 


    디폴트 메소드
    추상메소드에 구현체가 가지고 있는것





    상수 필드 선언
    1
    2
    3
    4
    5
    6
    7
    public interface RemoteControll {
         //인터페이스는 데이터를 저장할 수 없기 때문에 저장할 인스턴스 또는 정적 필드를 선언할 수 없다. 
    //대신 상수 필드만 선언할 수 있다.
         //인터페이스에 선언된 필드는 모두 public static final의 특성을 갖는다.
         //public, static, final을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
         public int MAX_VOLUME = 10;
         public int MIN_VOLUME = 0;
    }

     cs



    추상 메소드 선언
    인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행된다. 그렇기 때문에 인터페이스의 메소드는 실행 블록이 필요없는 추상 메소드로 선언한다. 인터페이스에 선언된 추상 메소드는 모두  public abstarct의 특성을 갖기 떄문에 public dabstarct를 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.  

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public interface RemoteControll {
         //인터페이스는 데이터를 저장할 수 없기 때문에 저장할 인스턴스 또는 정적 필드를 선언할 수 없다. 
    //대신 상수 필드만 선언할 수 있다.
         //인터페이스에 선언된 필드는 모두 public static final의 특성을 갖는다.
         //public, static, final을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
         public int MAX_VOLUME = 10;
         public int MIN_VOLUME = 0;
         //추상 메소드
         void turnOn();
         void turnOff();
         void setVolume(int volume);
         
         //디폴트 메소드
         default void setMute(boolean mute) {
             if(mute) {
                  System.out.println("무음 처리합니다.");
             }
             else {
                  System.out.println("무음 해제합니다.");
             }
         }
         
         //정적 메소드
         static void changeBattery() {
             System.out.println("건전지를 교환합니다.");
         }
    }
    cs





    인터페이스 구현
    개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출한다. 객체는 인터페이스에서 정의된 추상 메소드와 동일한 메소드 이름, 매개타입, 리턴 타입을 가진 실체 메소드를 가지고 있어야 한다. 이러한 객체를 인터페이스의 구현 객체라하고, 구현 객체를 생성하는 클래스를 구현 클래스라고 한다. 

    구현 클래스
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class Television implements RemoteControll{
         //필드
         private int volume;
         
         @Override
         public void turnOn() {
             System.out.println("TV를 켭니다");
         }
         
         @Override
         public void turnOff() {
             System.out.println("TV를 끕니다");    
         }
         
         @Override
         public void setVolume(int volume) {
             if(volume > RemoteControll.MAX_VOLUME) {
                  this.volume = RemoteControll.MAX_VOLUME;
             } else if (volume < RemoteControll.MIN_VOLUME) {
                  this.volume = RemoteControll.MIN_VOLUME;
             } else {
                  this.volume = volume;
             }
             
             System.out.println("현재 TV 볼륨: " + volume);
         }
    }
     
    cs


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class Audio implements RemoteControll{
         //필드
         private int volume;
         
         @Override
         public void turnOn() {
             System.out.println("Audio를 켭니다");
         }
         
         @Override
         public void turnOff() {
             System.out.println("Audio를 끕니다"); 
         }
         8. 인터페이스
         @Override
         public void setVolume(int volume) {
             if(volume > RemoteControll.MAX_VOLUME) {
                  this.volume = RemoteControll.MAX_VOLUME;
             } else if (volume < RemoteControll.MIN_VOLUME) {
                  this.volume = RemoteControll.MIN_VOLUME;
             } else {
                  this.volume = volume;
             }
             
             System.out.println("현재 Audio 볼륨: " + volume);
         }
    }
    cs

    인터페이스의 모든 메소드는 기본적으로 public 접근 제한을 갖기 떄문에 public보다 더 낮은 접근 제한으로 작성할 수 없다.  public을 생략하면 컴파일 에러를 만난다. 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public abstract class Television implements RemoteControll{
         //필드
         private int volume;
         
         @Override
         public void turnOn() {};
         
         @Override
         public void turnOff() {
             System.out.println("TV를 끕니다");    
         }
    }
    cs

    만약 인터페이스에 선언된 추상 메소드에 대응하는 실체 메소드를 구현 클래스가 작성하지 않으면 구현 클래스는 자동적으로 추상 클래스가 된다. 그렇기 때문에 클래스 선언부에 abstract를 선언해줘야 한다.





    다중 인터페이스 구현 클래스
    1
    2
    3
    public interface Searchable {
         void search(String url);
    }
    cs


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class SmartTelevision implements RemoteControl, Searchable{
         private int volume;
         @Override
         public void turnOn() {
             System.out.println("TV를 켭키다.");
         }
         @Override
         public void turnOff() {
             System.out.println("TV를 끕니다.");
         }
         @Override
         public void search(String url) {
             System.out.println(url + "을 검색합니다");
         }
         @Override
         public void setVolume(int volume) {
             if(volume > RemoteControl.MAX_VOLUME) {
                  this.volume = RemoteControl.MAX_VOLUME;
             } else if (volume < RemoteControl.MIN_VOLUME) {
                  this.volume = RemoteControl.MIN_VOLUME;
             } else {
                  this.volume = volume;
             }
             
             System.out.println("현재 TV 볼륨: " + volume);
         }
    }
    cs


    신용권, 이것이 자바다, 한빛미디어(2015), p344-362

    댓글

    Designed by JB FACTORY