람다식의 개념 및 기본 문법
❓람다식이란 ?
람다식(Lambda Expression)은 자바 8부터 도입된 함수형 프로그래밍의 개념입니다. 람다식은 간단히 말하면 익명 함수(anonymous function)를 나타내는 것으로, 메서드를 하나의 식으로 표현하는 방법입니다. 기능이 비워져 있는 상태에서 기능을 추가해서 사용할 수 있도록 하는 것이 인터페이스 속에 있는 추상메서드이며, 그 메서드에 기능을 부여(정의)하여 사용하는 것이 람다식의 핵심입니다. 코드의 간결화 및 병렬처리에 효율적입니다. (Collection API 성능을 효과적으로 개선(Stream))
객체지향 프로그래밍은 프로그램을 객체들의 모임으로 구성하는 방식입니다. 객체는 데이터와 그 데이터를 처리하는 메서드로 이루어져 있으며, 객체들 간의 상호작용을 통해 프로그램이 동작합니다. 객체지향 프로그래밍에서는 데이터와 해당 데이터를 처리하는 메서드가 논리적으로 묶여있어 유지보수와 확장이 용이하며, 코드의 재사용성을 높일 수 있습니다.
반면, 함수형 프로그래밍은 함수를 일급 객체로 취급하고, 함수의 조합을 통해 프로그램을 작성하는 방식입니다. 함수형 프로그래밍은 상태 변경이나 가변 데이터보다는 불변성과 순수 함수(pure function)의 개념을 강조합니다. 순수 함수는 동일한 입력에 대해 항상 동일한 출력을 반환하며, 부작용(side effect)을 발생시키지 않는 함수를 말합니다.
람다식은 함수형 프로그래밍에서 함수를 간결하게 표현하기 위한 방법 중 하나입니다. 람다식은 익명 함수를 나타내는데, 함수형 프로그래밍에서 함수를 일급 객체로 다루는 특성과 잘 어울립니다. 람다식을 사용하면 함수를 변수에 할당하거나 매개변수로 전달할 수 있으며, 함수형 인터페이스를 구현하는 데 유용하게 사용됩니다.
람다식은 주로 함수형 인터페이스(functional interface)를 구현하기 위해 사용됩니다. 함수형 인터페이스는 단 하나의 추상 메서드만을 가지는 인터페이스를 말하며, 람다식은 이 추상 메서드의 구현을 직접 전달하는 방식으로 사용됩니다.
- 클래스 바깥에 올 수 있는 것은 패키지, 임포트, 외부클래스 내부에 올 수 있는 것은 필드, 메서드, 생성자, 이너클래스
람다식 이해를 위한 기본 용어의 정리- 함수(function) : 기능, 동작을 정의합니다.
void(리턴타입) abc(메서드 이름)(입력매개변수) { → 함수
//중괄호 안에 기능 및 동작을 입력
} - 메서드(method) : 클래스 또는 인터페이스 내부에서 정의된 함수 (=메서드)
class A {
void abc() { → class 내부에서만 존재가능한 함수는 메서드
//기능 및 동작
}
} - 함수형 인터페이스(functional interface) : 내부에 단 1개의 추상메서드만 존재하는 인터페이스
interface A {
public abstract void abc();
}
→ 인터페이스 내부에 2개 이상의 메서드가 담겨있다면 , 람다식으로 함수를 생략하여 작성하게 되면 어떤 메서드가 생략된 후 호출되는지 구분되어지기 않기 때문에 꼭 1개의 추상메서드만 담겨있는 인터페이스만 람다식으로 표현이 가능합니다.
- 함수(function) : 기능, 동작을 정의합니다.
- 함수적 프로그래밍에서의 함수 사용 (자주 사용하는 기능을 구현) : 함수를 정의하고 바로 호출할 수 있습니다.
- 객체 지향형 프로그래밍에서의 메서드(함수=기능)사용 : 인터페이스 or 클래스 내의 메서드 정의 및 구현 후 타입 참조변수로 객체를 생성 한 후 타입 참조변수를 이용해서 객체 내부의 메서드를 호출 할 수 있습니다.
package jungsuk_0624;
//추상메서드를 담고 있는 인터페이스를 정의
interface A {
void abc();
}
//인터페이스를 구현한 자식클래스이기 때문에 미완성 메서드를 구현할 의무가 있음
class B implements A {
@Override
public void abc() {
System.out.println("메서드 내용 : 자식클래스로 객체를 생성한 후 A 인터페이스 안에 정의된 메서드 호출");
}
}
public class OOPvsFP_01 {
public static void main(String[] args) {
// #1. 객체지향 프로그래밍 문법(OOP에서 메서드를 생성)
// 클래스 속에 있는 모든 메서드를 호출하기 위해서는 객체를 생성해야 함
A a1 = new B();
a1.abc();
// #2. 객체 지향 프로그래밍 문법 -> 익명이너클래스 사용 방법
// 자식 클래스를 컴파일러에게 만들어 달라고 한 후 객체를 사용
A a2 = new A() {
@Override
public void abc() {
System.out.println("메서드 내용 : 익명 이너클래스 사용하여 호출");
}
};
a2.abc();
//#3. 함수적 프로그래밍 문법(람다식) : 익명 이너클래스를 축약
A a3 = () -> {System.out.println("메서드 내용 : 람다식으로 정의된 메서드 호출");};
a3.abc();
}
}
📋 람다식의 활용
🎈람다식의 3가지 활용
- 익명 이너 클래스 내 구현 메서드의 약식(람다식) 표현 (함수적 인터페이스만 가능)
- 함수형 인터페이스는 하나의 추상 메서드만을 가지는 인터페이스를 말합니다. 예를 들어, Runnable, Comparator, ActionListener 등이 함수형 인터페이스의 예입니다.
- 람다식은 함수형 인터페이스의 추상 메서드를 간결하게 구현하는 방법입니다. 람다식은 매개변수 목록, 화살표(>), 그리고 메서드 구현부로 이루어집니다.
- 메서드 참조 (인스턴스 메서드 참조 Type1, 정적 메서드 참조, 인스턴스 메서드 참조 Type2)
① 인스턴스 메서드 참조 Type 1 → 이미 정의된 인스턴스 메서드 참조
인스턴스 메서드 참조를 사용하면 기존 클래스의 메서드를 함수형 인터페이스에 매우 간결하게 매핑할 수 있으며, 가독성을 향상시킬 수 있습니다. 여기서 인스턴스는 메서드를 호출할 객체의 인스턴스를 의미하고, 메서드는 호출할 메서드의 이름을 의미합니다.
인스턴스 메서드 참조는 주로 함수형 인터페이스의 추상 메서드와 동일한 시그니처(매개변수 타입 및 반환 타입)를 가지는 인스턴스 메서드를 참조할 때 사용됩니다. 리턴타입과 매개변수가 동일해야한다는 의미입니다.
인스턴스 메서드 참조 문법 → 인터페이스 이름 인터페이스 변수 = 인스턴스(클래스 객체이름 ) :: 인스턴스 메서드 이름
② 정적 메서드 참조 Type 1 → 이미 정의된 정적 메서드 참조
정적 메서드는 객체 생성을 하지 않아도 되기 때문에 앞서 본 인스턴스 메서드 참조와 문법이 조금 다릅니다.
정적 메서드 참조 문법 → 인터페이스 이름 인터페이스 변수 = 클래스 이름 :: 정적 메서드 이름
③ 인스턴스 메서드 참조 Type 2 → 첫번째 매개변수로 전달된 객체 메서드를 참조하는 경우
정적 메서드 참조 문법 → 인터페이스 이름 인터페이스 변수 = 클래스 이름 :: 인스턴스 메서드 이름 - 생성자 참조
① 배열 생성자 참조 (Array Constructor Reference) : 배열 생성자 참조는 배열을 생성하는 데 사용되는 생성자를 참조하는 것입니다
② 클래스 생성자 참조 (Class Constructor Reference): 클래스 생성자 참조는 클래스의 생성자를 참조하는 것입니다. 클래스의 new 생성자를 참조하는 경우 → interface 메서드의 리턴타입 = 클래스 객체
배열의 new 생성자를 참조하는 경우 → interface 메서드의 리턴타입 = 배열 객체 타입[]::new
'[ BACKEND] > JAVA_컬렉션 프레임워크' 카테고리의 다른 글
[JAVA] 컬렉션 프레임워크 Map<E> , Stack<E> (0) | 2023.07.11 |
---|---|
[JAVA] 컬렉션 프레임워크 Set<E> (0) | 2023.07.09 |
[JAVA] 컬렉션 프레임워크 List<E> (1) | 2023.07.05 |
[JAVA] 제네릭 클래스 vs 제네릭 메서드의 차이 (0) | 2023.07.04 |
[JAVA] GENERIC (제네릭) 이란 ? (1) | 2023.07.03 |