티스토리 뷰

Java 8 이상부터 큰 기능 개선이 있었다.

그 중 하나는 인터페이스가 구현체를 가질 수 있게 된 것이다.

바로 Interface의 Default Method 기능이다.

인터페이스에 들어있는 구현 메서드를 클래스에서 바로 사용할 수 있다.
물론 오버라이드 해서 다른 기능을 하게 할 수도 있다.

//Main.java
interface MyInterface {
    void method(); //추상 메서드 (구현이 없다)
    default void sayHello() { //interface가 default 키워드를 사용하면 구현 메서드를 가질 수 있다.
        System.out.println("Hello World");
    }
}

public class Main implements Myinterface {
	public static void main(String[] args) {
    	new Main().sayHello(); //interface의 default method 사용
    }
    
    @Override
    public void method1() {
        throw new RuntimeException();
    }
}

그렇다면 default method는 어떤 경우 쓸까?

 

먼저, Adapter의 기능을 대신할 수 있다.

//MyInterface.java
public interface MyInterface {
    void method1();
    void method2();
}
//Main.java
public class Main {
	public static void main(String[] args) { }
}
class Service implements MyInterface {
    @Override public void method1() { System.out.println("필요해요");}
    @Override public void method2() { System.out.println("필요하지 않아요");}
}

기존에는 method2()를 사용하고 싶지 않더라도 MyInterface를 구현했기 때문에 Override를 해야했다.

//MyAdapter.java
public class MyInterfaceAdapter implements MyInterface {
    @Override public void method1() {}
    
    @Override public void method2() {}
}

 따라서 내가 쓰고 싶은 메서드만 쓰기 위해서 중간에 Adapter를 생성하여 사용했었다.
MyInterface를 구현한 MyInterfaceAdapter를 만들고, Main에서 이를 상속하는 것이다.
하지만 Java는 단일 상속만 허용하기 때문에, 이미 다른 클래스를 상속받았다면, 이런 방식을 할 수 없었다.
구현하고 싶은 인터페이스에 사용하지 않을 메서드가 많다면..?
이 때, default메서드를 사용하면 Adapter를 사용하지 않아도 된다.

 

두 번째로, 같은 내용으로 오버라이드를 하는 경우 중복 코드를 줄일 수 있다.

//Main.java
class Duck implements Swimmable, Walkable {
    @Override public void swim() { System.out.pritnln("SWIM");}
    @Override public void walk() { System.out.println("WALK");}
}

class Swan implements Flyable, Walkable {
    @Override public void fly() { System.out.pritnln("fly");}
    @Override public void walk() { System.out.println("WALK");}
}

위의 경우 Walkable 인터페이스에서 walk() 메서드를 default 메서드로 구현한다면 중복된 코드를 줄일 수 있게 된다.

//Walkable.java
public interface Walkable {
    default void walk() { System.out.println("WALK");}
}
//Main.java
class Duck implements Swimmable, Walkable {
    @Override public void swim() { System.out.pritnln("SWIM");}
}

class Swan implements Flyable, Walkable {
    @Override public void fly() { System.out.pritnln("fly");}
}

public class Main {
    public static void main(String[] args) {
        new Duck().swim();
        new Duck().walk();
        new Swan.fly();
        new Swan.swim();
    }
}

위와 같이 default method를 사용하면 walk()메서드를 오버라이드 하지 않더라도 해당 기능을 사용할 수 있다.

 

세 번째로, static method도 가질 수 있게 되었다.

//Ability.java
public interface Ability {
    static void sayHello() { System.out.println("Hello World");}
}
//Main.java
public class Main {
    public static void main(String[] args) {
        Ability.sayHello();
    }
}

따라서 인터페이스에 static 메서드를 구현하고 바로 사용할 수 있게 되었다. -> 함수 제공자가 되었다.

메소드는 클래스에 종속된 함수를 말하고, Java8부터 함수와 구별하여 용어를 사용한다.


default method

  • 인터페이스가 구현체를 가질 수 있게 되었다.
  • 이것은 Adapter역할을 할 수 있다.
  • 인터페이스 구현만으로도 기능을 확장할 수 있게 되었다.
  • static method도 구현할 수 있게 되었다. -> 함수 제공자가 되었다.
728x90
반응형
댓글
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함