본문 바로가기
Java

lambda2

by 스르나 2020. 7. 10.

Uitl 패키지의 함수형 인터페이스

람다식에 대해 이어서 적어보자

 

우선 앞에서 람다식을 사용하기 위해서 함수형 인터페이스를 사용해야 한다는 것을 알았다.

 

하지만 여기서 한가지 불만이 있다. 함수는 앞서 설명한대로 4가지의 유형이 있는데 사실 이런 유형이 매개변수가 있는 경우에서 매개변수의 갯수에 차이가 있을뿐 유형은 그대로이다.

 

이런 상황에서 4가지 유형의 함수형 인터페이스를 람다식을 위해 매번 만드는 것은 좀 번거로운 일이다.

 

그래서 자바 1.8의 Util패키지에 미리 4가지 경우의 함수형 인터페이스를 만들어 두었다.

 

종류 매개변수 반환
Runnable X X
Consumer<> O X
Supplier<> X O
Function<,> O O

 

위의 4사지의 사용을 바로한번 보자

 

Runnable runnable = () -> {
            System.out.println("Hello World!");
        };

        Consumer<String> consumer = (String name) -> {
            System.out.println(name);
        };

        Supplier<String> supplier = () -> {return "Hello World!";};

        Function<String,String> function = (String name) -> {
            return name;
        };

 

사용은 위와같다. 이렇게 미리 정의된 함수형 인터페이스를 사용하면 람다식을 사용하는 곳에 필요한 유형에 맞춰 골라서 쓰면 된다.

 

그런데 여기서 한가지 문제점이 보인다. 바로 제너릭에 의한 래핑(Wrapping)이다. 함수형 인터페이스때문에 Integer.Double같은 원시 자료형을 사용할 때마다 강제 래핑을 해야한다면 이는 성능에 문제가 생긴다.

 

그래서 형변환을 하지 않게 원시자료형을 사용할 수 있는 함수형 인터페이스가 있다.

 

함수형 인터페이스 설명
AToBFunction 입력이 A타입 출력이 B타입
ToAFunction<B> 출력이 B타입 입력이 A 제너릭 타입
AFunction<B> 입력이 A타입 출력이 B제너릭 타입
ObjACounsumer<B> 입력이 A,B타입이고 출력이 없다

 

위 방식을 사용하면 원시타입을 래핑하지 않고 사용할 수 있다.

 

한가지의 간단한 예만 봐도 이해가 갈것이다.

 

IntToDoubleFunction function1 = (int num) -> {return num*5.5;};

맨위의 AToBFunction을 사용할 것이다. A,B에 적당한 타입을 넣어 주면 된다.

 

메소드 참조

마지막으로 한가지 더 편리한 람다식 사용법을 설명하겠다.

 

우리가 람다식안에 쓰는 함수가 한가지라면 람다식을 좀 더 간단하게 사용할 수 있다.

 

예를 들어 아래와 같은 람다식을 보자

 

Function<String, Integer> f = (String str) -> Integer.parseInt(s);

이 람다식을 메소드를 표현하면 아래와 같다.

 

Integer foo(String str){
	return Integer.parseInt(str);
    }

여기서 보면 사용하는 함수는 parseInt뿐이다. 그렇다면 겉의 foo메소드를 때면 더 간단해지는데

 

그렇게 만든 람다식이 아래와 같다.

 

Function<String,Integer> f = Integet::parseInt;

위처럼 사용하면 Integet클래스의 parseInt메소드를 바로 호출한다.

 

이처럼 한가지만 있을때는 바로 호출이 가능하다.

 

호출하는 방법은 static메소드, 인스턴스 메소드, 특정 객체의 인스턴스 메소드 총3가지 경우에 따라 다르다

 

종류 람다 메소드
static (x)->ClassName.method(x) ClassName::method
인스턴스 (x)->obj.method(x) ClassName::method
특정객체 (x)->obj.method(x) obj::method

'Java' 카테고리의 다른 글

Thread-1  (0) 2021.02.08
Interface  (0) 2020.09.21
Generic  (0) 2020.07.21
Stream  (0) 2020.07.15
Lambda  (0) 2020.07.09