* 영상 출처: https://www.youtube.com/watch?v=IHBa85wjQ4c&t=215s

엄정 친절하고 좋은 책이고 강사님도 좋으시니 많이 참고 해주시길 바란다 ㅎㅎ

 

 

람다식 이란?


자바에서 함수적 프로그래밍 지원 기법,코드의 "간결화"  "병렬처리"에 강함 (Collection API 성능 효과적 개선 (Stream))


 ①.람다식 이해를 위한 기본 용어의 정리

1. Return type + 함수 이름 + 매개변수 () + 중괄호 { } 로 정의 하는 것을 일반적으로 "함수" 라고 한다.

함수형 인터페이스를 유심히 보아야 한다. 람다 문법에서 중요한 요소이다.

※ C Program에서는 함수가 단독으로 존재 할 수 있다. 그러나 객체지향 프로그램에서는

함수는 독립적으로 존재 할 수 없다. 모든 함수들은 Class안에서만 존재 할 수 있다.

클래스안에 있는 함수를 "메서드"라고 한다.

 

클래스 안에 있는 메서드

다시 한번 강조-> 객체지향 프로그램에서는 함수가 독립적으로 존재 할 수 없다.

TIP
Java는 객체지향프로그램으로서 모든 함수는 클래스/인터페이스 내부에만 존재 가능.
(클래스 내부의 함수 = 메서드)


2. Class 외부에 올 수 있는 것 3가지

Package, Import, Outer class

3.Class 내부에 올 수 있는 것 4가지

Field(필드)

Method(메서드)

Constructor(생성자)

inner class(이너 클래스)



4.함수형 인터페이스(funtional interface) 내부에 단 1개의 추상메서드만 존재하는 인터페이스


 

 

 

② 본래의미의 함수적 프로그래밍과 객체지향형의 개념적 비교.

본래 의미의 함수적 프로그래밍(함수를 써서 프로그래밍)에서 함수 사용 (자주 사용하는 기능 구현)

 

함수적 프로그래밍에서는 함수를 독립적으로 '정의','구현' 한 뒤.

 

바로 함수를 abc() 호출 할 수 있다.

 

그러면 자주 사용하는 기능들을 void abc() {

} 여기 중괄호 안에다 넣고, 그 기능이 필요 할 떄 마다, Step #2 처럼 바로 꺼내 쓰면 되는 거였다.

그러나, 객체 지향형 프로그래밍에서의 메서드(함수=기능) 사용 할 시에는

 

독립적으로 정의 할 수 없기에 클래스 내부 존재 한다. 이런 클래스 내부에 존재 하는

함수를 우리는 'Method' 라고 한다.

그다음 객체를 생성한다.

 

a라고 하는 참조변수는 Stack에 있을 것 이고,

Heap Memory에 실제 객체 abc() 만들어 질 텐데,

참조변수 a라고 하는 것은 A가 가르키고 있는 abc를 실행 해라,

 

그래서 실제로 참조 변수를 통해서만,메서드를 실행 할 수 있다.


이렇게 함수적 프로그래밍에서의 함수 사용과 객체지향형 프로그래밍에서의 메서드 사용을 나누어 봤을 때,

본래의 함수적 프로그래밍 같은 경우에는 함수를 정의하고 바로 호출 할 수 있지만,

객체 지향형 프로그램에서는 메서드를 실행하기 위해서는 반드시 객체를 먼저 생성하고

 

객체의 참조변수를 활용 해서, 메서드를 실행 시켜야 한다.

 

 


③ 객체지향형과 자바의 함수적 프로그래밍의 문법적 비교.

객체지향형 프로그래밍에서 메서드를 활용 하는 기능을 보자.


Case 1.

람다식으로 가기 위해서는 ①'Interface'부터 시작해야 한다.

 

Interface는 객체를 만들지 못하니까, B라고 하는 자식 클래스를 하나 만들고, A라고 하는

Interface를 implements(상속) 했다. 그럼 이 abc()라고 하는 것은 사용 할 떄, 일단은 정의

를 해야 한다. 미완성 이니까, 사용하기 위해서 자식클래스 class B를 상속 했다.

그렇게 2번째에서 상속을 했으니, 사용해야할 의무가 생긴다. 그럼 거기에다가

메서드 내용(기능),(성능) 기술 하고, 사용 할 상태가 됐을 때, b의 객체를 만들어서

 

그것을 A를 담던 B를 담던, 참초변수를 만들고,

 

그 참조변수를 통해 abc를 호출 할 수 있을 것 이다.

인터페이스 안에 정의되어져 있는 미완성 메서드의 이름이 실제로 구현되는데 까지의 단계를 나타내는 것.


Case 2.

 

A라고 하는 인터페이스에서 A a = new A()로 가는 건 인터페이스는 객체를 못만드니까,

익명이너클래스가 들어가게 되면 메서드에 중괄호가 { } 붙게 되고. Case 1의 2번쨰를

여기서 구현 하겠다 라는 것이다. 컴파일러야 JVM아 너는 A라는 인터페이스로 객체를 못 만들지만

내가 A a= new A()라는 생성자를 호출 할 테니 뱃속에 있는 abc 메서드를 가지고

interface 뱃속에 있는 미완성된 메서드를 완성한 클래스를 외부적으로 너가 만든 다음에 그 클래스를 가지고 나한테 리턴해줘 그걸 내가 a에 담을게 라는 것.


람다는 익명이너클래스의 약식 표현 이다.

 

위의 퀴즈를 외우기 바란다. 모든 인터페이스의 구현 메서드는 람다식으로 변환

불가능 하며,

함수적 인터페이스의 메서드만 람다식 표현 가능 하다.

즉, 정리하자면 람다식은 문법적으로

첫번째, 함수적 인터페이스를 익명이너클래스로

표현한 것에서 반복적 사항 삭제한 이후에, 람다식 기호와 함께 표현한 것이다.

기능을 정의하는 문법을 제공하는 것이 람다식 이다.

정의된 기능을 제공하는 것이 람다식이 아니다.

화면에서 프린트 한 거라고 쳐보면 확정된 기능을 만들어서 제공하는 게 람다식이 아니라, 비어져 있는 상태에서 기능을 추가해서 사용할 수 있도록 만들어주는 게 람다식이다.

비어져있는 기능의 역할을 하는 것이 이 인터페이스 뱃속에 있는 미완성된 abstract

 

메서드에다가 람다식으로 기능을 부여해서 사용을 가능하게 끔 만들어 주는 것.

즉, 함수를 정의 하는 문법이지, 함수가 만들어진 것들을 사용하는 문법이 아니다.

 

 

람다식에서 표현 할 때, 추상메서드에 있었던 것들에서 더 추가 가능

 

Q. 공통적으로 들어가는 부분을 생략한다고 했는데 입력매게변수도

공통적으로 들어가는 거 아닌가요?

 

메서드의 내용만 어차피 새로 들어갈 거고. 입력매개변수도 공통적인 사항이잖아요

근데 왜 생략 안됐나요?

 

int까지만 고정이고 a라는 변수는 구현 할 때, b d f 든 뭐라고 쓰든지 상관없다.

 

(26:14)

람다식의 약식표현

(27:11)

 

 

+ Recent posts