개발/JAVA

JAVA - 람다 (기본)

잇(IT) 2023. 5. 18. 12:40
728x90

1. 람다식

 

- 람다식은 간단히 말해서 메서드를 하나의 '식'으로 표현한 것이다. 람다식은 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해준다.

- 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로, 람다식을 '익명 함수'이라고도 한다.

int[] arry = new int[5];
Arrays.setAll(arr, (i) -> (int)(Math.random()*5+1);
(i) -> (int)(Math.random()*5+1);
// 메서드로 표현하면
int method() {
	return (int)(Math.random()*5+1;
    }
반환타입 메서드이름 (매개변수 선언) {
	문장들
}

// 람다식으로 변형

(매개변수 선언) -> {
	문장들
}



int max(int am int b) {
	return a > b ? a: b;
 }
 
 // 람다식으로 변형
 
 (int a, int b) -> {
 	return a > b ? a : b;

- 반환값이 있는 경우 return을 생략하고 식으로 표현 할 수 있다.

- 람다식에 선언된 매개변수의 타입은 추론이 가능한 경우는 생략 할 수 있다.


1. 함수형 인터페이스

 

- 람다식을 다루기 위한 인터페이스를 '함수형 인터페이스'라고 부르기로 했다.

- 단, 함수형 인터페이스에는 오직 하나의 추상 메서드만 정의되어 있어야 한다는 제약이 있다. 그래야 람다식과 인터페이스의 메서드가 1:1로 연결될 수 있기 때문이다. 반면에 static메서드와 default메서드의 개수에는 제약이 없다.

interface MyFunction {
	public abstract int max(int a, int b);
}

// 인터페이스를 구현한 익명 클래스의 객체는 다음과 같이 생성할 수 있다.

MyFunction f = new MyFunction() {
		public int max(int a, int b) {
	return a > b ? a : b;
	}
};
int big = f.max(5, 3); // 익명 객체의 메서드를 호출

// 람다식으로 표현하면 아래와 같다.

MyFunction f = (int a, int b) -> a > b ? a : b; // 익명 객체를 람다식으로 대체
int big = f.max(5, 3); // 익명 객체의 메서드를 호출

- 람다식 사용하기 이전 인터페이스 활용

interface MyInterface {
    public void print();
}

class MyClass1 implements MyInterface {
    @Override
    public void print() {
        System.out.println("MyClass1");
    }
}

class MyClass2 implements MyInterface {
    @Override
    public void print() {
        System.out.println("MyClass2");
    }
}

public class Test01 {
    public static void test(MyInterface mi) {
        mi.print();
    }

    public static MyInterface test2() {
        MyInterface mi = new MyInterface() {
            @Override
            public void print() {
                System.out.println("test2()메서드에서 반환된 MyInterface");
            }
        };
        return mi;
    }

    public static void main(String[] args) {

        MyClass1 mc1 = new MyClass1();
        MyClass2 mc2 = new MyClass2();
        mc1.print();
        mc2.print();

        MyInterface mi = new MyInterface() {
            @Override
            public void print() {
                System.out.println("익명 클래스로 구현");
            }
        };
        test(mc1);
        test(mi);

        mi.print();

        (new MyInterface() {
            @Override
            public void print() {
                System.out.println("선언, 생성, 호출을 한번에 처리");
            }
        }).print();

        MyInterface mi2 = test2();
        mi2.print();
    }
}

- 함수형 인터페이스를 구현한 후 객체를 생성하는 방법은 다음의 세가지가 있다.

1. 명령형 스타일 : new를 통해 객체 생성

2. 람다식 : () -> {}

3. 메서드 참조 : 클래스명::메서드명(static 메서드로 선언했을 때) / 참조변수명::메서드명(인스턴스 메서드로 선언했을 때)

 

 

728x90

'개발 > JAVA' 카테고리의 다른 글

JAVA - Optional  (0) 2023.06.05
JAVA - Reflection API  (0) 2023.06.01
JAVA - 컬렉션 프레임 워크 (Collections Framework), List, Set, Map ... (1) 그 중 List  (0) 2023.05.18
JAVA - Reflection  (1) 2023.05.14
JAVA - Class 클래스  (0) 2023.05.14