Java_람다식

Minki CHO·2022년 11월 13일
0

CodeStates

목록 보기
13/43

람다식

//기존 메서드 표현 방식
void sayhello(){
	System.out.println("HELLO");
}

//람다식으로 표현
() -> System.out.println("HELLO");

람다식에서는 기본적으로 반환 타입과 이름 생략 가능
ex.
void, sayhello 생략
따라서 람다함수를 익명 함수 anonymous function이라 부르기도 함

ex1.

int sum(int num1, int num2){
	return num1+num2;
}

람다식으로 변경(반환 타입, 이름 생략)

(int num1, int num2) -> {
	return num1+num2;
}

ex2.

void example1(){
	Systme.out.printnl(5)
}

람다식으로 변경(반환 타입, 이름 생략)

() -> {return 5;}

ex3.

int example2(){
	return 10;
}

람다식으로 변경(반환 타입, 이름 생략)

() -> {return 10;}

ex4.

void example3(String str){
	System.out.println(str);
}

람다식으로 변경(반환 타입, 이름 생략)

(String str) -> {System.out.println(str);}

특정 조건이 충족시 더 축약 가능

//기존 방식
int sum(int num1, int num2){
	return num1+num2;
}

//람다식 축약1
(int num1, int num2)->{
	num1+num2
}

//람다식 축약2
(int num1, int num2) -> num1+num2

//람다식 축약3 : 매개변수 타입을 함수형 인터페이스를 통해 유추할 수 있는 경우 매개변수 타입 생략 가능
(num1, num2) -> num1+num2

자바에서 함수는 반드시 클래스 안에 정의되어야 하기 때문에 메서드가 독립적으로 있을 수 없고,
반드시 클래스 객체를 먼저 생성한 후 생성한 객체로 메서드를 호출해야 함

//람다식
(num1, num2) -> num1+num2

//람다식을 객체로 표현
new Object(){
	int sum(int num1, int num2){
    	return num1+num2;
    }
}
//

:sum 메서드는 이름 없는 익명 객체임

? 익명객체?
:익명 객체는 익명 클래스를 통해 만들 수 있음

? 익명 클래스?
:객체의 선언과 생성을 동시에 하여
오직 하나의 객체를 생성하고
단 한번만 사용되는 일회용 클래스

이 람다식이 객체라고 한다면, 이 객체에 접근하고 상용하기 위한 참조 변수가 필요
그런데 기존에 객체를 생성할 때 만들었던 Object 클래스에는 sum이라는 메서드가 없기 때문에
Object 타입의 참조 변수에 담는다고 하더라도 sum 메서드를 사용할 수 없음

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

			// 람다식 Object obj = (num1, num2) -> num1 + num2; 로 대체 가능
			Object obj = new Object() {
					int sum(int num1, int num2) {
                    	return num1 + num1;
                    }
            };

        	obj.sum(1, 2);
	}
}

출력 결과
java: cannot find symbol
  symbol:   method sum(int,int)
  location: variable obj of type java.lang.Object

:이러한 문제를 해결하기 위해 사용하는 자바의 문법 요소 = 자바의 함수형 인터페이스(Functional Interface)

? 함수형 인터페이스?
:한개의 추상 메서드만 선언된 인터페이스

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

@FunctionalInterface // 컴파일러가 인터페이스가 바르게 정의되었는지 확인하도록 합니다. 
interface ExampleFunction {
		int sum(int num1, int num2);
}

// 출력값
25

:위의 예제에서 함수형 인터페이스인 ExampleFunction에 추상메서드 sum()이 정의되어져 있습니다. 이 함수형 인터페이스는 람다식을 참조할 참조변수를 선언할 때, 타입으로 사용하기 위해 필요합니다.

함수형 인터페이스 타입으로 선언된 참조변수 exampleFunction에 람다식이 할당되었으며, 이제 exampleFunction을 통해 sum() 메서드를 호출할 수 있습니다.

이처럼, 함수형 인터페이스를 사용하면 참조변수의 타입으로 함수형 인터페이스를 사용하여 우리가 원하는 메서드에 접근이 가능합니다.
<노이해중>

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

함수형 인터페이스

@FunctionalInterface
public interface MyFunctionalInterface {
    void accept();
}

람다식 표현

MyFunctionalInterface example = () -> { ... };

// example.accept();
@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() 호출

매개변수가 있는 람다식

함수형 인터페이스

@FunctionalInterface
public interface MyFunctionalInterface {
    void accept(int x);
}
public class MyFunctionalInterfaceExample {

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

        MyFunctionalInterface example;
        example = (x) -> {
            int result = x * 5;
            System.out.println(result);
        };
        example.accept(2);

        example = (x) -> System.out.println(x * 5);
        example.accept(2);
    }
}

// 출력값
10
10

:추상 메서드 accept()가 매개변수를 한개만 가짐

리턴값이 있는 람다식

함수형 인터페이스

@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
Developer

0개의 댓글