보통사람

[Study-8주차] 인터페이스 본문

Study

[Study-8주차] 인터페이스

pej4303 2021. 1. 4. 22:12
  • 목표

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

  • 학습할 것 (필수)

    • 인터페이스 정의하는 방법

    • 인터페이스 구현하는 방법

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

    • 인터페이스 상속

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

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

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

 

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

 

  • interface 키워드를 이용

  • 접근 제어자로 public  또는 default만 가능함

  • 추상 메소드와 상수만을 멤버로 가질 수 있음

  • 모든 멤버 변수는 public static final 이어야 하며 생략할 수 있음

  • default 메소드와 static 메소드를 제외한 모든 메소드는 public abstract 이어야 하며 생략할 수 있음 

    • default 메소드와 static 메소드는 Java 1.8에 추가되었음

  • 접근 제어자는 편의상 생략하는 경우가 많으며 컴파일 시 컴파일러가 자동으로 추가해줌

interface 인터페이스명 { 
    // 멤버 정의
}


public interface Cat {
    public static final String myName = "Cat";    // 멤버 변수
    public abstract void printName();             // 추상 메소드
}

interface Cat {
    String myName = "Cat";                       // == public static final String myName = "Cat";
    void printName();                            // == public abstract void printName();
}

 

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

 

  • 추상 클래스처럼 인스턴스를 생성할 수 없음

  • implements 키워드를 이용해서 구현함

    • 일부만 구현할거라면 추상 클래스로 선언해야 함

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

}


public interface Cat {
    String myName = "Cat";
    void printName();
}

public class CatImpl implements Cat {

    @Override
    public void printName() {
        System.out.println("CatImpl");
    }
}

 

3. 인터페이스 상속

 

  • 인터페이스로부터만 상속받을 수 있음(extends)

  • 여러 개의 인터페이스 상속 가능

  • 클래스와 달리 최상위 부모가 없음

public interface Dog extends Animal, Cat {

}

 

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

 

  • 추상 클래스처럼 인스턴스를 생성할 수 없으며 인터페이스 구현체에서 인스턴스를 생성해야 함

  • 상속(extends)과 구현(implenents)을 동시에 할 수도 있음

  • 인터페이스 타입의 참조 변수로 구현체의 인스턴스를 참조할 수 있음

package com.study.halle.s1.week08;

public class CatImpl implements Cat {

    @Override
    public void printName() {
        System.out.println("Cat 인터페이스에 있는 메소드");
    }

    public static void main(String[] args) {
        // 구현체의 인스턴스를 통해서 메소드 호출
        CatImpl c = new CatImpl();
        c.printName();
        
        // Up-casting 
        Cat cat = new CatImpl();
        cat.printName();
    }
}

 

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

 

  • Java 1.8에서 추가되었으며  default 키워드를 이용함

  • 접근 제어자는 public 이며 생략 가능함

  • 기존에 있는 인터페이스를 유지하면서 새 기능을 넣을 수 있음

  • 메소드 구현부까지 있어야 하므로 인터페이스 구현체에서 런타임 시 에러가 발생할 수도 있음 때문에 @implSpec 태그를 이용해서 해당 메소드의 기능을 적어주는 것이 좋음

  • 구현 받는 쪽에서 오버 라이딩(재정의)도 가능함

  • Object 클래스에서 제공하는 메소드는 기본 메소드로 할 수 없음(추상 메소드는 가능함)

  • 인터페이스끼리 기본 메소드가 중복된다면 인터페이스 구현체에서 오버 라이딩(재정의) 해야 함

default 메소드 선언부 {
    // 코드 내용
}


default void printDefault() {
    System.out.println("기본 메소드");
}

 

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

 

  • Java 1.8에서 추가되었으며 static 키워드를 이용함
  • 기본 메소드와 마찬가지로 접근 제어자가 public 이며 생략 가능함
static 메소드 선언부 {
    // 코드 내용
}


static void printStatic() {
    System.out.println("static 메소드");
}
public interface Car {

    default void printDefault() {
        System.out.println("기본 메소드");
    }

    static void printStatic() {
        System.out.println("static 메소드");
    }
}

public class MyCar implements Car {

    public static void main(String[] args) {
        Car car = new MyCar();
        car.printDefault();    // 기본 메소드 호출
        Car.printStatic();     // static 메소드 호출
    }
}

[실행결과]
기본 메소드
static 메소드

 

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

 

  • Java 9에서 추가되었으며 private 메소드와 private static 메소드를 인터페이스에서 사용 할 수 있음

  • 구현체에 상속되지 않음

  • 인터페이스내의 다른 메소드에서 private 메소드를 사용 할 수 있음

private 메소드 선언부 { 
    // 코드 생략
} 

private static 메소드 선언부 { 
    // 코드 생략
} 

 

 

※ 참조

 

Java의 정석

www.tcpschool.com/java/java_polymorphism_interface

howtodoinjava.com/java9/java9-private-interface-methods/

 

'Study' 카테고리의 다른 글

[Study-11주차] Enum  (0) 2021.01.26
[Study-9주차] 예외 처리  (0) 2021.01.12
[Study-7주차] 패키지  (0) 2020.12.29
[Study-6주차] 상속  (0) 2020.12.22
[Study-5주차] 클래스  (0) 2020.12.13