8장. 인터페이스

3 minute read

목표

자바의 인터페이스에 대해 학습하세요. issue

학습할 것

인터페이스

인터페이스는 일종의 추상클래스이다. 인터페이스는 추상클래스처럼 추상메소드를 갖지만 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 일반 메소드 또는 멤버변수를 구성원으로 가질 수 없다.

인터페이스 정의하는 방법

인터페이스를 작성하는 것은 클래스를 작성하는 것과 같다. 다만 키워드로 class 대신 interface를 사용한다.

interface에도 class와 같이 접근제어자로 public 또는 default를 사용할 수 있다.

  • 인터페이스 내에 존재하는 메소드는 무조건 public abstract로 선언되며, 이를 생략할 수 있다.
  • 인터페이스 내에 존재하는 변수는 무조건 public static final로 선언되며, 이를 생략할 수 있다.
interface 인터페이스 { 
    String NAME = "하이"
    // == public static final 타입 상수이름 = 값;

    void print();
    // == public abstract 메소드이름(매개변수);
}

인터페이스 구현하는 방법

인터페이스는 구현한다는 의미의 키워드 implements를 사용한다.

public interface Printer { 
    void print(); 
}

---

public class IntPrinter implements Printer {

    @Override
    public void print() {
        System.out.println("int printer 입니다!");
    }

}

인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

public interface Printer { 
    void print(); 
}

---

public class IntPrinter implements Printer {

    @Override
    public void print() {
        System.out.println("int printer 입니다!");
    }

}

--- 

public class DoublePrinter implements Printer {

    @Override
    public void print() {
        System.out.println("double printer 입니다!");
    }

}

---

public static void main(String[] args) {
    Printer intPrinter = new IntPrinter();
    Printer doublePrinter = new DoublePrinter();

    List<Printer> printers = Arrays.asList(intPrinter, doublePrinter)
    for (Printer printer : printers) {
        printer.print();
    }  
}

위에 보이는 것처럼 interface를 상속받아서 했기 때문에 그것을 해당 interface를 type으로 가지지만 실제 구현은 다른 type으로 할 수 있다.

이렇게 되는 경우 가장 아쉬운 것은 Printer에 메소드만 사용할 수 있다는 것이다.

그런 부분을 해결하기 위해서는 IntPrinter로 만들지만 List에 넣어도 그냥 들어가기 때문에 그렇게 활용할 수도 있다.

인터페이스의 기본 메소드 (Default Method), 자바 8

interface를 상속받으면 기본적으로 interface에서 선언되어진 abstract 메소드를 구현해야 한다.

하지만 인터페이스에 새로운 메소드를 추가했을 경우 이전에 해당 인터페이스를 사용하고 있는 경우 추가적인 구현을 해야된다.

그런 문제를 해결하기 위해서 하위 호환성을 보장하는 방법으로 Default Method 가 나왔다.

public interface Printer { 
    void print();

    default void intPrint(int number) {
        sout("Number=" + number);
    }
}

인터페이스의 static 메소드, 자바 8

위에 설명한 default method와 매우 비슷하다. 하지만 추가적으로 static method는 해당 상속받은 것을 다시 override할 수 없다는 것이다.

public interface Printer { 
    void print();

    static void intPrint(int number) {
        sout("Number=" + number);
    }
}

인터페이스의 private 메소드, 자바 9

private method 특성상 상속하더라도 상속되지 않는 메소드이다. 그리고 외부에 공개되지도 않는다.

한마디로 오직 해당 interface에서만 사용된다고 생각하면 될 것 같다.

public interface Printer { 
    void print();

    default void intPrint(int number) {
        somePrint();
        sout("Number=" + number);
    }

    private void somePrint() {
        sout("hello world!");
    }
}

ref

RR님의 블로그

슬기로운 개발생활님의 블로그

라이브 방송

방송 중

  • 인터페이스의 default method를 쓸 수 있는데. 이 default method 때문에 interface를 사용하는 건 아니다.
    • 해당 기능은 잘 생각해보면 interface에서 하나의 method만 구현을 해도 되는 상황이다. 그런데 만약 그런 상황에서 나머지도 모두 구현해야되기 떄문에 짜증나고 힘듬.
    • 이전에는 이런 문제를 해결하기 위해서 인터페이스를 상속받지만 아무행동도 하지 않은 클래스를 만들고 그것을 상속받아서 구현을 했었다. 그렇게 하면 모두 다 구현하지 않아도 되니까.
  • interface에 default method가 똑같은 친구를 만약 상속 받으면 어떻게 되는 것인가?
    • 일단 컴파일 에러가 난다.
    • 하지만 @Override하면 괜찮다.
    • 만약 사용하고 싶다면 JoinMemberInferface.super.preJoin() 이런 식으로 사용하게 되면 특정 interface의 default metohd을 사용할 수 있다.
  • interface 안에 있는 static method는 어떤 식으로 해도 상속을 하고 인터페이스 상속을 해도 아무것도 못한다.
    • 접근 영역이 다르기 떄문에 같은 이름으로 된 것으로 한다고 해도 @Override가 아니다.
    • 인스턴스 만들어서도 안되고 그냥 클래스에 상속해서 해당 메소드에서 바로 접근안된다.
    • 오직 해당 static method가 있는 interface에서만 사용할 수 있다.
  • default method, static method이 왜 나왔냐 -> 오래된 코드가 많잖아요. 아니 오래된 코드가 있을 때.
    • 그런데 여기서 default method를 사용했을 떄 실제 구현을 하지 않아도 하위 버전에서 아니면 새로운 버전에서 문제가 발생하지 않는다.
    • 새로운 method를 추가해서 깨지지 않도록 하기 위해서
  • defualt, static method가 생기면서 abstract class의 의미가 없어진거 아니냐?
    • defualt, static interface 만을 가지고 모두 구현할 수 있나. 완벽하게 구현할 수 있나?
    • 일단 interface는 상수 라는 개념을 만들 수 없음. 모두 오픈되어진 변수만 가능함.
    • 자바 8 이하이면 private method를 못쓰니까 중복 코드 발생할 수 있음 (자바 9부터 가능)
  • 함수형 인터페이스
    • 추상 메소드가 하나만 있는 경우
    • 익명 내부 클래스
  • 강한 결합, 느슨한 결합
    • 인터페이스를 쓰는 중요한 이유
    • 토비의 스프링 1, 2 챕터 확인

베스트 글 모음

https://www.notion.so/4b0cf3f6ff7549adb2951e27519fc0e6

https://blog.baesangwoo.dev/posts/java-livestudy-8week/

https://dev-coco.tistory.com/13

https://yadon079.github.io/2021/java%20study%20halle/week-08

https://k3068.tistory.com/34

https://www.notion.so/Java-8-0cc8c251d5374ac882a4f22fa07c4e6a

https://github.com/tocgic/study-java-basic/blob/main/week8.md

https://ahnyezi.github.io/java/javastudy-8-interface/

https://github.com/yeGenieee/java-live-study/blob/main/%5B8%5DJava%20Live%20Study.md

Leave a comment