forDevLife
[java] 디폴트 메서드, static 메서드 본문
- 인터페이스에 디폴트 메서드, static 메서드 추가 가능(JDK 1.8 부터)
+tmi : java.util.Collection 인터페이스와 관련된 static 메서드들이, 기존에 인터페이스에는 추상 메서드만 들어가야 한다는 조건 때문에
Collections 클래스로 들어가게 되었다.
-. 접근 제어자는 항상 public, 따라서 오버라이딩 시 public으로 써줘야 한다. 아무것도 안쓰면 default -> 더 좁은 범위라 허용 안됨.
-. 인터페이스는 추상 메서드 집합
-. 만약 새로운 메서드 추가하고 싶음 -> 추상 메서드를 추가한다는 의미
-. 하지만, 이렇게 된다면, 기존에 이 인터페이스를 구현했던 클래스들이 모두 새로운 메서드를 구현해야 함.. very bad
-> default 메서드로 해결!
interface MyInterface {
void method();
default void newMethod() {} <- 몸통이 생김
}
-. 위와 같이 default 메서드 정의를 통해, 다른 클래스들의 부담을 덜어줌
-. default 메서드는 인터페이스 원칙 위반..(예외임)
-. 여기에 붙는 default는 접근제어자가 아니다!! default 메서드도 역시 접근제어자가 public임에 유의한다.
-. 인터페이스 내에서 default 메서드를 구현함으로써 다른 클래스에 부담이 없다.
- 디폴트 메서드가 기존의 메서드와 충돌할 때의 해결책 -> 오버라이딩으로 해결
-. 여러 인터페이스의 디폴트 메서드 간 호출 시, 인터페이스 구현한 클래스에서 디폴트 메서드를 오버라이딩
-> 아래 예시에서, Child는 인터페이스 2개를 상속받으며 이 2개 인터페이스에 동일하게 method1, 2가 default로 구현되어 있다.
-> 따라서 Child, 또는 부모에서 method1, 2를 모두 오버라이딩 해 줘야 에러가 나지 않는다.
(어떤 인터페이스의 default를 사용하는지 모호하므로)
-. 디폴트 메서드와 조상 클래스의 메서드 간의 충돌 -> 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
package com;
public class Ex14_0 {
public static void main(String[] args) {
Child c = new Child();
c.method1();
c.method2();
MyInterface.staticMethod();
MyInterface2.staticMethod();
}
}
class Child extends Parent implements MyInterface, MyInterface2 {
public void method1() {
System.out.println("method1() in Child");
}
}
class Parent {
public void method2() {
System.out.println("method2() in Parent");
}
}
interface MyInterface {
default void method1() {
System.out.println("method1() in MyInterface");
}
default void method2() {
System.out.println("method2() in MyInterface");
}
static void staticMethod() {
System.out.println("staticMethod() in MyInterface");
}
}
interface MyInterface2 {
default void method1() {
System.out.println("method1() in MyInterface2");
}
default void method2() {
System.out.println("method2() in MyInterface");
}
static void staticMethod() {
System.out.println("staticMethod() in MyInterface2");
}
}
도움이 되는 블로그 :
https://dahyeee.tistory.com/entry/JAVA-interface-default-static메소드
'Java' 카테고리의 다른 글
[java] hashCode(), toString(), equals() (0) | 2021.06.02 |
---|---|
[java] 익명 클래스(anonymous class) (0) | 2021.05.28 |
[자바의정석]Chapter 16. 네트워킹 (0) | 2021.04.19 |
[자바의정석]Chapter 15. 입출력 I/O - 2 (0) | 2021.04.14 |
[자바의정석] Chap 15. 입출력 I/O (0) | 2021.03.25 |