ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20일차 - 람다와 함수형 인터페이스, 메소드 참조, Optional 클래스, 스트림
    AI 솔루션 개발자과정(Java, Python) 2022. 11. 4. 17:48

    람다와 함수형 인터페이스

    함수형 인터페이스 : 오직 추상 메소드 하나만 가지는 인터페이스.

     

    인스턴스보다 기능 하나가 필요한 상황을 위한 람다

    정렬 기준을 만들기 위해 Comparator 인터페이스를 구현하는 클래스를 만들고, compare 오버라이딩한 코드를 람다를 이용하여 작성하면

    코드가 간결해진다. Collections에 정렬에 필요한 오버라이딩부분이 들어갔기 때문에 더이상 클래스는 필요가 없어졌고, 지워도 무방한 상태가 된다.

     

     

    매개변수가 있고 반환하지 않는 람다식

    람다의 몸체가 하나의 문장으로 이루어져 있으면 중괄호를 생략할 수 있다.

    또한 매개변수의 자료형도 생략가능하다.

    매개변수가 하나인 경우 소괄호도 생략 가능하다.

     

     

    매개변수가 둘 인 람다식

    매개변수가 둘 이상이기 때문에 매개변수의 소괄호는 생략이 불가능하다.

    하지만 람다 몸체가 하나이기 때문에 중괄호는 생략가능하다.

     

     

    매개변수가 있고 반환하는 람다식 1

    리턴문은 중괄호를 생략 불가능하다.

    하지만 return을 지울 수 있으면 중괄호와 같이 지울 수 있다.

     

     

    매개변수가 없는 람다식

    매개변수가 하나인 경우 소괄호를 생략하지만, 이 경우 매개변수가 없기 때문에 소괄호를 표기해야 한다.

     

     

     

     

    함수형 인터페이스(Functional Interfaces)와 어노테이션

    인터페이스가 함수형 인터페이스의 조건에 부합한지 검사하는 어노테이션이다.

     

     

    정의되어 있는 함수형 인터페이스

    자바에는 미리 정의되어 있는 함수형 인터페이스도 있고, 미리 정의되어 있는 함수형 인터페이스를 사용하는 표준 메소드 및 클래스도 다수 정의되어 있다.

     

    Predicate 는 제네릭 기반의 함수형 인터페이스이다.

    Predicate를 사용한다는 것은 인자를 불리언(true or false)으로 반환하기 위해 사용한다는 뜻이다.

    이러한 함수형 인터페이스는 java.util.funtion 패키지에 묶여있다.

     

     

    Predicate 를 구체화한 다양한 인터페이스들

    Predicate 는 입력값을 받아 불리언으로 반환한다.

     

    Supplier 를 구체화한 다양한 인터페이스들

    Supplier는 매개변수는 가지지 않고, get을 통해 받은 입력값을 리턴한다. 

     

    Consumer 를 구체화한 다양한 인터페이스들

    Consumer는 매개변수로 입력값을 받아 처리는 하지만 리턴은 하지 않는다.

     

    Function 을 구체화한 다양한 인터페이스들

    Function을 구체화한 인터페이스들은 입력값을 다른 타입으로 변경할 때 사용한다.

    Bi는 매개변수가 2개일 때 붙는다.

     

     

     

    removeif 메소드

    if조건이 맞으면 제거한다 는 기능을 수행하는 메소드이다.

    Arrays.asList() 는 배열을 생성과 동시에 초기화한다. 단 불러온 값은 수정, 삭제가 불가능 하기 때문에 다시 인스턴스를 생성하여야 한다.

     

    doubleValue 에는 Integer와 Double이 구현되어있다.

    만약 0보다 작은값이라면 제거한다.

     

     

    메소드 참조

    메소드 참조의 유형 4가지와 메소드 참조의 장점

    메소드 참조는 메소드를 간결하게 지칭할 수 있는 방법으로 람다가 쓰이는 곳 어디서나 사용할 수 있다.

    이미 존재하는 메소드를 람다로써 참조할 수 있게 한다.

    메소드의 참조는 클래스 이름 :: 메소드 이름 구조로 작성한다.

    메소드를 실행하는 것이 아닌 참조한 하는 문장이기 때문에 메소드 뒤에 괄호는 붙지 않는다.

     

     

    static 메소드의 참조: 람다식 기반 예제

    스테틱 메소드의 참조는 

    배열을 만들고 생성과 동시에 초기화를 한다.

    수정을 위해서 인스턴스를 생성하고, 함수형 인터페이스 Consumer에 배열을 뒤집는 reverse 메소드를 호출하는 람다식을 작성 후 Consumer를 호출하여 실행하여 출력하는 코드이다.

     

    여기에서 람다식을 메소드의 참조문으로 변경하면 다음과 같다.

    reverse는 static 메소드로써 non-static 멤버를 참조할 수 없다. Consumer로 reverse를 참조한다면,

    Consumer를 사용해서 accept메소드 호출되는건 약속이 되어있는 상태이다. 

    Consumer를 c에 저장하고 호출하면 reverse 메소드가 호출되면서 처리가 가능해진다.

     

     

     

     

     

    Optional 클래스

    if문은 내부에 if문이 올 수 있고 그 if문에 또 if문이 들어갈 수 있다.

    하지만 이런식으로 코드를 작성하면 코드가 길어지고, null이 입력되면 예외가 발생한다.

     

    Optional 클래스의 of는 null을 허용하지 않지만, ofNullable은 null이 입력되어도 예외가 발생하지 않는다.

     

     

     

     

     

    Optional 클래스를 사용하면 if~ else~문을 대신할 수 있다.

    체이닝을 통해 .orElse() 를 사용하면 map메소드가 실행되지 않을 경우 해야할 행동을 지정할 수 있다.

     

     

     

     

     

     

    map은 Optional로 반환한다. 하지만 flatmap은 자료형 그대로 반환한다.

    map 은 String 문장에서, flatmap 은 Optional 문장에서 예외가 발생한다.

     

    그래서 Optional<String> os3 = ~~ 문장에서 map을 사용하면 예외가 발생하지 않는다.

    하지만 그냥 String os3 = ~~ 문장이라면 예외가 발생한다.

    반대로 Optional<String> os3 = ~~ 문장에서 flatmap을 사용한다면 예외가 발생한다. 예외가 발생하지 않으려면 Optional로 감싸줘야 한다.

     

    스트림

    스트림(Stream)의 이해

    스트림은 샤워호스를 통해 물이 이동하면서 필터를 통해 걸러지듯 데이터가 이동하면서 처리되는 줄기이다.

    스트림은 중간연산과 최종연산으로 나뉘어져 있다.

     

    A B C 가 있고, C가 최종연산이라고 생각하면 A과정과 B과정을 차례로 거치고 C로 오게 되는것과 B과정을 먼저 하고 A과정을 거쳐 C로 오는 방법이 있다.

     

    스트림을 생성하고 이를 대상으로 ‘중간 연산’과 ‘최종 연산’을 진행하면, 원하는 기준으로 데이터를 필

    터링하고 필터링 된 데이터의 가공된 결과를 얻을 수 있다.

     

    배열에 있는 홀수의 합을 구하는 코드이다.

    주어진 배열로 부터 스트림을 생성하고, 필터를 통해 홀수만 걸러낸다. 그 홀수를 더하여 총합을 구하는데

     

    이를 메소드 체이닝을 통해 생략할 수 있는 부분은 생략하고 필요한 부분만 간단하게 나타낼 수 있다.

     

     

    스트림의 배열 대상 메소드

    자료형에 따라 스트림 메소드가 따로 있고, 인덱스로 범위를 지정할 수 있다.

     

Designed by Tistory.