[자바8] 인터페이스 default method

skyepodium·2022년 3월 23일
1

자바8(2014)에서 인터페이스 default method(기본 메서드)가 추가되었습니다.

1. 개요

인터페이스 기본 메서드는 default 지시어로 정의되며 구현부를 가질 수 있는 메서드입니다.

기존 인터페이스는 구현부가 없는 추상 메서드만 가질 수 있었습니다.

interface Car {
    // 1. 추상 메서드
    void move();
    
    // 2. 기본 메서드
    default void airBack(){
        System.out.println("에어백 동작");
    };
}

인터페이스 구현 객체는 인터페이스에 정의된 메서드를 반드시 구현해야합니다.

다만, 기본 메서드를 통해 구현을 변경하지 않고, 인터페이스에 메서드를 추가할 수 있게 되었습니다.

2. 목적

기본 메서드의 목적은 구현체를 변경하지 않으면서 인터페이스를 확장하는 것에 있습니다.

예를 들어 자바 8 부터 List 컬렉션에 stream이 추가 되었습니다. 이를 위해서는 ArrayList에서 stream을 구현해야하는데 기본 메서드를 통해 stream을 제공하면서 ArrayList에서는 구현하지 않아도 되어 이전버전과의 호환성이 유지됩니다.

3. 다중 상속시 주의점

자바 인터페이스는 다중 상속이 가능합니다.

다만, 다중상속시 동일한 기본메서드가 있으면 컴파일 에러가 발생합니다.

1) 기본 메서드 충돌

동일한 이름의 기본 메서드를 상속 받으면 메서드 충돌이 발생합니다.

interface Car extends Machine, Vehicle{

}

interface Machine {
    default void move() {
        System.out.println("Machine move");
    }
}

interface Vehicle {
    default void move() {
        System.out.println("Vehicle move");
    }
}

참고로, 추상 메서드에서는 발생하지 않습니다.

interface Car extends Machine, Vehicle{
    void move();
}

interface Machine {
    void move();
}

interface Vehicle {
    void move();
}

2) 인터페이스에서 부모를 명시

인터페이스 둘 중 하나의 인터페이스만 사용하겠다고 명시할 수 있습니다.

interface Car extends Machine, Vehicle{

    @Override
    default void move() {
        Machine.super.move();
    }
}

interface Machine {
    default void move() {
        System.out.println("Machine move");
    }
}

interface Vehicle {
    default void move() {
        System.out.println("Vehicle move");
    }
}

3) 구현체에서 부모를 명시

구현체에서 어느 인터페이스를 사용할지에 대해 명시합니다.

class Truck implements Machine, Vehicle {
    @Override
    public void move() {
        Machine.super.move();
    }
}

4. 접근 제어자

default public, private 불가

5. 오버라이딩

public 메서드로 재정의 가능

6. 개인적인 생각

인터페이스는 추상화 정도를 높여야 하는데, 기본 메서드를 사용하면 추상화 정도가 낮아지기는 합니다. 다만, 기존 구현체를 모두 변경하지 않으면서 인터페이스를 확장할 수 있는 절충안 같습니다.

profile
callmeskye

0개의 댓글