코드 그라데이션

Day25. 추상화 (2) 인터페이스 본문

Java

Day25. 추상화 (2) 인터페이스

완벽한 장면 2023. 4. 17. 20:24

인터페이스

=> 추상화의 끝판왕

interface 와 interface 끼리 상속이 가능하나, 반드시 class 가 재정의 해야한다.

 

  • 약속을 표현하기 위한 특별한 형태의 클래스
  • 인터페이스는 객체를 생성할 수 없음
    • 생성자를 갖지 않는다
  • 인터페이스의 메서드는 abstract 키워드를 붙이지 않더라도 기본이 추상메서드
    • Java 8에서 default method가 등장하여 인터페이스도 구현을 가진 메서드를 가질 수 있음
  • 인터페이스의 메서드는 public 키워드를 붙이지 않더라도 기본이 public
  • static 메서드를 가질 수 있음(Java 8~)
  • 인스턴스 필드를 정의할 수 없음
    • 인터페이스는 스펙인데 필드는 구현에 대한 세부내용이므로 필드를 가질 수 없다

 

형태

interface A{

    상수

    추상메소드

    void abc();

    int def(int a);

   

}

class B implements A{

      void abc(){ // 메소드 재정의

      }

      int def(int a){ // 메소드 재정의

           return 5;

      }

}

 

 

interface 는 같은 interface 끼리는 extends 로 상속.

다른 타입, class, abstract class 와는 implements로 상속받는다.

interface A{
}

interface B extends A{
}

 

원칙상 다중 상속은 안 되지만, 

인터페이스는 된다.

 

interface와 abstract class 는 참조 자료형으로 쓸 수 있다.

 

예시

package mega.backend_onemore.Day25;

interface K{
  void abc();
}
interface R{
  void xxx();
}

class RR{

}

// 인터페이스는
class YOU extends RR implements K, R{
  public void abc() { // void abc() 면 무조건 에러.
    // 즉, 인터페이스는 무조건 오버라이딩 할 때 public을 붙여야 한다.
  }
  public void xxx() {

  }
/*
  여기서 class YOU는 RR 클래스를 상속받고, K와 R 인터페이스를 구현합니다.
  extends 키워드는 클래스 상속을 나타내며,
  implements 키워드는 인터페이스 구현을 나타냅니다.
  따라서 class YOU는 RR 클래스를 상속받고, K와 R 인터페이스를 구현한 것입니다.
  인터페이스 구현은 다중 상속이 가능하므로,
  class YOU는 K와 R 인터페이스에서 정의된 모든 추상 메서드를 구현해야 합니다.
  여기서는 abc()와 xxx() 메서드를 구현하였습니다.
  abc() 메서드에서 public 키워드를 사용하는 것은
  인터페이스에서 정의된 메서드를 구현할 때
  반드시 접근 제어자를 public으로 명시해야 한다는 규칙에 따른 것입니다.
*/
}


interface X extends K { // 인터페이스간의 상속은 extends
  void def();
}

abstract class Y implements X { //구현 가능

  // 오버라이딩 매우 가능
  // * 추상화클래스에서는 일반 메서드 생성 가능하므로.
  public void abc() {

  }
  abstract void kor();
}

class KOR extends Y{
  public void def() { // X에 있는 추상메서드와.
  // 인터페이스니까 public
  }
  void kor() { // Y에 있는 추상메서드를 오버라이딩 마저 해줘야 정상작동할 수 있다.
    // 즉 마지막 손자 클래스에서는 미 구현된 추상화 부분을 최종적으로 구현 완료해주어야 한다.

  }
  //* 여기서 abc() 재정의도 가능
}

public class InterfaceTest {

  public static void main(String[] args) {

  }

}

 

728x90
Comments