인터페이스

kwang·2022년 7월 6일
0

Java-Live-Study

목록 보기
9/15

목표

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

학습할 것 (필수)

  • 인터페이스 정의하는 방법
  • 인터페이스 구현하는 방법
  • 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
  • 인터페이스 상속
  • 인터페이스의 기본 메소드 (Default Method), 자바 8
  • 인터페이스의 static 메소드, 자바 8
  • 인터페이스의 private 메소드, 자바 9

인터페이스 정의하는 방법

인터페이스

인터페이스는 일종의 추상 클래스이다.

추상 클래스와의 차이는 더욱 추상화된 개념이기에 일반 메서드, 멤버변수를 허용하지 않는다.

그래서 오직 추상메서드와 상수인 멤버만을 가질 수 있었다.

하지만 Java 8버전부터는 default메서드와 static메서드를 지원하여 일반 메서드 구현이 가능해 졌다.

장점

  • 개발시간단축
    메서드를 호출하는 쪽은 선언부만 알면 되기에 구현부가 구현되는것을 기다리지 않고 작성할 수 있어 개발시간이 단축되었다.
  • 표준화 가능
    인터페이스를 통해 기본 틀을 제공해주면 이에 맞는 구현부가 작성되기에 표준화된 개발이 가능해졌다.
  • 독립적인 프로그래밍 가능
    클래스의 선언과 구현을 분리시킬 수 있기에 실제 구현에 독립적인 코드 작성이 가능하다.

인터페이스 정의

아래와 같이 class로 작성되던 부분을 interface라고 작성 해주어야한다.

상수, 추상메서드, 디폴트메서드, 스태틱메서드 순으로 정의하는 방법이다.

public interface 인터페이스명 {
    
    타입 상수명 =;
    
    타입 메소드명(매개변수);
    
    default 타입 메소드명(매개변수){
        구현부
    };
    
    static 타입 메소드명(매개변수){
        구현
    };
}

인터페이스 구현하는 방법

클래스명 뒤에 implements를 이용하여 해당 인터페이스를 상속 받을 수 있다.

상속받은 모든 메서드와 변수중에 추상 메서드만은 강제적으로 오버라이딩을 해야한다.

인터페이스의 추상 메서드는 public abstract가 강제적으로 붙이만 생략이 가능하다.

변수 또한 public static final이 생략 가능하다.

public class 클래스명 implements 인터페이스명 {
    
    @Override
    타입 메서드명(매개변수) {
//        추상메서드는 오버라이딩 강제!
    };
}

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

public class Main {

    interface Parents{
        default void parents(){
            System.out.println("부모 디폴트메서드");
        };
    }

    static class Child implements Parents{
        void child() {
            System.out.println("자식 메서드");
        }
    }

    static class ChildTwo implements Parents{
        void child() {
            System.out.println("자식 메서드");
        }

    }

    public static void main(String[] args) {
        Parents child1 = new Child();
        Parents child2 = new ChildTwo();
//        child1.child();   사용 불가능
//        child2.child();   사용 불가능
          child1.parents();   //인터페이스 디폴트 메서드 사용가능
          child2.parents();
//        다형성 적용되어 자식들 메서드 사용가능
        ((Child)child1).child();
        ((ChildTwo)child2).child();
    }
}

인터페이스 상속

인터페이스는 다중상속을 지원한다.

하나의 클래스가 여러개의 인터페이스를 상속받을 수 있다는 뜻이다.

예제와 같이 ,를 이용하여 상속받고 싶은 인터페이스들을 작성해 주면된다.

public class Main {

    interface Parents1{
    }

    interface Parents2{
    }

    static class Child implements Parents1, Parents2{

    }
}

또한 인터페이스끼리의 상속도 지원하는데 이경우에는 extent 예약어를 사용한다.

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

디폴트 메서드는 자바 8버전부터 추가된 메서드이다.

인터페이스에 필요에 따라 추가로 추상 메서드를 작성할 경우 해당 인터페이스를 상속받은 모든 클래스들이 오버라이딩해야 되는 번거로움이 존재했다.

이러한 문제를 해결하기 위해 기본적으로 메서드를 제공하고 필요에 따라 이를 오버라이딩해서 사용할 수 있는 방법을 제공해준다.

선언하는 방법은 위에 인터페이스 정의 부분을 참고하자

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

선언하는 방법은 디폴트 메서드와 비슷하지만 둘의 차이는 오버라이딩의 가능 여부이다.

static 메서드는 우리가 아는 static처럼 해당 인터페이스에서 정의하고 나면 재정의가 불가능하다.

이러한 특성때문인지 사용하는 방법도 아래와 같다.
상속받은 인스턴스객체.스태틱메서드 x
인터페이스.스태틱메서드 o

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

Java 9버전에서는 private method와 private static method를 추가하였다.

Java 8버전에서 추가된 디폴트 메서드와 스태틱 메서드는 public으로만 제공되기 때문에 내부적으로 사용되는 메서드의 경우 private하게 작성하지 못한다는 단점을 보완하기 위해 나왔다.

몇가지 특징을 알아보겠다.

  • private 메서드는 구현부를 가져야한다.
  • 오직 인터페이스 내부에서만 사용가능하다.
  • private static 메서드는 다른 static 또는 static이 아닌 메서드에서만 사용할 수 있다.

0개의 댓글