티스토리 뷰

람다식 Lambda Expression

 

자바 8에 추가된 가장 큰 특징으로 "함수형" 프로그래밍 형태를 받아들인 결과

추상메서드가 한 개뿐인 인터페이스를 생성할 때 간편하게 쓰는 문법

 

함수형 프로그래밍? (함수형 vs 객체지향)

함수형 프로그래밍 객체지향 프로그래밍
기능 위주의 프로그래밍 기법
기능 즉, 함수가 따로 존재
원시함수로 작성하는 기법
클래스에 속성과 기능을 정의
1950년대 1990년대

 

 

< 기본 문법 >

(데이터타입 매개변수, ...) -> { 실행문, 실행문, ...}

 

 1. 기본형

(int x) -> { System.out.println(x); }  

 

2. 매개변수의 타입을 추론할 수 있는 경우에는 타입 생략 가능

(x) -> { System.out.println(x); }  

 

3. 매개변수나 실행문이 하나라면 소괄호( )와 중괄호{ }를 생략할 수 있다(이때, 세미콜론 생략!)

x -> System.out.println(x)   

 

4. 매개변수가 없을 경우에는 소괄호()를 사용한다. (생략 불가)

() -> System.out.println(x)

 

5. 리턴이 필요한 경우 return 키워드를 사용

(x, y) -> { return x + y; }

 

6. 실행문이 단순히  return 문 하나로 표현되는 경우 표현식만 사용할 수 있으며, 리턴 값은 표현식의 결과값이 된다.
(이때, 세미콜론은 붙이지 않는다!)

(x, y) -> x + y   

 

String[] str = {"this", "is", "java", "world"};
System.out.println(Arrays.toString(str));	
Arrays.sort(str);
// 오름 차순으로 정렬 후: [is, java, this, world]
System.out.println(Arrays.toString(str));

각각 출력 결과

 

 

새로운 정렬 기능을 만들려면?

- 내부적으로 Comparator의 compare 메서드를 사용하기 때문에 새로운 기능을 만들고 Array.sort()에 전달하면 됨!
- 자바에서는 함수만 전달할 방법이 없기 때문에 해당 기능을 가지는 객체를 전달해야한다!
=> 일회용으로 정렬 기능을 작성하려면? 익명의 내부 클래스!

 

익명의 내부 클래스

Anonymous로 적혀있던 클래스가 이거다! 익명의 성질을 가진 클래스라는 뜻

Arrays.sort(str, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2) * -1;
    }
});

 

람다식으로 변형!

//	Arrays.sort(str, (String o1, String o2) -> { return o1.compareTo(o2) * -1; });
//	Arrays.sort(str, (o1, o2) -> { return o1.compareTo(o2) * -1; });
Arrays.sort(str, (o1, o2) -> o1.compareTo(o2) * -1);

// 내림차순 정렬 후: [world, this, java, is]
System.out.println(Arrays.toString(str));

 

결국 정렬을 위해 필요했던 '기능'은 Comparator가 아니라 사실 compare() 라는 점이다!
- compare()만 있으면 되지만, 자바 특성상 익명의 내부클래스를 만들고 객체화(new)해서 전달하고 있다!
=> 이러한 번거로움을 없애기 위해 람다식이 등장!

 

 

함수형 인터페이스(functional interface) 또는 타겟타입(target type)

- 람다식은 결과적으로 "인터페이스 타입의 클래스를 손쉽게 구현하는 방법"

- 반드시 하나의 abstract 메서드만 존재
- 만약 abstract 메서드가 없거나 두 개 이상 존재한다면 람다식으로 대체할 수 없다!
- 함수형 인터페이스 @FunctionalInterface 어노테이션 선언

 

 

댓글
최근에 올라온 글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함