[SEB BE]Section 1. 람다 - 함수형 인터페이스

박두팔이·2023년 1월 6일
0

자바

목록 보기
18/26

람다식은 이름없는 익명객체다.

원래 메서드는 클래스 안에서 정의되어야 한다. 메서드는 독립적일 수 없기 때문이다. 다른 클래스의 메서드를 호출해야할 경우 클래스 객체를 먼저 생성한 뒤 그 객체를 통해 메서드를 호출해야 한다.

우리는 메서드와 동일시 여겼지만 따지고 보면 람다식은 객체다. 이름없는 익명객체이다.

람다식은 익명클래스를 통해 생성할 수 있다.
익명 클래스란? 객체의 선언과 생성을 동시에 하여 오직 하나의 객체를 생성하고 단 한번만 사용되는 일회용 클래스이다.

익명클래스 : 1(하나의객체만 생성해서) / 1(한번만 사용하는) / 1(일회용 클래스이다.)

만약 람다식이 객체라고 한다면 우리는 아래와 같이 객체에 접근할 참조변수가 필요하다.

public class LamdaExample1 {
    public static void main(String[] args) {

	💡 람다식 Object obj = (num1, num2) -> num1 + num2; 로 축약 가능
			Object obj = new Object() { // obj참조변수 생성
				int sum(int num1, int num2) {
                	return num1 + num1;
            	}
			};
       obj.sum(1, 2);
	}
}

함수형 인터페이스가 나온 배경

그러나 이처럼 익명객체를 생성하여 참조변수 obj에 담아준다 하더라도 Object클래스에는 sum 메서드가 없기 때문에 sum()를 사용할 수 없다. 이같은 문제를 해결하기 위해 함수형 인터페이스를 사용한다. 즉, 부모타입의 클래스안에 람다식에서 사용할 메서드가 없기때문에 메서드를 사용할 수 없다.그렇기때문에 람다식에서 메서드를 사용하기 위해선 함수형 인터페이스안에 추상메서드를 선언한 뒤 람다식을 1:1로 매칭해주어야 한다.

함수형 인터페이스 사용하기

public class LamdaExample1 {
    public static void main(String[] args) {
		ExampleFunction exampleFunction = (num1, num2)->num1+num2;
		System.out.println(exampleFunction.sum(10,15));
    }
}

@FunctionalInterface 👉🏻 컴파일러에게 인터페이스가 바르게 정의되었는지 확인하도록 요청함
interface ExampleFunction { //ExampleFunction인터페이스 생성
	int sum(int num1, int num2); //추상메서드 선언
}

// 출력값
25

매개변수와 리턴값이 없는 람다식

MyFunctionalInterface라는 인터페이스를 생성 후 매개변수와 리턴값이 없는 추상메서드를 선언해주었다.

@FunctionalInterface
interface MyFunctionalInterface {
    void accept();
}

public class MyFunctionalInterfaceExample {
	public static void main(String[] args) throws Exception {
    
		MyFunctionalInterface example =()-> System.out.println("accept() 호출");
		example.accept();
	}
}

// 출력값
accept() 호출

매개변수가 있는 람다식

// 함수형 인터페이스생성
interface MyFunctionalInterface{
	void accept(int x); //매개변수 x가 있는 추상메서드
}

public class MyFunctionalInterfaceExample {
	public static void main(String[] args) throws Exception {
		
        💡 매개변수가 있는 람다식
        MyFunctionalInterface example2; 
      	// MyFunctionalInterface타입의 example2필드선언
        
        💡 람다식의 실행문이 2개 이상인 경우 {}중괄호로 묶는다.
        example2 = (x) -> { 
        	int result = x * 5; 
            System.out.println(result);
        };
        example2.accept(2);
        
        💡 출력문에서 바로 계산하는 경우, 실행문이 1개일 때 {} 없음
        example2 = (x) -> System.out.println(x*5);
        example2.accept(2);

리턴값이 있는 람다식

@FunctionalInterface
public interface MyFunctionalInterface {
    int accept(int x, int y);
}

public class MyFunctionalInterfaceExample {
    public static void main(String[] args) throws Exception {

        MyFunctionalInterface example;

        example = (x, y) -> {
            int result = x + y;
            return result;
        };
        
        int result1 = example.accept(2, 5);
        System.out.println(result1);
        

        example = (x, y) -> { return x + y; };
        int result2 = example.accept(2, 5);
        System.out.println(result2);
       

	      example = (x, y) ->  x + y;
				//return문만 있을 경우, 중괄호 {}와 return문 생략가능
        int result3 = example.accept(2, 5);
        System.out.println(result3);
       

        example = (x, y) -> sum(x, y);
				//return문만 있을 경우, 중괄호 {}와 return문 생략가능
        int result4 = example.accept(2, 5);
        System.out.println(result4);
 
    }

    public static int sum(int x, int y){
        return x + y;
    }
}

//출력값
7
7
7
7
profile
기억을 위한 기록 :>

0개의 댓글