주니어 기초 코딩공부

JA14장 람다식

jju_developer 2022. 12. 1. 19:14
728x90

안녕하세요 JAVA 기초 공부 중인 jju_developer입니다~

 

오늘은 자바의 람다식의 기본 개념에 대해 알아보도록 하겠습니다~ :)

 

JAVA에서의 람다식이란 무엇일까요?

 

람다식은 익명 객체 또는 함수를 생성하기 위한 식으로 객체 지향 언어 보다는 함수 지향 언어에 가깝습니다.

자바에서 람다식을 수용한 이유는 자바 코드가 매우 간결해지고, 컬렉션의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있기 때문입니다.

 

람다식은 익명 구현 객체를 간략히 표현한 구현 객체입니다.

 

<원래의 익명 구현객체>

Runnable runnable = new Runnable() { // 익명 구현 객체
public void run() { ... }
};

 

<람다식 표현>

Runnable runnable = () -> { ... }; // 람다식, (매개변수) -> {실행코드}

람다식의 메소드는 딱 하나여야 한다.

 

 


=> <익명 구현객체 표현>

Runnable runnable = new Runnable(매개변수 int num) { // 익명 구현 객체
public void run() { .

            System.outprint(num);.. }
};

 

=> <람다식 표현>

Runnable runnable = (num) -> {.

              System.outprint(num);

      ..};

Runnable.run(3);

 

람다식에서 매개변수에는 int 나 이런 타입을 쓰지 않는다!!!

 

※하나의 매개변수만 있을 경우에는 괄호( ) 생략 가능

※하나의 실행문만 있다면 중괄호 { } 생략 가능

 

=> <람다식 생략 된 표현>

Runnable runnable =num ->  System.outprint(num);

//Runnable.run(3);

 

이렇게 괄호와 중괄호를 생략하여 한줄로 표현 가능하다.

 

다만 매개변수가 없다면, 괄호 ( ) 생략 불가

1. (a) -> { System.out.println(a); }
1. a -> System.out.println(a)
1. () -> System.out.println()

 

 리턴값이 있는 경우, return 문 사용

 중괄호 { }에 return 문만 있을 경우, 중괄호 생략 가능
2. (x,y) -> { return x+y; }
2. (x,y) -> x+y

 


예제

 

@FunctionalInterface
public interface MyFunctionalInterface {
	// 상수
	// abstract method()
	public void method();

	// default method()
	// static method()

}

 

public class MyFunctionalInterfaceExample { 
	public static void main(String[] args) {
		//인터페이스 변수 지역변수선언
		MyFunctionalInterface fi; 
		
		//인터 페이스의 익명 구현 객체 생성
		fi = new MyFunctionalInterface() {
			
			@Override
			public void method() {
				String str = "method call 1";
				System.out.println(str);
			}
		};
		
		//실행하려면 객체.메소드를 해야 불러올 수 있다.
		fi.method();
	
	}
}

해당 코드를 이제 람다식으로 변경해보겠습니다.,

 

		// 인터페이스 = 람다식
		fi = () -> {
			String str = "method call 1";
			System.out.println(str);
		};
		fi.method();
		
		
		//더 간결하게 표현한 람다식
		fi = () -> System.out.println( "method call 1");
		fi.method();

 

두개의 람다식 표현은 같은 것이며, 코드가 하나기 때문에 중괄호를 생략했으며,

매개변수가 없기 때문에 ()는 생략하지 않았습니다.

 


예제 2

 

public interface MyFunctionalInterface {
    
	public void method(int x);
}
	public static void main(String[] args) {

		// 인터페이스 지역변수
		MyFunctionalInterface fi;

		// 익명 구현 객체
		fi = new MyFunctionalInterface() {

			@Override
			public void method(int x) {
				int result = x * 5;
				System.out.println(result);
			}
		};
		fi.method(5);// 5*5= 25출력
		// 람다식
		fi = (x) -> {
			int result = x * 5;
			System.out.println(result);
		};
		fi.method(10); //10*5 =50

 


예제3

 

public interface MyFunctionalInterface {

	public int method(int x, int y);
}
public class MyFunctionalInterfaceExample {
	public static void main(String[] args) {

		MyFunctionalInterface fi;

		fi = (x, y) -> {
			int result = x + y;
			return result;
		};
		System.out.println(fi.method(2, 5));	//7
	  }
    }

 


 

 

✔함수적 인터페이스란 무엇일까요?

(@FunctionalInterface)

 하나의 추상 메소드만 선언된 인터페이스가 타겟 타입
 @FunctionalInterface 어노테이션
• 하나의 추상 메소드만을 가지는지 컴파일러에게  체크해달라고 하는 것 입니다.
• 두 개 이상의 추상 메소드가 선언되어 있으면 컴파일 오류를 발생시킨다.
• 선택사항이다. 이 어노테이션이 없더라도 하나의 추상 메소드만 있다면 모두 함수적 인터페이스이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90