ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 8주차 과제 : 자바의 인터페이스
    Java/온라인 자바 스터디 2021. 1. 16. 18:58
    반응형

    목표

    자바의 인터페이스 학습하기


    학습할 것

    인터페이스 정의하는 방법

    인터페이스 구현하는 방법

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

    인터페이스 상속

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

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

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


    인터페이스 정의하는 방법

    인터페이스를 작성하는 것은 크래스를 작성하는 것과 같다. 다만 키워드로 class 대신 interface를 사용한다는 것만 다르다.  그리고 interface에도 클래스와 같이 접근제어자로 public 또는 default를 사용할 수 있다.


    interface 인터페이스명 {

    public static final 타입 상수명 = 값;

    public abstract 메서드명(매개변수);

    }


    일반적으로 클래스의 멤버들과 달리 인터페이스의 멤버들은 다음과 같은 제약사항을 가지고 있다.

    - 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.

    - 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.


    인터페이스 구현하는 방법

    인터페이스도 추상클래스처럼 그 자체로는 인스터스를 생성할 수 없으며, 추상클래스가 상속을 통해 추상메서드를 완성하는 것처럼, 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야하는데, 그 방법은 추상클래스가 자신을 상속받는 클래스를 정의하는 것과 다르지 않다. 다만 클래스는 확장한다는 의미의 키워드 'extends'를 사용하지만 인터페이스는 구현한다는 의미의 키워드 'implements'를 사용할 뿐이다.


    class 클래스명 implements 인터페이스명 {

    // 인터페이스에 정의된 추상메서드를 구현해야한다.

    }


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

    인터페이스 Parseable을 클래스 Parser가 구현했을 때, 다음과 같이 Parser인스턴스를 Parseable타입의 참조변수로 참조하는 것이 가능하다.

    Parseable p = (Parseable)new Parser();

    또는

    Parseable p = new Parser();

    Parseable타입의 참조변수로는 인터페이스 Parseable에 정의된 멤버들만 호출이 가능하다.

    따라서 인터페이스는 다음과 같이 메서드의 매개변수의 타입으로 사용될 수 있다.

    void parse(Parseable p){

    // ...

    }

    인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시 해당 인터페이스를 구현할 클래스의 인스턴스를 매개변수로 제공해야한다는 것이다.

    그래서 parse메서드를 호출할 때는 매개변수로 Parseable인터페이스를 구현한 클래스의 인스턴스를 넘겨주어야 한다.


    class Parser implements Parseable{

    public void parse(Parseable p){ // ... }

    }

    위와 같이 Parseable인터페이스를 구현한 Parser클래스가 있을 때, parse메서드의 매개변수로는 Parser인스턴스를 넘겨 줄 수 있다. 즉, parse(new Parser())와 같이 할 수 있다는 것이다.

    그리고 다음과 같이 메서드의 리턴타입으로 인터페이스의 타입을 지정하는 것 역시 가능하다.

    Parseable method() {

    // ...

    return new Parser();

    }

    리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.

    위에 코드에서는 method()의 리턴타입이 Parseable인터페이스이기 때문에 메서드의 return문에서 Parseable인터페이스를 구현한 Parser클래스의 인스턴를 반환한다.


    인터페이스 상속 

    인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중상속, 즉 여러 개의 인터페이스로부터 상속을 받는 것이 가능하다.


    interface Interface01 {

    doSomething01();

    }


    interface Interface02 {

    doSomething02();

    }


    interface Interface03 extends Interface01, Interface01 {}


    클래스의 상속과 마찬가지로 Interface03는 Interface01, Interface02에 정의된 멤버를 모두 상속받는다.

    그래서 Interface03자체에는 정의된 멤버가 하나도 없지만 Interface01, Interface02으로 부터 상속받은 두 개의 추상메서드, doSomething01(), doSomething02()을 멤버로 갖게 된다.



    출처 : 자바의 정석


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

    인터페이스는 메소드 선언만 가능하기 때문에 구체적인 구현을 담은 메서드를 선언할 수 없다. 자바8에서는 인터페이스의 메소드 선언 시 default를 명시하면 구체적인 구현을 할 수 있다.

    interface Parseable{

    default void parse(){

    // ...

    }

    }



    참조 : https://github.com/whiteship/live-study/issues/8

    반응형

    댓글

Designed by Tistory.