ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [live-study] 8주차 :: 인터페이스
    JAVA/라이브 스터디 | whiteship 2021. 1. 30. 23:20

    https://youtu.be/HLnMuEZpDwU

    참고도서 : Java의 정석 3판, Java in a Nutshell

     

     

     

    0. 인터페이스란

    인터페이스란
    • 인터페이스는 일종의 추상클래스이다.
    • 하지만, 추상클래스보다 추상화 정도가 높아서, 구현된 메서드 또는 일반 멤버 변수를 가질 수 없다. 상수와 추상메서드만 멤버로 가질 수 있다. (JDK 1.8기준)

     

    1. 인터페이스 정의하는 방법

    인터페이스 정의
    • 인터페이스를 작성하는 것은 클래스를 작성하는 것과 같은데, 다만 키워드로 class 대신 interface를 사용한다는 것만 다르다.
    • 기본적으로 모든 멤버변수는 상수이며 public static final 인데, 이를 생략할 수 있다.
    • 모든 메서드는 추상화 메서드이며 public abstract 인데, 이를 생략할 수 있다. (단, JDK1.8부터는 인터페이스에서 static메서드와 default메서드 예외이다.)
    • 그리고, 이렇게 생략된 제어자들은 컴파일 시에 컴파일러가 자동적으로 추가해준다.

     

    2. 인터페이스 구현하는 방법

    implements
    • 인터페이스는 구현한다라는 의미의  implements 키워드를 사용한다.
    • 그리고 인터페이스를 implments한 클래스는 반드시 인터페이스에 정의되어 있는 메소드를 재정의 해야만한다.
    • 또한, 인터페이스는 구현을 하지만, 인터페이스로부터 상속받은 추상메서드를 구현하는 것이기 때문에 조금 다른 의미의 부모라고 볼 수 있다. 그래서 오버라이딩 할때는 부모의 메서드보다 넓은 범위의 접근 제어자를 지정해야한다.

    • 인터페이스도 추상클래스처럼 그 자체로는 인스턴스 생성이 불가능하다.

     

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

    다형성
    • 다형성을 통해 자식 클래스의 인스턴스를 부모타입의 참조변수로 참조가 가능하다라는 것을 알고 있다.
    • 인터페이스 또한, 해당 인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있다.
    예시
    • 먼저, Vehicle이라는 interface를 생성하고,

    • Bus와 Subway라는 클래스를 만들어 본다.

    • 그리고 인터페이스 타입의 참조변수로 이 2개의 클래스의 인스턴스를 참조할 수 있다.

    위 코드 출력 결과

     

    4. 인터페이스 상속

    인터페이스 상속
    • 인터페이스는 인터페이스로부터만 상속을 받을 수 있으며, 클래스와는 달리 다중상속도 가능하다.
    • 클래스의 상속과 마찬가지로 부모 인터페이스에 정의된 멤버들을 모두 상속 받을 수 있다.

    • 또한, 클래스에서 구현과 상속을 동시에 할 수도 있다.

     

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

    기본 메소드 (Default Method)
    • 인터페이스에 메서드를 추가한다라는 의미는 어떤 것일까.
    • 단순히 부모 클래스에 새로운 메서드를 추가하는 것과 다르게, 인터페이스에 메서드를 추가한다라는 것은 "추상 클래스"를 추가하는 것이고 또한 이 인터페이스를 구현한 기존의 모든 클래스들도 변경이 필요하다라는 의미이다.
    • 따라서, 기본 메소드 (Default Method)라는 것을 고안해냈다. 추상 메소드의 기본적인 구현을 제공하는 메소드로 추상 메소드가 아니기 때문에, 추가되어도 인터페이스를 구현한 클래스들에서 변경이 필수적이지 않게 되었다.
    • 메소드 앞에 default 키워드를 붙이면 되고, 일반 메소드처럼 body { }가 필요하다. 접근 제어자는 public이며, 생략이 가능하다.
    • 아래와 같이 interface에 default method를 추가해도 구현체 클래스에는 영향이 없다.
    • 또한, 구현한 클래스에서 재정의가 가능하다.

     

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

    static 메소드
    • 사실 static 메소드는 인스턴스와 관계가 없는 독립적인 메서드이기 때문에 인터페이스에 추가하지 않을 이유가 없었지만, 규칙의 단순화때문에 인터페이스의 메서드는 추상 메서드여야만 한다 라는 규칙에 포함 될 수 밖에 없었다. 
    • 하지만, 자바 8부터는 static 메서드를 추가할 수 있게 되었다.
    • static 메서드 역시 접근 제어자는 항상 public이며, 생략이 가능하다.
    • 하지만 default 메서드와 달리 구현한 클래스에서 재정의가 불가능하다.

     

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

    private 메소드
    • 자바 8에서 default 메소드와 static 메소드가 추가되었고, 자바 9에서 private methodprivate static method가 추가되었다.
    • private method로 인해 캡슐화를 유지시킬 수 있고, interface 내부에서의 재사용성이 높아졌다. 
    • private method는 abstract가 될 수 없고, 오직 인터페이스 내부에서만 사용할 수 있다.
    • private static method는 다른 static과 non-static 인터페이스 메소드 내에서 사용할 수 있다.
    • private non-static method는 private static method내에서 사용할 수 없다.
    예시
    • 참고자료를 참고하여 예시를 재구성 해보았다.

    위 코드 실행 결과

     

    8. 인터페이스의 장점

    인터페이스의 장점
    • 개발시간을 단축시킬 수 있다. 메소드를 호출하는 쪽에서 메소드의 내용에 관계없이 선언부만 알면 되기 때문이다.
    • 표준화가 가능하다.
    • 서로 아무 관계가 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 할 수 있다.
    • 클래스의 선언과 구현을 분리시킬 수 있기 때문에, 독립적인 프로그램 작성이 가능하다.

     

    참고자료

    댓글

Programming Diary