본문 바로가기
BE/Java

[JAVA] 자바 intersection type이 뭔지 알아보자! (with 람다)

by suhyeon chae 2023. 12. 26.

❗️이 글을 보기 위해선 java generic(제네릭)이 선행되어야 한다. 

잘 모른다면 아래 두 개의 포스트를 먼저 읽고 오는 것을 추천한다.

 

https://suhyeon-developer.tistory.com/23

 

[JAVA] Generic 한 걸음 나아가기! (1) 개념편

제네릭(Generic)이란? ❗️ Java로 개발하면서 한 번쯤 List 또는 Map 같이 기호 안에 타입이 적혀져있는 것을 경험 해봤을 것이다. 이게 뭘까? ✅ 제네릭이 뭐야? "Java 프로그래밍 언어에서 사용되는

suhyeon-developer.tistory.com

https://suhyeon-developer.tistory.com/24

 

[JAVA] Generic 한 걸음 나아가기! (2) 실전편

❗️제네릭이 뭔지 궁금하다면 이전 포스트를 참고하길 바란다. https://suhyeon-developer.tistory.com/23 s.compareTo(elem) > 0).count(); } public static void main(String[] args) { // Integer 배열에 대해 countGreaterThan 메서드

suhyeon-developer.tistory.com

 

 

intersection type이 뭐야?
✔︎ Java 'intersection type'은 두 개 이상의 타입 상한(upper bound)을 결합하여 하나의 타입으로 지정하는 것을 의미한다.
✔︎ 제네릭 타입에서 사용되며, 여러 상위 타입을 조합하여 하나의 타입으로 지정하는 것이 가능하도록 한다.
public class IntersectionType {

    interface Hello extends Function {
        default void hello() {
            System.out.println("Hello");
        }
    }

    interface Hi extends Function{
        default void hi() {
            System.out.println("Hi");
        }
    }
    
    private static <T extends Function & Hello & Hi> void hello(T t) {

    }
    


    public static void main(String[] args) {
        hello((Function & Hello & Hi) s -> s);
    }
}
✔︎ Hello와 Hi라는 인터페이스가 있고 각각 default method를 가지고 있다. 
✔︎ hello()라는 intersection type을 사용한 method가 있다. (여기서 intersection type은 <T extends Function & Hello & Hi>  이 부분을 말하며 intersection type을 표현하는 방법중 하나이다.)
✔︎ main method에서 hello()를 호출하고 있다. s -> s는 람다식이며 단순히 파라미터를 넣으면 파라미터를 반환하는 로직이다.

✔︎ 이 때, 람다식에 적용되는 intersection type의 조건은 interface가 구현해야할 일반 메서드는 1개여야 한다. (default method 제외)
✔︎ Function에는 apply라는 method가 정의되어 있다. (R apply(T t);)

⇢ T는 Function, Hello, Hi를 모두 만족하는 타입이어야한다.

 

 

💡 hello 메서드의 T는 위 설명에서도 적어놨듯이 Function, Hello, Hi를 모두 만족하는 타입이기 때문에 t는 Fuction에 있는 apply 메서드 뿐만아니라 Hello와 Hi에 있는 default 메서드(hello(), hi()) 도 사용가능하다.

    // 인터섹션 타입을 이용해서 디폴트 메서드를 가진 인터페이스를 추가했더니 인터페이스 기능 + 디폴트 메서드의 기능을 다합쳐 사용할 수 있는 새로운 객체를 만들 수 있게 되었음
    // Hello와 Hi가 Function을 extends하고 있기 때문에 Function의 apply 메서드를 가지고 있는데 각각 apply method를 가지고 있다고 해서 총 3개의 메서드를 가지고 있는게 아니라 모두 Function의 apply 메서드를 가지고 있기 때문에 궁극적으로 메서드 1개를 가지고 있다고 취급한다.
    private static <T extends Function & Hello & Hi> void hello(T t) {

        // 추가적으로 default 메서드를 사용할 수 있다.
        t.hello();
        t.hi();
    }

 

 

 

아직 잘 모르겠다.. 사용하면 뭐가 좋은데? (장점)

 

✔︎ 주요 장점은 여러 인터페이스 또는 클래스의 기능을 조합하여 새로운 타입을 만들 수 있다는 것이며 이로 인한 여러 가지 이점들이 있다.

코드 재사용성 향상 기존의 여러 인터페이스에서 제공하는 기능을 조합하여 새로운 타입을 생성할 수 있어 중복 코드를 줄이고 기능을 재사용 할 수 있다.
유연성 증가 intersection type을 사용하면 단일 상속으로는 얻을 수 없는 다양한 기능을 가진 객체를 생성할 수 있다. 다양한 인터페이스를 조합함으로써 객체의 역할을 더 세분화하고 유연한 설계를 할 수 있다.
API 디자인 향상 여러 인터페이스를 조합하여 새로운 타입을 만들 수 있기 때문에 API 디자인에서 더 다양한 선택지를 제공할 수 있다.
함수형 프로그래밍과의 통합 Java 8에서 추가된 람다 표현식과 함께 intersection type을 사용하면 함수형 프로그래밍의 개념을 더 효과적으로 활용할 수 있다. 
다중 상속의 대안 Java는 단일 상속만을 허용하므로 여러 부모 클래스로부터 기능을 상속받을 수 없다. 하지만 intersection type을 사용하면 다중 상속의 일부 유사한 효과를 얻을 수 있다.

 

 

 

.

.

.

 

 

🔆 해당 글은 '토비의 스프링' Youtube를 참고하여 공부한 후 작성한 글입니다.