5/1, 5/2 람다식

박세현·2024년 5월 1일

JAVA

목록 보기
18/22
post-thumbnail

람다식(Lamda expression)

1. 람다식이란?

  • 메서드(함수)를 하나의 식으로 표현
  • 함수형 프로그래밍 스타일을 자바에 도입한 것
  • 함수형 인터페이스는 딱 하나의 추상 메서드를 갖는 인터페이스로, 람다식은 이 메서드의 구현체를 제공


1) 함수형 프로그래밍(자바크스립트)

① 일등함수

  • 함수 == 변수 / 함수가 값으로 사용

② 함수란?

  • 하나의 기능(단일기능)

③ 함수는 값으로 사용

  • 함수가 매개변수 : 사용자 정의 기능 = 함수내부에서 쓰일 목적 = 하나의 기능(단일기능)
  • 반환값:
    참고) 자바스크립트 - 클로저, 새로운 함수를 만드는 함수인 팩토리 함수

    클로저
    원래는 자유변수였다가 특정함수에 고정
    함수가 반환값일 때 가능



④ 자바는 함수는 값으로 사용 불가

  • 인터페이스의 객체가 되는 조건을 이용
  • 형식을 단순화

ㄴ 인터페이스가 객체가 되는 조건 사용
ㄴ 너무 길어!

ㄴ 형식 단순화 : 람다식


함수

  • 자바에서함수는 함수⭕
    ㄴ 값으로 쓰일 수❌
    ㄴ 함수 : 실행절차 및 재료가 나열된 코드에 불과 -> 객체가 되야 값으로 쓰일 수 있다
    -> 자바에서는 함수가 값으로 쓰일 수 없어서 함수형프로그래밍에 쓸 수❌
    -> 인터페이스가 객체가 되는 조건을 이용해서 함수형프로그래밍 사용가능하게끔 흉내냄
    -> 근데 이 식이 너무 길고, 용도가 제한적이므로 단순화하자 : 람다식

  • 자바스크립트에서 함수는 함수가❌
    함수형프로그래밍 사용
    ㄴ 값으로 쓰일 수⭕
    ㄴ 함수가 객체이다



2. 람다식 문법 살펴보기

  • 메서드를 하나의 식으로 짧게 표현한 문법
    -> 왜? 용도가 제한적이므로 굳이 길게 작성x
    -> 최대한 짧게 쓰는게 가장 좋은 방식

1) 접근 제어자, 반환값 타입, 함수명을 생략

2) 매개변수 정의 부분과 함수 구현 부분({ }) 사이에 -> 추가

3) 매개변수의 자료형 생략 가능

4) 구현코드가 한줄일때는 { ... } 생략 가능, return 예약어도 생략 해야 된다.

5) 최대한 짧게 쓰는 방향(변수명도 한 글자로 하는 것이 권장)




ㄴ 인터페이스 정의로 유추가능하니 자료형 생략가능

ㄴ 코드가 1줄이면 {}도 생략가능
ㄴ 인터페이스 정의 보니까 void 아니네
ㄴ return이 있을거 예상되니 생략

ㄴ 변수명도 너무 기니까 줄이자




3. 람다식 사용하기




4. 함수형 인터페이스(Functional Interface)

  • 단일기능, 단일 역할, 형식상 제한 조건
    : 추상메서드를 1개만 정의
    -> 명확한 형식 제어를 위한 애노테이션 @FunctionalInterface

ㄴ 1번 2번 중 뭘 수행해야할지 헷갈려...
ㄴ 함수형 인터페이스 : 하나의 인터페이스 안에 추상메서드1개만 정의가능
ㄴ 단일역할, 역할 1가지만 수행

@FunctionalInterface 이 있는 인터페이스가 보이면 -> 함수형 크로그래밍 즉 람다식을 써야하는 인터페이스다




5. 함수형 인터페이스 타입의 매개변수와 반환 타입




6. ✨java.util.function패키지

  • 자주 사용하는 함수형 인터페이스 정의
  • 암기하자...


매개변수 1개

1) ✨매개변수가 X, 반환값 1개

    Supplier<T> // 인터페이스
			: T get() // 메서드명

2) ✨매개변수가 1개, 반환값 0개

	Consumer<T>
			: void accept(T t)
            

3) ✨매개변수가 1개 반환값도 1개

	Function<T,R> 
			: R apply(T t) 

4) ✨매개변수가 1개, 반환값은 boolean(논리값)

    Predicate<T>
			: boolean test(T t)

참고)
predicate : 주로 판별을 의미




매개변수 2개

  • Bi 접두어가 추가

1) 매개변수가 2개, 반환값 X

	BiConsumer<T, U> // 인터페이스
		: void accept(T t, U u) // 메서드명

2) 매개변수가 2개, 반환값 1개

	BiFunction<T,U,R>
		: R apply(T t, U u)

ㄴ 불편하지 않니??
Integer : 객체 -> 이대로는 연산불가, 연산은 기본자료형만 가능
① 연산을 위해서 Integer -> int (언박싱),
반환값 Integer로 변환(오토박싱),
int result로 변환 -> (언박싱)
-> 성능저하, 연산은 기본형으로 하는게 좋다!
② 자료형(Integer) 반복
->효율성이 떨어지넹...

①, ② 해결완료
ㄴ 언박싱 오토박싱 발생x : 해설 -> 기본형 타입의 함수형 인터페이스
ㄴ 자료형 반복x : 해설 -> 매개변수와 반환값 타입이 같은 자료형인 경우


3) 매개변수가 2개, 반환값 boolean

	BiPredicate<T, U>
		: boolean test(T t, U u)

참고)
지네릭타입의 자료형은 참조자료형이랑 배열만 가능




✨매개변수와 반환값 타입이 같은 자료형인 경우

  • 자료형이 반복되는게 코드가 기니 매개변수와 반환값 타입이 같은 자료형인 경우 코드줄이자

1) 매개변수가1, 반환값1 -> 자료형이 모두 동일

UnaryOperator<T>   ---> 상위 인터페이스 Function<T, T>
	T apply(T t)

2) 매개변수가 2개, 반환값1 -> 자료형이 모두 동일

BinaryOperator<T>  ---> 상위인터페이스 BiFunction<T, T, T>
	T apply(T t1, T t2)




기본형 타입의 함수형 인터페이스

  • 오토박싱 언박싱 발생하지 않음


ㄴ To앞 : 매개변수타입 -> Long
ㄴ To뒤 : 반환값 타입 -> int

ㄴ 매개변수타입은 아무거나
ㄴ 반환값타입은 Long

참고) 자바문서
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/function/package-summary.html




7. Function의 합성과 Predicate의 결합

1) Function의 합성

  • 함수 결합
  • andThen, compose 둘다 함수결합으로 동일한 기능이지만 결합 시 방향성이 다르다
	Function
		andThen(Function ... )
		f.andThen(g) -> f -> g 
		
		
		compose(..)
		g.compose(f) -> f -> g


예시)


예시) andThen


예시) compose



2) Predicate의 결합

	Predicate 
		and // 둘다 참인조건
		or  // 하나라도 참
		negate // 참 -> 거짓, 거짓 -> 참


예시) Predicate


예시) and


예시) negate


참고) 자바문서
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/function/Predicate.html




8. 메서드 참조

  • 람다식을 더욱 간결하게 표현
  • 클래스명::메서드명
  • 참조변수::메서드명

예시) 클래스명::메서드명


예시2) 클래스명::메서드명


예시) 참조변수::메서드명

ㄴ 순서가 바뀌면 줄일 수x


예시) 메서드 참조

profile
귤귤

0개의 댓글