alclssha 2022. 11. 26. 14:37

람다식

  • 메서드를 하나의 "식"으로 표현한 것
  • 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로, "익명함수" 라고도 함
  • 함수명을 선언하고 사용하는 것이 아닌 식별자 없이 실행가능한 함수

 

특징

  • 메서드가 1번만 사용되고 메서드 길이가 짧은 경우 매우 유용
  • 절차형 프로그래밍, 객체지향 프로그래밍과는 사뭇 다르게 함수의 구현과 호출만으로 프로그램을 만드는 방식인 함수형 프로그래밍에서 자주 사용됨
  • 자바8부터 도입이 되었으며, 람다식을 익명함수로 만드는 것인데 익명함수는 일급객체 특징
  • 자바에서 메서드는 혼자서 생존할 수 없음
    • 객체가 아니기 때문에 클래스도 만들어야 하고, 객체도 생성해야 쓸 수 있음
    • 하지만 람다식으로 인해 변수처럼 스스로 존재하며 매개변수로 전달하거나 결과로 반환될 수 있음
      • 즉, 람다식으로 메서드는 객체로 취급

 

람다식 작성

int select(int a, int b){
	return a >  b ? a : b;
    }
//  일반적인 함수

(a,b) -> a > b ? a : b
//  람다식

 

람다식 사용 이유

  • 람다식을 쓰지 않을 때보다 코드가 간결해짐
  • 필터링 및 매핑시 집계결과를 쉽게 가져올 수 있음
  • 메서드를 호출하기 위한 불필요한 class, 객체 생성의 과정 불필요
  • 람다식 자체로 메서드의 매개변수로 전달되어지는 것이 가능
    • 결과로 반환 가능
      • 메서드를 변수처럼 다루는 것이 가능해짐

 

일급객체

일반적으로 다른 객체들에 적용 가능한 연산을 모두 지원하는 객체

함수를 값으로 사용 할 수도 있으며 파라미터로 전달 및 변수에 대입 하기와 같은 연산들이 가능

함수형 프로그래밍에 1급객체라는 말을 자주 사용

Kotlin 함수는 1급 객체지만, Java는 1급객체가 아님

3가지 조건을 만족하면 1급객체

  1. 함수를 변수에 할당할 수 있어야 함
  2. 다른 함수의 파라미터로 함수 객체를 넘길 수 있어야 함
  3. 함수의 리턴값으로 함수 객체를 리턴할 수 있어야 함

 

함수형 인터페이스

 

  • 추상메서드가 1개만 정의된 인터페이스
  • 람다식을 다루기 위한 인터페이스
  • 오직 하나의 추상 메서드만 정의되어 있어야 한다는 제약
  • static메서드와 default메서드의 개수에는 제약이 없음

 

  • 자바에서 모든 메서드는 클래스 내에 포함되어야 함, 람다식은 익명 클래스의 객체라고 보면 됨

 

 

익명클래스

  • 클래스 선언과 객체의 생성을 동시에 하여 한번만 사용될 수 있고 오직 하나의 객체만 생성할 수 있는 일회용 클래스

 

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

  • 람다식을 매개변수로 지정 가능하며, 반환타입으로 이용할 수 있음

 

람다식의 타입과 형변환

  • 람다식은 익명 객체이므로 타입이 없고, 함수형 인터페이스로 람다식을 참조할 수 있는 것일 뿐 람다식의 타입이 함수형 인터페이스의 타입과 일치하는 것은 아님
  • 실제로 타입이 없는것은 아니고, 타입은 있지만 컴파일러가 임의로 이름을 정하기때문에 알 수 없음

 

람다식 내에서 참조하는 지역변수는 final이 붙지 않았어도 상수로 간주
외부 지역변수와 같은 이름의 람다식 매개변수는 허용되지 않음