Interface

Ajisai·2023년 7월 21일
0

Java

목록 보기
8/17
  • 상수 필드와 추상 메소드만 가질 수 있다.
  • 접근제한자는 public만 가능하다.
  • 그래서 public static finalpublic abstract는 생략할 수 있다.
  • 인터페이스끼리는 상속이 가능하다.
  • "구현"이 아닌 "선언"이 주가 된다.
  • C언어의 header file에 대응된다.
  • is a기도 하지만 is able to기도 하다. Ex) Comparable, Serializble
  • 그렇다고 이름에 꼭 ~able 접미사를 붙일 필요는 없고 그냥 '~할 수 있는 기능을 갖는' 관계로 생각하면 된다.
  • 추상 클래스도 인터페이스를 implement할 수 있다.

Vs. abstract class

  • 상속이라는 관계를 강요하지 않는다.
  • 다중 구현이 가능하기 때문에 필요하면 그냥 관계를 맺으면 된다.
  • 공통 상태(필드나 메소드 등)보다는 API 명세에 가깝다.

왜 씀

  • 구현을 강제함으로써 표준을 제시한다.
    • 클래스는 추상 메소드가 하나라도 있으면 추상 클래스가 되며,
      추상 클래스에서는 subclass가 모든 메소드를 구현할 필요는 없다.
  • 따라서 module 교체가 편해진다.
  • Interface만 알면 구현 클래스에서 어떻게 구현되는지는 굳이 몰라도 된다.
  • JDBC는 인터페이스, Oracle driver나 MySQL drive는 구현 객체에 해당한다.

클래스를 다중 상속할 수는 없다.

  • 이름이 같은 메소드를 호출할 때 헷갈령
  • 그래서 못 함
  • 대신 인터페이스가 다른 인터페이스를 상속하는 건 다중 상속 가능함
  • 클래스가 인터페이스를 구현할 때도 다중 구현은 가능하다.

Default method

  • interface에서 쓸 수 있는 유일한 concrete method
  • override가 강제되지 않는다.
  • 호환성 유지를 위해 Java 8에서 추가됐다.

호환성

  1. 기존에 있던 인터페이스의 구현 클래스를 사용하고 있다.
  2. 인터페이스 보완 과정에서 추가적으로 구현할 method가 생겼다.
  3. 또는 필수적으로 존재해야 하는 method가 생겼다.
  4. 이런 경우 1에서 사용되는 구현 클래스와의 호환성이 떨어진다.
  5. 이런 method를 default method로 선언하면 하위 호환성이 유지되는 상태로 인터페이스를 보완할 수 있다.

OCP; Open close principle

확장에는 열려있고 변경에는 닫혀있다.

객체지향 프로그래밍의 원칙 중 하나.

어떤 인터페이스 InterfaceA를 클래스 ClassA, ClassB, ClassC, ClassD, ClassE가 구현하고 있다고 하자.
InterfaceA에서 methodA가 필수적으로 존재해야 하는 경우, methodA를 사용하지 않는 ClassB, ClassC, ClassDmethodA를 구현해야 한다.

이런 경우 OCP를 위반했다고 볼 수 있다. 오히려 확장에 닫혀 있고 변경에 열려 있는 것이다.

InterfaceA에서 methodA를 default method로 선언한다면 methodA를 사용하는 ClassA에서만 methodA를 그냥 사용하거나 override할 수 있게 되고, 이는 확장에 해당한다.

그래서 어떻게 쓰냐면

public interface InterfaceA {
    void abstractMethodA();
    void abstractMethodB();
    
    //...
    
    default int defaultMethodA() {
        //Implemetation
    }
}

마음에 안 들면 구현 객체에서 override해서 쓰면 된다.

기본적으로 override는 필요없지만

  1. ClassAInterfaceAInterfaceB의 구현 클래스다
  2. InterfaceA에는 default void methodA()가 선언 및 정의되어 있다.
  3. InterfaceB에는 void methodA()가 선언되어 있다.

이런 충돌이 발생할 경우 methodA()에 대한 override가 강제된다.

default method 넣으면 그냥 추상 클래스 아님??

그렇긴 한데... 그렇게 됐습니다....


Static method

  • 구현 클래스 없이 인터페이스 이름으로 접근 가능
public interface InterfaceA {
    void abstractMethodA();
    void abstractMethodB();
    
    //...
    
    static int static MethodA() {
        //Implemetation
    }
}

Dependency inversion principle

  • 구현 객체가 아닌 인터페이스에 의존한다.
  • 인터페이스는 실행되지 않는다.
  • C언어에서 stdio.h를 include하고 printf()를 호출하면 stdio.c에 정의된 내용이 실행된다.
  • 이렇게 하면 stdio.c 내용이 변경되어도 printf()를 사용하는 데에는 별 문제가 없다.
profile
Java를 하고 싶었지만 JavaScript를 하게 된 사람

0개의 댓글

관련 채용 정보