람다식(Lambda expression)
- 기존의 객체 지향 프로그램 체계 안에서 함수형 프로그래밍을 가능하게 하는 기법
함수(function)
- 기능 또는 동작을 정의한 일련의 명령 모음
void abc() {
//기능 및 동작
}
메서드(method)
-클래스 또는 인터페이스 내에 정의된 함수
class A {
void abc() {
//기능 및 동작
}
}
- 자바에서 메서드를 사용하려면 항상 클래스 객체를 먼저 생성한 후 생성한 객체로 메서드를 호출해야함
-자바는 객체 지향 언어이므로 모든 함수는 클래스 또는 인터페이스 내부에만 존재
- 객체 지향형 프로그래밍에서 함수는 항상 클래스 내부에 메서드로 존재해야 하고, 메서드를 사용하기 위해서는 클래스의 객체를 먼저 생성한 후에 메서드를 호출해야함
step 1. 메서드 정의 및 구현
class A {
void abc() {
//메서드(함수) 정의 및 구현
}
}
step 2. 객체 생성
A a = new A();
step 3. 객체 내부 메서드 호출
a.abc();
함수형 인터페이스
- 단 하나의 추상 메서드만을 포함하는 인터페이스
- 함수형 인터페으스이 호출 및 기능을 구현하는 방법을 새롭게 정의한 문법이 람다식
1. 객체 지향 구조 내에서 람다식 적용 과정
- 함수형 인터페이스를 상속받아 추상 메서드를 구현한 객체를 생성한 후 메서드를 호출하는 과정
- 인터페이스 A는 추상 메서드인 abc()를 포함
interface A {
void abc();
}
case 1)
- 인터페이스 A를 구현한 클래스 B를 생성
- 클래스의 생성자 (B())를 이용해 객체를 생성한 후 객체의 참조 변수로 abc() 메서드 호출
class B implements A {
public void abc() {
//메서드 내용
}
}
a.abc();
case 2)
- 추가 클래스 정의 없이 익명 이너 클래스를 사용해 객체 생성 후 이 객체로 메서드 호출
A a = new A() {
void abc() {
//메서드 내용
}
};
a.abc();
case 3)
- 람다식 활용
- 익명 이너 클래스의 메서드 정의 부분만 가져와 메서드 정의하고 호출
A a () -> {
//메서드 내용
};
a.abc();
- 람다식은 익명 이너 클래스의 축약된 형태
package OOP;
interface A {
void abc();
}
class B implements A {
//override
public void abc() {
System.out.println("메서드 내용 1");
}
}
class OOP {
public static void main(String[] args) {
//1.객체 지향 프로그래밍 문법 1
A a1 = new B();
a1.abc(); //메서드 내용
//2.객체 지향 프로그래밍 문법 2 (익명 이너 클래스 사용)
A a2 = new A() {
//override
public void abc() {
System.out.println("메서드 내용2");
}
};
a2.abc(); //메서드 내용
//3.함수형 프로그래밍 문법 (람다식)
A a3 = () -> {System.out.println("메서드 내용 3");};
a3.abc();
}
}
2. 람다식의 기본 문법 및 약식 표현
1) 람다식의 기본 문법
- 입력매개변수에 따른 메서드의 기능만을 정의
- '(소괄호) -> {중괄호}'
리턴 타입 메서드명(입력매개변수) {
//메서드 내용
}
(입력매개변수) -> {
//메서드 내용
}
2) 람다식의 약식 표현
- 중괄호 안의 실행문이 1개 일때 중괄호 생략 가능
A a1 = () -> {System.out.println("테스트");
A a2 = () -> System.out.println("테스트");
- 입력매개변수의 자료형 생략 가능
<-함수형 인터페이스에 포함된 추상 메서드의 입력매개변수 타입으로 쉽게 유추 가능
- 입력매개변수가 1개일때는 소괄호도 생략 가능
-> 소괄호를 생략할때는 매개변수의 자료형을 반드시 생략 해야함
A a1 = (int a) -> {...}
A a2 = (a) -> {...} //자료형 생략
A a3 = a-> {...}; // 소괄호 생략
A a4 = int a -> {...}; //불가능
- 메서드가 return문 하나만으로 이뤄져 있을 때는 return문도 생략 가능
-> return을 생략할 때 중괄호를 반드시 함께 생략
A a1 = (int a, int b) -> {return a+b;};
A a2 = (int a, int b) -> a+b;
A a3 = (int a, int b) -> {a+b}; //불가능
'Java > 문법' 카테고리의 다른 글
18 - 2 장 람다식의 활용 (0) | 2023.06.24 |
---|---|
17 - 6장 Queue<E> 컬렉션 인터페이스 (0) | 2023.06.19 |
17 - 5장 Stack<E> 컬렉션 클래스 (0) | 2023.06.19 |
17 - 4 장 Map<K,V> 컬렉션 인터페이스 (0) | 2023.06.18 |
17 - 3장 Set<E> 컬렉션 인터페이스 (2) (2) | 2023.06.18 |