Lamda (람다 표현식)

duckbill413·2023년 8월 13일
0

Java

목록 보기
3/5
post-thumbnail

Lamda

  • 함수적 프로그래밍의 형태로 재사용 가능한 코드 블록
  • 기존의 anonymous inner class를 이용한 처리 방식을 간결하게 처리
  • public static <T> void sort(T [] a, Comparator<? super T> c) {}
    • 람다식 사용시 runtime에 람다식이 익명 구현 객체로 변경
// Comparator 구현
// 기존의 익명 클래스 Comparator
public void sortByAnnonymouse() {
	Arrays.sort(langs, new Comparator<String>() {
		@Override
		public int compare(String o1, String o2) {
			return o1.comparetTo(o2);
		}
});

// 람다식을 이용한 Comparator
public void sortByLamda() {
	Arrays.sort(langs, (o1, o2) -> o1.compareTo(o2));
}

타겟 타입과 @FunctionallInterface

  • 타겟 타입 또는 함수형 인터페이스
    • Lambda 식이 할당되는 인터페이스를 Lambda 식의 타겟 타입이라 함
    • 타겟 타입은 abstract 메서드는 반드시 하나만 존재해야 함
  • @FunctionallInterface
    • 컴파일러가 하나의 abstract method만 있음을 체크
  • abstract method가 2개 이상 존재하는 경우는 여전히 익명의 inner class 사용

기본 Lamda 식

  • (type variable_name [,---]) -> {실행문;};
    • 매개변수의 타입은 런타임 시 대입되는 값에 따라 자동 인식도므로 일반적으로 생략
      • (msg) -> {System.out.println(msg);};
    • 매개변수 및 실행문이 하나일 때는 변수 및 실행문의 괄호 생략 가능
      • msg -> System.out.println(msg);
    • 리턴이 필요할 경우 return 문장 사용
      • (msg) -> { System.out.println(msg); return msg;};
    • 리턴문만 있는 경우 중괄호와 return을 생략할 수 있음
      • (msg) → “Hello “ + msg;

실행 블록에서의 변수 참조

  • Lamda 식 내부에서의 this는 외부 클래스의 instance
    • 외부 클래의 member 변수 : 접근제한자의 제약 없이 이용 가능
    • 외부 클래스의 local 변수 : final 키워드가 추가된 것으로 동작 → read only
    public class LamdaVariableTest {
    	private int instanceMember = 10;
    
    	public void useFIMethod(MyFunctionalInterface fi) {
    		fi.useNumber(1);
    	}
    	
    	public void lamdaMethodTest() {
    		int localVar = 20;
    		useFIMethod(msg -> {
    			System.out.printf("this: %s\n", this.getClass().getName());
    			System.out.printf("멤버 변수 참조: %d\n", this.instanceMember++);
    			System.out.printf("로컬 변수 참조: %d\n", localVar); // localVar은 읽기 전용
    			System.out.println(msg++);
    			System.out.printf("멤버 변수 참조: %d\n", this.instanceMember);
    			System.out.println(msg++);
    		});
    	}
    	
    	public static void main(String[] args) {
    		LamdaVariableTest lvt = new LamdaVariableTest();
    		lvt.lamdaMethodTest();
    	}
    }
  • 실행 결과
멤버 변수 참조: 10
로컬 변수 참조: 20
1
멤버 변수 참조: 11
2

기본 제공 API 종류

  • 자주 사용되는 함수적 표준 interface를 java.util.function package에 정의
    • 주로 메서드 또는 생성자의 parameter로 Lamda 식을 제공하기 위함
  • Consumer 계열
    • parameter는 있는데 return 이 없는 형태
    • parameter 타입에 따라 다양한 consumer 존재
  • Supplier 계열
    • parameter는 없는데 return이 있는 형태
    • return 타입에 따라 다양한 supplier 존재
  • Function 계열
    • parameter와 return 값이 있는 형태
    • parameter와 return type에 따라 다양한 인터페이스 존재
  • Operator 계열
    • Function 계열과 유사
      • parameter와 return 값을 가짐
    • 매개 값을 이용해 특정 연산을 수행 후 동일한 타입으로 리턴 하는 역할 수행
  • Predicate 계열
    • parameter를 받고 boolean 타입을 리턴
profile
같이 공부합시다~

2개의 댓글

comment-user-thumbnail
2023년 8월 13일

개발자로서 배울 점이 많은 글이었습니다. 감사합니다.

1개의 답글