람다

buta LOG·2022년 8월 16일
0

Java

목록 보기
4/5
post-thumbnail

함수형 인터페이스와 람다 표현식

함수형 인터페이스

  • 추상 메소드를 딱 하나만 가지고 있는 인터페이스
  • SAM (Single Abstract Method) 인터페이스
  • @FunctionaInterface 애너테이션을 가지고 있는 인터페이스
  • 추상 메소드만 1개이면 되고 static 메소드나 default 메소드는 여러 개 포함할 수 있습니다.
  • 함수형 인터페이스를 이용해 람다 표현식을 구현(사용)할 수 있습니다.
  • 람다를 구현하기 위해 함수형 인터페이스를 사용한다고 볼 수 있습니다.
@FunctionalInterface
public interface RunSomething {
		void doit();

		static void printName() {
				System.out.println("이름");
		}

		default void printAge() {
				System.out.println("나이");
		}
}

자바 8 이전

//익명 내부 클래스 
RunSomething runSomething = new RunSomeThing() {
		@Override
		public void doit() {
				System.out.println("Hello");
		}
}

자바 8 이후

RunSomething runSomething = () -> System.out.println("Hello");

RunSomething runSomething = () -> {
		System.out.println("Hello");
		System.out.println("lambda");
}

자바에서 함수형 프로그래밍

  • 함수를 First class object로 사용할 수 있다.
  • 순수 함수 (Pure function)
    • 사이드 이펙트 만들 수 없다. (함수 밖에 있는 값을 변경하지 못한다.)
    • 상태가 없다. (함수 밖에 정의되어 있는)
  • 고차 함수 (High-Order Function)
    • 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다.
  • 불변성

람다 표현식 (Lambda Expressions)

  • 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다.
  • 코드를 줄일 수 있다.
  • 메소드 매개변수, 리턴 타입, 변수로 만들어 사용할 수도 있다.
  • (인자 리스트) → {바디}

인자리스트

  • 인자가 없을 때 : ( )
  • 인자가 한개일 때 : (one) 또는 one
  • 인자가 여러개 일 때 : (one, two)
  • 인자의 타입은 생략가능, 컴파일러가 추론하지만 명시할 수도 있다.

바디

  • 화살표 오른쪽에 함수 본문을 정의한다.
  • 여러 줄인 경우에 { }를 사용해서 묶는다.
  • 한 줄인 경우에 { } 생략 가능, return도 생략 가능

메소드 레퍼런스

  • 람다가 하는 일이 기존 메소드 또는 생성자를 호출하는 거라면, 메소드 레퍼런스를 사용해 매우 간결하게 표현할 수 있다.
public class Greeting {
		private String name;

		public Greeting() {
		}

		public Greeting(String name) {
				this.name = name;
		}

		public String hello(String name) {
				return "hello " + name;
		}

		public static String hi(String name) {
				return "hi " + name;
		}
}
UnaryOperator<String> hi = (s) -> "hi " + s;

// 스태틱 메소드 참조
UnaryOperator<String> hi = Greeting::hi;

// 인스턴스 메소드 참조
Greeting greeting = new Greeting();
UnaryOperator<String> hi = greeting::hello;

// 기본 생성자
Supplier<Greeting> newGreeting = Greeting::new;

// 매개변수가 있는 생성자
Function<String, Greeting> newGreeting = Greeting::new;

Greeting greeting = newGreeting.get();
profile
한 줄 소개

0개의 댓글