Chapter 1: Lambda Expression 개요
- Functional Interface
- Anonymous Class
- Lambda Expression 사용
Chapter 2: Lambda Expression 사용
- Lambda Expression 형식
- 메소드 참조
Chapter 3: Lambda Expression 활용
Chapter 1: Lambda Expression 개요
Anonymous Method 형식으로 동작하는 Lambda Expression은 파라미터를 받아 짧은 코드 블록으로 수행하고 필요에 따라 값을 반환하는 표현 방법을 말한다.
Functional Interface -> 람다식, 메서드 참조로 사용 가능.
- 하나의 abstract method를 가지고 있는 Interface(SAM(Single Abstract Method) Interface)
- @FunctionalInterface annotation이 적용될 수 있는 Target Interface.
- Java에서 함수를 객체처럼 다룰 수 있도록 함.
- 변수에 할당(Assignment) 할 수 있다.
- 다른 함수의 인자(Argument)로 전달받는다.
- 다른 함수의 결과로서 return 가능.
@FunctionalInterface
public interface BinaryOp {
public int apply(int right, int left);
}
Anonymous Class (익명 클래스) -> 일회용
- Functional Interface에 대한 Anonymous Class를 생성해 사용.
- Anynymous Method는 단 한번만 사용 가능하고, 하나의 객체만을 생성할 수 있는 일회용 클래스.
@FunctionalInterface
public interface BinaryOp {
public int apply(int right, int left);
}
BinaryOp binder = new BinaryOp() {
public int apply(int right, int left) {
return right + left;
}
};
// 아래와 같이 사용 가능
int result = binder.apply(3, 5); // 8
Lambda Expression -> 함수를 객체처럼 다룰 수 있다.
- 파라미터를 받아 짧은 코드 블록을 수행하고, 필요에 따라 값을 return하는 표현 방법.
- 메소드와 유사하지만 이름을 갖지 않으며, 표현식에 사용할 수 있는 모든 곳에서 구현 가능.
@FunctionalInterface
public interface BinaryOp {
public int apply(int right, int left);
}
BinaryOp binder = (i, j) -> i + j;
@FunctionalInterface
public interface RunSomething {
void doIt();
static void printName(){
System.out.println("catsbi");
}
default void printAge(){
System.out.println("33");
}
}
// 아래와 같이 사용 가능.
RunSomething run = () -> System.out.println("Hello, World!");
RunSomething run2 = () -> {
System.out.print("Hello,");
System.out.println(" World!");
};
Chapter 2: Lambda Expression 사용
Lambda Expression 형식
- 파라미터 목록과 표현 식의 블록으로 선언.
- 파라미터 타입은 생략 가능.
- 파라미터가 하나인 경우, 괄호 생략 가능.
- 수행문이 하나이고, 지역 변수 선언 또는 return이 없는 경우 {} 생략 가능.
- 괄호가 생략된 수행문에 return 키워드가 포함되어 있을 경우 return 생략 가능.
메소드 참조
- 기존 메서드를 참조하여 함수형 interface의 구현을 간결하게 제공하는 방법.
- Lambda Expression을 단순하게 만들어주는 구문.
- Lambda Expression이 단 하나의 메소드만을 호출하는 경우에 사용.
- 불필요한 Parameter를 제거하고 :: 기호를 사용하여 표현
public interface BinaryOp {
public int apply(int i, int j);
}
class Calc {
public static int add(int i, int j) { // static
return i + j;
}
public int mult(int i, int j) {
return i * j;
}
}
class Test {
public static void main(String[] args) {
BinaryOp adder = Calc::add; // Calc 클래스의 정적 메서드 add를 참조함.
// Calc 클래스의 새로운 instance 생성 후 이것의 mult 메서드를 참조함(static이 아니라서 객체 생성 해야함)
BinaryOp multer = new Calc()::mult;
System.out.println(adder.apply(1, 2)); // 3
System.out.println(multer.apply(2, 3)); // 6
}
}
Chapter 3: Lambda Expression 활용
아래의 BinaryOp는 apply 그 자체가 된다. (FunctionalInterface: Interface 안에 추상 메소드 하나만 있는 것.)
@FunctionalInterface
interface BinaryOp {
public int apply(int i, int j);
}
" BinaryOp b " -> BinaryOp b를 객체화하는 4가지 방법
1. 클래스 구현: Interface를 구현하는 Class 만들기.
class Adder implements BinaryOp {
public int apply(int i, int j) {
return i + j;
}
}
2. Anonymous Class (익명 클래스): @FunctionalInterface는 함수 그 자체라서 가능하다.
class Test {
public static void main(String[] args) { // 2번
BinaryOp b = new BinaryOp() {
public int apply(int i, int j) {
return i+j;
}
};
b.apply(1,2);
}
}
3. Lambda Expression 사용: 메소드 이름, parameter 타입, return 타입 생략 가능
class Test {
public static void main(String[] args) { // 3번
BinaryOp b = (int x, int y) -> {return x+y;};
b.apply(1,2);
}
}
4. 메소드 참조 사용
class Something { // 완전히 쓸데없는 것임.
public static int doSomething(int i, int j) {
// apply와 시그니처가 같음.
// 그럼 binaryOp자리에 Something::doSomething 이렇게 가능함.
// 그럼 Something의 doSomethig. 이런 뜻이됨.
System.out.println(i+j);
return 10;
}
}
class Test {
public static void main(String[] args) {
BinaryOp b = Something::doSomething;
b.apply(1,2);
}
}
2024.09.01 - [Java/연습 문제] - [Java 연습 문제] 학생 관리 시스템 *
[Java 연습 문제] 학생 관리 시스템 *
student pakageStudent.java더보기package student;public class CollegeBoy extends Student { private String doubleMajor; public CollegeBoy(int studentNo, String name, String cellphone) { super(studentNo, name, cellphone); } public CollegeBoy(int studentNo,
lightningtech.tistory.com
출처: https://github.com/gikpreet/class-programming_with_java
GitHub - gikpreet/class-programming_with_java
Contribute to gikpreet/class-programming_with_java development by creating an account on GitHub.
github.com
'Java' 카테고리의 다른 글
[Java] 14. Collections Framework (0) | 2024.09.02 |
---|---|
[Java] 13. Anotation(어노테이션) (0) | 2024.09.02 |
[Java] 11. Generics(제네릭) (0) | 2024.08.31 |
[Java] Singleton 패턴 (0) | 2024.08.31 |
[Java] 10. Java에서의 상속 (0) | 2024.08.30 |