Jin's Dev Story

[JAVA] 인터페이스(interface) 본문

Programming Language/JAVA

[JAVA] 인터페이스(interface)

woojin._. 2023. 8. 12. 13:29

인터페이스

클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러가지 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않음

  • 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미함
  • 추상 메소드와 상수만을 포함할 수 있음(변수 가질 수 없음)
  • 다중 상속 지원
  • 모든 메소드는 선언부만 존재
  • 구현 클래스는 선언된 모든 메소드를 overriding함

사용 이유

ex) 한국인을 위한 번역기를 만들 예정, 그러나 전세계 언어가 너무 많아서 업무를 나눠서 한 친구는 영어 번역 클래스를, 한 친구는 중국어 번역 클래스를 생성하기로 함

결과물 1

  /**
   * @author 팀원1
   */
  public class EnglishTrans {
    public String koreanToEnglish(String str) {
      //TODO: 한국어를 영어로 번역
    }
    public String englishToKorean(String str) {
      //TODO: 영어를 한국어로 번역
    }
  }

결과물 2

  /**
   * @author 팀원2
   */
  public class ChineseRendering {
    public String translateChinese(String str) {
      //TODO: 한국어를 중국어로 번역
    }
    public String translateKorean(String str) {
      //TODO: 중국어를 한국어로 번역
    }
  }

 호출 : 메서드명, 클래스명이 다름, 이 클래스들을 사용하면 아래와 같이 코드를 사용할 수 있음

  EnglishTrans trans = new EnglishTrans();
  String str = trans.koreanToEnglish(str);
  // TODO: Business Login
  ...

  ChineseRendering rendering = new ChineseRendering();
  String str = rendering.translateChinese(str);
  // TODO: Business Login
  ...

 

 인터페이스 사용하는 경우

  // 공통 사용 인터페이스
  public interface Translation {
    // 한국어를 번역하다
    public String translate(String str);
    // 한국어로 번역하다
    public String translateInto(String str);
  }

결과물 1

  **
   * @author 팀원1
   */
  public class EnglishTranslation implements Translation {
    @Override
    public String translate(String str) {
      //TODO: 한국어를 번역
    }
    @Override
    public String translateInto(String str) {
      //TODO: 한국어로 번역
    }
  }

결과물 2

  /**
   * @author 팀원2
   */
  public class ChineseTranslation implements Translation {
    @Override
    public String translate(String str) {
      //TODO: 한국어를 번역
    }
    @Override
    public String translateInto(String str) {
      //TODO: 한국어로 번역
    }
  }

호출

  Translation trans = new EnglishTranslation();
  String str = trans.translate(str);
  // TODO: Business Login
  ...

  Translation trans = new ChineseTranslation();
  String str = trans.translate(str);
  // TODO: Business Login
  ...

 

인터페이스의 선언

  • 접근 제어자와 함께 interface 키워드 사용
  • 인터페이스의 모든 필드는 public static final이어야 함
  • 모든 메소드는 public abstract이어야 함
  접근제어자 interface 인터페이스이름 {

      public static final 타입 상수이름 = 값;

      ...

      public abstract 메소드이름(매개변수목록);

      ...

  }

 

인터페이스의 구현

  • 자신이 직접 인스턴스 생성 불가
  • class 클래스 이름 implements 인터페이스 이름 { … } 문법을 통해 구현
  interface Animal { public abstract void cry(); } // 인터페이스 선언

  class Cat implements Animal { // 인터페이스 구현

      public void cry() {
          System.out.println("냐옹냐옹!");
      }
  }

  class Dog implements Animal { // 인터페이스 구현

      public void cry() {
          System.out.println("멍멍!");
      }
  }

  public class Polymorphism03 {

      public static void main(String[] args) {
          Cat c = new Cat();
          Dog d = new Dog();

          c.cry();
          d.cry();
      }
  }

  // 실행 결과
  냐옹냐옹!
  멍멍!