.
이전 글을 작성하면서 iterator 인터페이스를 뜯어보다가 default 키워드와 함께 구현된 메소드를 발견하게 되었다.
default 키워드는 처음 보는 키워드였기에 어떤 역할을 하는지 찾아보았다. interface는 기본적으로 함수 몸체를 구현하지 않고, interface에서 상속하는 클래스에서 모든 구현을 담당해야 한다. interface를 구현할 때 메소드의 내부까지 함께 구현해두고 싶은 메소드가 있다면 default 키워드를 맨 앞에 작성하고, 몸체를 구현해주면 된다고 한다.
예제를 만들어보았다.
< Animal.Interface >
public interface Animal {
void run();
void eat();
default void breathe() {
System.out.println("breathe");
}
}
breathe 메소드는 default로 선언하고 내부를 구현해주었다.
< Cat.Java >
public class Cat implements Animal {
@Override
public void run() {
System.out.println("cat run");
}
@Override
public void eat() {
System.out.println("cat eat");
}
}
Cat 클래스에서는 run, eat만 override했다. breathe는 상위에서 구현된 형태를 그대로 사용한다.
< Dog.java >
public class Dog implements Animal {
@Override
public void run() {
System.out.println("dog run");
}
@Override
public void eat() {
System.out.println("dog eat");
}
@Override
public void breathe() {
System.out.println("dob breathe");
}
}
Dog 클래스에서는 breathe도 override해서 내부를 구현하였다.
< Main.java >
public class Main {
public static void main(String[] args){
Cat cat = new Cat();
Dog dog = new Dog();
cat.run();
cat.eat();
cat.breathe();
dog.run();
dog.eat();
dog.breathe();
}
}
< 실행 결과 >
cat.breath() 실행 시 interface에 default로 정의한 메소드가 호출되고, dog.breath() 실행 시에는 override한 메소드가 호출됨을 확인할 수 있다.
interface를 상속하는 클래스에서 공통적으로 메소드를 상속하고, 같은 기능을 사용할 때 좋다고 한다. interface는 다중 상속을 막기 위해서 만들어졌다고 알고 있었기에 default method 기능이 있는 건 이상하다고 생각해서 구글링을 더 해봤다.
자세히는 모르겠으나 다중 상속을 피하기 위한 solution이 제공되어 있는 듯 하다. 결국 다중상속을 피하는 건 개발자의 책임이 된 것 같다. 그리고 abstract을 사용해서 상속을 구현하면 abstract class에 모든 구현을 미리 짜야하는 불편함이 있었는데, interface는 헤더만 선언하면 되어서 그럴 필요가 없다는 장점이 있다고 한다. abstract class와 interface중 무엇을 써야 하는가에 대해 옛날엔 논쟁이 많았던 모양인데, java8에서 interface에 default method나 static method 기능이 추가되면서 interface를 사용하기 더 수월해졌다는 글도 볼 수 있었다. 다중상속은 개발자가 조심하기만 하면 되는 일이니 이해가 되는 것 같다.
.
- 참고
programmers.co.kr/learn/courses/5/lessons/241
stackoverflow.com/questions/19998454/when-to-use-java-8-interface-default-method-vs-abstract-method
goodgid.github.io/Java-8-Default-Method/
'java' 카테고리의 다른 글
[210116] java comparable & comparator (0) | 2021.01.16 |
---|---|
[210112] java collection (0) | 2021.01.12 |
[201216] lambda 및 함수적 인터페이스 (0) | 2020.12.16 |
[201209] java iterator (0) | 2020.12.09 |
[201019] spring AOP pointcut annotation (0) | 2020.10.19 |