티스토리 뷰

추상메소드가 하나만 존재하는 인터페이스를 함수형 인터페이스 라고 한다.

defualt method, static method 가 있어도 괜찮다. (default / static method는 추상 메소드가 아니다)

 

추상메소드가 하나만 존재할 때 @FunctionalInterface 어노테이션을 달아준다.

FunctionalInterface에 있는 추상메소드를 함수 라고 부른다.

//Main.java
@FunctionalInterface
public interface MyRunnable {
    void run();
}

@FunctionalInterface
public interface MyMap {
    void map();
    default void sayHello() { System.out.println("Hello World");}
    static void sayBye() { System.out.println("Bye World");}
}

public class Main {
    public static void main(String[] args) {}
}

위의 두 인터페이스는 모두 함수형 인터페이스이다.


//Main.java
class SayHello implements MyRunnable {
    @Override public void run() { System.out.println("Hello World");}
}

public class Main {
    public static void main(String[] args) {
        new SayHello().run();
    }
}

 위의 코드에서 MyRunnable은 구현체가 없기 때문에, SayHello클래스에서 구현을 하고 Main클래스의 main함수에서 SayHello클래스를 통해 run()메소드를 수행한다.


//Main.java
class Greeting implements MySupply {
    @Override public String supply() { return "Hello World";}
}

class SayHello implements MyRunnable {
    @Override public void run() {
    // MySupply에서 제공되는 supply()를 사용하려면 MySupply를 구현한 Greeting 클래스를 생성해야 한다.
        new Greeting().supply();
        System.out.println("Hello World");
    }
}

public class Main {
    public static void main(String[] args) {
    // MyRunnable에서 제공되는 run()을 사용하려면 MyRunnable을 구현한 SayHello 클래스를 생성해야 한다.
        new SayHello().run();
    }
}

인터페이스에 있는 기능들을 사용하려면, 클래스에 구현이 되어야 한다.

따라서 매번 불필요한 임시 클래스들이 생성된다.

//Main.java
public class Main {
    public static void main(String[] args) {
        new class XXXX implements MySupply {
            @Override
            public String supply() { return "Hello World";}
        }.supply()
    }
}

위의 코드에서는 supply()메서드를 사용하기 위해 MySupply를 구현한 XXXX 클래스를 생성한 것을 볼 수 있다.

따라서 위와 같은 경우, 익명 클래스를 생성할 수 있다. 아래와 같이 코드를 간결하게 작성할 수 있다.

//Main.java
public class Main {
    public static void main(String[] args) {
        new MySupply() {
            @Override
            public String supply() { return "Hello World";}
        }.supply();
    }
}

함수형 인터페이스 구현체 안에서, 스코프 밖에 있는 데이터를 읽을 수는 있지만, 데이터를 쓰는 것은 지양해야 한다.

데이터를 쓰고 싶은 경우, 동기화 기능을 사용해야 한다.

그렇지 않다면, 멀티 쓰레드 환경에서 서로 다른 쓰레드들이 해당 값을 업데이트 하려고 할 때 race condition이 발생하게 된다.

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
글 보관함