이것이 자바다 의 Chapter08 을 참고하여 정리한 포스트입니다.

Chapter 08. 인터페이스 - (1)

1 인터페이스의 역할

자바에서 인터페이스(interface)는 객체의 사용 방법을 정의한 타입이다.
인터페이스는 객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다.
자바 8의 람다식은 함수적 인터페이스의 구현 객체를 생성하기 때문에 인터페이스의 중요성은 커졌다.

  • 개발 코드와 객체가 서로 통신하는 접점 역할을 한다.
  • 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다.
  • 그렇기 때문에 개발 코드는 객체의 내부를 알 필요가 없고 인터페이스의 메소드만 알면 된다.


개발 코드가 중간에 인터페이스를 두는 이유
- 개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 하기 위해서이다.
- 인터페이스는 여러 객체가 사용 가능하므로 어떤 객체를 사용하느냐에 따라 실행 내용과 리턴 값이 다르다기 때문이다.

인터페이스 장점
- 개발 코드 측면에서는 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있다.

2 인터페이스 선언

물리적 형태는 클래스와 동일하다.
소스를 작성할 때 선언하는 방법은 다르다.

2.1 인터페이스 선언

인터페이스 선언은 class 키워드 대신에 interface 키워드를 사용한다.

1
[public] interface 인터페이스명 {...}

인터페이스는 상수와 메소드만을 구성 멤버로 가진다.
객체로 생성할 수 없기 때문에 생성자를 만들 수 없다.

  • 자바 7 이전 : 인터페이스의 메소드는 실행 블록 없는 추상 메소드로만 선언 가능
  • 자바 8 이후 : 디폴트 메소드와 정적 메소드도 선언 가능
1
2
3
4
5
6
7
8
9
10
interface 인터페이스명 {
    //상수
    type 상수명 = ;
    //추상메소드
    type 메소드명 (매개변수, ...);
    //디폴트 메소드
    default 타입 메소드명(매개변수) {...}
    //정적 메소드
    static 타입 메소드명(매개변수) {...}
}
  • 상수 필드 (Constant Field)
    인터페이스는 객체 사용 설명서이기 때문에 런타임 시 데이터를 저장할 수 있는 필드를 선언할 수 없다.
    상수 필드는 선언이 가능하다. 상수는 인터페이스에 고정된 값으로 런타입 시에 데이터를 바꿀 수 없으며, 선언할 때에는 반드시 초기값을 대입해야 한다.

  • 추상 메소드 (Abstract Method)
    추상 메소드는 객체가 가지고 있는 메소드를 설명한 것으로 호출할 때 어떤 매개값이 필요하고, 리턴 타입이 무엇인지만 알려준다.
    실제 실행부는 객체(구현 객체)가 가지고 있다.

  • 디폴트 메소드 (Default Method)
    디폴트 메소드는 인터페이스에 선언되지만 사실 객체(구현 객체)가 가지고 있는 인스턴스 메소드라 생각해야 한다. 자바 8에서 디폴트 메소드를 허용한 이유가 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위하기 때문이다.

  • 정적 메소드 (Static Method)
    정적 메소드 또한 자바 8부터 작성할 수 있다.
    디폴트 메소드와는 달리 객체가 없어도 인터페이스만으로 호출이 가능하다.

2.2 상수 필드 선언

인터페이스는 데이터를 저장하지 못해서 데이터를 저장할 인스턴스 또는 정적 필드를 선언할 수 없다.
대신 상수 필드만 선언할 수 있다.
인터페이스에 선언된 필드는 모두 public static final 의 특성을 갖는다.
(생략하더라도 자동적으로 컴파일 과정에 붙음)

1
[public static final]  타입 상수명 = ;

상수명은 대문자로 작성하고, 서로 다른 단어로 구성되어 있을 때에는 언더바(_) 로 연결하는 것이 관례이다.

  • ex) RemoteControl.java 상수 필드 선언
    1
    2
    3
    4
    
    public interface RemoteControl {
      public int MAX_VOLUME = 10;
      public int MIN_VOLUME = 0;
    }
    

    MAX_VOLUME, MIN_VOLUME 로 인터페이스 상수 선언과 동시에 초기값을 지정한다.
    static {} 블록으로 초기화를 불가하기 때문이다.

2.3 추상 메소드 선언

인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행되기 때문에
인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언한다.

  • ex) RemoteControl.java 메소드 선언
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    public interface RemoteControl {
      //상수
      public int MAX_VOLUME = 10;
      public int MIN_VOLUME = 0;
    
      //추상 메소드 : 메소드 선언부만 작성
      public void turnOn();
      public void turnOff();
      public void setVolume(int volume);
    }
    

    2.4 디폴트 메소드 선언

    디폴트 메소드는 자바 8에서 추가된 인터페이스의 새로운 멤버이다.
    default 키워드가 리턴 타입 앞에 붙으며 디폴트 메소드는 public 특성을 갖는다.
    (public를 생략해도 자동적으로 컴파일 과정에 붙음)

  • ex) RemoteControl.java 메소드 선언
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    interface RemoteControl {
      //상수
      public int MAX_VOLUME = 10;
      public int MIN_VOLUME = 0;
    
      //추상 메소드 
      public void turnOn();
      public void turnOff();
      public void setVolume(int volume);
    
      //디폴트 메소드 : 실행 내용까지 작성
      default void setMute(boolean mute) {
          if(mute) {
              System.out.println("무음 처리");
          } else {
              System.out.println("무음 해제");
          }
      }
    }
    

2.5 정적 메소드 선언

정적 메소드는 디폴트 메소드와 마찬가지로 자바 8애서 추가된 인터페이스 멤버이다.
형태는 정적 메소드와 완전히 동일하며 정적 메소드는 public 특성을 갖는다.
(public를 생략해도 자동적으로 컴파일 과정에 붙음)

1
[public] static 리턴타입 메소드명(매개변수, ...) { ... }
  • ex) RemoteControl.java 메소드 선언
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    interface RemoteControl {
      //상수
      public int MAX_VOLUME = 10;
      public int MIN_VOLUME = 0;
    
      //추상 메소드 
      public void turnOn();
      public void turnOff();
      public void setVolume(int volume);
    
      //디폴트 메소드
      default void setMute(boolean mute) {
          if(mute) {
              System.out.println("무음 처리");
          } else {
              System.out.println("무음 해제");
          }
      }
    
      //정적 메소드
      static void changeBettery() {
          System.out.prinln("건전지 교환");
      }
    }
    

🌞 정보 : 공부 기록용 블로그입니다. 오타나 내용 오류가 있을 경우 알려주시면 감사하겠습니다.

댓글남기기