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라는 버튼이 존재하지 않고 형변환이 불가하다.
//이럴 때 필요한 것이 함수형 인터페이스다.
}
}
- 자바의 특성상 모든 메서드는 객체 안에 존재해야 한다.
'Java > 객체지향' 카테고리의 다른 글
[객체지향][람다식/Lambda Expression] - java.util.function패키지 (0) | 2022.03.09 |
---|---|
[객체지향][람다식/Lambda Expression] - 함수형 인터페이스 (0) | 2022.03.09 |
[객체지향][쓰레드/thread] - 쓰레드 동기화의 단점을 보완하기 위한 wait()와 notify() (0) | 2022.03.04 |
[객체지향][쓰레드/thread] - 쓰레드의 동기화(synchronization) (0) | 2022.03.04 |
[객체지향][쓰레드/thread] - join(), yield() (0) | 2022.03.03 |