Post

인터페이스의 default 메서드

접근 제한자 default

  • 보통 우리는 default를 접근 제한자로 많이 생각한다.
  • 자바에는 접근 제한자가 총 4개로 제한 수준이 작은 순서대로 public, protected, default, private 가 존재한다.
  • 그 중 default 는 같은 패키지 내에서의 접근을 허용하는 제한자 이다.
  • 접근 제한자를 별도로 설정하지 않는 경우 default로 설정된다.

접근제한자

간단히 상기만 하고 넘어가겠다.


인터페이스에서의 default 메서드

  • JDK 8부터 인터페이스에 static 메서드와 default 메서드의 추가를 허용했다.
  • 우리가 알던 접근 제한자와는 맥락과 목적이 완전히 다르다.
  • 인터페이스는 원래 일반 메서드를 허용하지 않기에 모든 메서드를 구현체가 구현해야 했다.
  • 그러나 default 메서드를 통해 해당 메서드를 구현체가 반드시 구현하지 않아도 되게 하며, 필요한 경우 오버라이드 할 수 있다.
  • 이는 인터페이스에 새로운 메서드를 추가할 때 기존 구현체에 영향을 미치지 않으면서도, 인터페이스를 확장할 수 있는 유연성을 제공한다.


default 메서드 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
interface Animal {
    void eat();

    // 인터페이스에 새로운 default 메서드 추가
    default void sleep() {
        System.out.println("This animal sleeps for 8 hours.");
    }
}

class Dog implements Animal {
    public void eat() {
        System.out.println("Dog is eating.");
    }

    // 'sleep' 메서드를 오버라이드하지 않아도 됨. 'Animal' 인터페이스의 default 구현을 사용
}

class Cat implements Animal {
    public void eat() {
        System.out.println("Cat is eating.");
    }

    // 'sleep' 메서드를 오버라이드하여 구현을 제공할 수도 있음
    public void sleep() {
        System.out.println("This cat sleeps for 12 hours.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.eat(); // Dog is eating.
        dog.sleep(); // This animal sleeps for 8 hours. (Default 메서드 호출)

        Animal cat = new Cat();
        cat.eat(); // Cat is eating.
        cat.sleep(); // This cat sleeps for 12 hours. (오버라이드된 메서드 호출)
    }
}


누군가가 물어본다면

java 8부터 인터페이스에 default 메서드를 허용하여 인터페이스를 더 유연하게 만들었습니다.
접근제한자 default와는 다른 개념으로 기존 구현체에 영향 없이 인터페이스를 확장할 수 있는 유연성을 제공합니다.
This post is licensed under CC BY 4.0 by the author.