Java week8


8주차

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

인터페이스 정의

사용의미 정의

  • 객체를 사용하는 방벙에 대해서 정의한 타입

정의

  • 상수와 메소드만을 구성 멤버로 가지게 된다.
  • 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.
publix interface 인터페이스이름 {
    // 타입 상수명 = 값;
    public int MAX_COUNT = 10;

    // 타입 메소드명(매개변수, ...)
    public void upCount(int count);
    public void trunOff();

    // default 타입 메소드
    default void printCount(int count) {
        System.out.println("count: " + count);
    }

    // static 타입 메소드
    static void turnOn() {
        System.out.println("set turn on");
    }
}

인터페이스 구현

동작

  • 개발 코드 -> 인터페이스 호출 -> 객체에서 재 정의된 실제 메소드가 실행

구현클래스

  • pulic class 클래스명 implements 인터페이스명A, 인터페이스명B
  • 인터페이스명A, 인터페이스명B와 같이 1개 이상을 명시해서 다중 인터페이스를 사용할 수 있다
pulic class 클래스명 `implements 인터페이스명A,` {
    
    인터페이스명에 정의한 추상 메소드들에 대한 실질 메소드가 있어야 함.

}

익명 구현 객체

  • 일반적으로 위처럼 구현 클래스를 만들어서 사용하는 것이 일반적이고, 재 사용성에 유리하지만 일회성의 구현 객체를 만들기 위해서는 소스파일을 만들고 클래스를 선언하는 것이 비효율적이다.
  • 아래와 같이 소스파일을 만들지 않고, 구현 객체를 만들 수 있다.
인터페이스 변수 = new 인터페이스() {
    추상 메소드의 실체 메소드 선언
}

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

  • 하나의 예로 설명하자면
interface RemoteControl
 -> (구현) Television
 -> (구현) Audio

public void useRemoteControl (RemoteControl rd) { ... }
  • 메소드 호출 시 어떤 구현 객체를 매개값으로 주는지에 따라서 메소드의 실행결과는 다르다
    • 구현 객체가 인터페이스 타입으로 자동 변환(Promotion)이 된다는 것
    • 인퍼페이스가 구현 클래스의 부모의 역할을 한다고 생각할 수 있음

인터페이스 상속

  • 인퍼테이스도 (다중)상속을 지원
    • public interface 하위인터페이스명 extends 상위인터페이스명A, 상위인터페이스명B

자바 8 인터페이스 메소드

default, static

  • 자바 8에서 추가된 인터페이스의 새로운 멤버
  • public 접근제한자의 특성을 가지므로 기술하지 않아도 됨

default

  • 인터페이스에 정의했지만, 구현 객체에서만 사용할 수 있다.
  • 모든 구현 객체가 동일한 메소드를 가지고 있다고 생각하면된다.
  • 하방호환성을 위해서 제공된다.
    • 인터페이스에 새롭게 정의되고, 업그레이드 하는 부분이 계속 늘어가면서 하위 호환성을 지키지 못할 수 있다.
    • default 메소드로 정의하여 기존에 하위 버전의 기능을 유지하면서 기능을 업그레이드 할 수 있다는 이점이 있다.

static

  • 정적 메소드는 인터페이스에서 바로 호출이 가능한 메소드 이다.