Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Tags
more
Archives
Today
Total
관리 메뉴

forDevLife

[java] 디폴트 메서드, static 메서드 본문

Java

[java] 디폴트 메서드, static 메서드

JH_Lucid 2021. 5. 28. 21:29

- 인터페이스에 디폴트 메서드, 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메소드

Comments