Java/객체지향

[객체지향][람다식/Lambda Expression] - 람다식

얄루몬 2022. 3. 5. 23:23

https://youtu.be/3wnmgM4qK30?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


[람다식에 앞서서 함수형 언어에 관해서..]

자바는 OOP(객체지향)언어로 JDK 1.8부터 함수형 언어 기능을 도입했다.

[람다식(Lambda Expression)]

  • 함수(메서드)를 간단한  식(expression)으로 표현하는 방법이다.
int max(int a, int b){
	return a>b ? a:b;
}

(a, b) -> a>b ? a:b
  • 람다식은 익명 함수(이름이 없는 함수, anonymous function)라고 한다.
  • 함수와 메서드의 차이는?
    • 함수와 메서드는 근본적으로 동일하지만 함수는 일반적 용어로 사용하고 메서드는 객체지향개념 용어이다.
    • 함수는 클래스에 독립적이고, 메서드는 클래스에 종속적이다.
    • 자바의 경우엔 클래스 밖에 함수가 있을 수 없기에 모두 메서드라고 한다!!
  같은 점 다른 점
함수 - 근본적으로는 동일한 용어다. - 함수가 좀 더 일반적인 용어로 사용된다.
- 함수는 클래스에 독립적이다.
메서드 - 메서드는 객체지향개념의 용어이다.
- 메서드는 클래스에 종속적이다.
- 자바는 클래스 밖에서 함수가 사용되지 못하기에 함수를 모드 메서드라고 부른다!!

[람다식 작성하기]

  • 메서드의 이름과 반환타입을 제거하고 '->'를 블록 앞에 추가한다.

  • 반환값이 있는 경우, 식만 이나 값만 적고 return문 생략이 가능하다.

  • 매개 변수의 타입이 추론 가능하면 생략 가능하다(대부분의 경우 생략이 가능하다.)

[람다식 작성하기 - 주의사항]

  • 매개변수가 하나인 경우, 괄호() 생략이 가능하다(타입이 없을 때만 가능하다!!)

  • 블록 안에 문장이 하나뿐 일때, 괄호 생략 가능하다.(끝에 ';' 안 붙인다!)

  • 단 하나뿐인 문장이 return문이라면 괄호( ) 생략 불가하다.(그리중요하지 않음)

[람다식의 예]

[1]

int max(int a, int b) {
	return a>b ? a:b
}

(a,b) -> a>b ? a:b

[2]

int printVar(String name, int i ){
	System.out.println(name+"="+i)
}

(name, i) -> System.out.println(name + "=" + i)

[3]

int sqaure(int x) {
	return x * x;
}

x -> x*x

[4]

int roll(){
	return (int)(Math.random()*6)
}

() -> (int)(Math.random()*6)

[람다식은 익명 함수? 익명 객체!]

  • 자바에서는 함수가 있을 수 없는 구조이기 때문에(클래스 밖에서 함수가 존재하지 못한다.) 익명 함수가 아닌 익명 객체이다. 
(a,b) -> a>b ? a:b

new Object() {
	int max(int a, int b){
    	    return a>b ? a:b;
    }
}
//위의 코드는 객체의 선언과 생성을 동시에 한 코드로 익명 클래스, 익명 객체라고 한다.
  • 람다식(익명 객체)를 다루기 위한 참조변수가 필요하다. 참조변수의 타입은 무엇일까??
    • 다음 강의에서 진행

[실습]

package javajungsuk;

public class Java14_0 {

	public static void main(String[] args) {
//		Object obj = (a,b) -> a>b ? a:b; //람다식 익명 객체
		Object obj = new Object() {
			int max(int a, int b) {
				return a>b? a:b;
			}
		};
		
		int value = obj.max(3,5);
		//Object 타입의 obj에는 max라는 버튼이 존재하지 않고 형변환이 불가하다.
		//이럴 때 필요한 것이 함수형 인터페이스다.
	
	}

}
  • 자바의 특성상 모든 메서드는 객체 안에 존재해야 한다.