🏃♂️ 들어가기 앞서..
본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕
*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.
람다식을 알아보기 전에
함수형 언어란 무엇인지 짚고 넘어가자.
우리가 현재 보고있는 이 자바는 알다시피 대표적인 OOP(객체지향언어) 중 하나이다.
하지만 JDK 1.8 버전부터 이 함수형 언어의 기능을 추가시키게 되었다.
함수형 언어는 객체지향언어와 같이 비절차형 언어인데
간단하게 말하자면 " 함수 " 자체가 하나의 객체가 되어 사용되는 것이다.
동일한 입력값을 넣었을 때 항상 동일한 리턴값을 반환하고
무엇보다도 외부의 영향을 받지 않는다.
용어는 낯설 수 있겠으나
BigData 분야가 관심받기 시작하면서 함수형 언어가 필요했고
대표적인 언어로는 " Scala " 가 있으며
다들 많이 알고있는 Python 과 JavaScript도 Java와 같이 함수형 언어의 개념을 가지고 있다.
Lambda Expression
)" 함수 (메서드) "를 간단한 식(Expression) 으로 표현하는 방법
- 메서드의 이름과 반환값(return)이 생략된다는 점에서 " 익명 함수 (annonymous function) "이라고도 불린다.
기존의 메서드를 만들 땐,
모두 이름을 붙여주면서 블럭으로 닫아주고.. return과 매개변수 타입도 정해주고...
지켜야 할 다양한 규칙들을 지키면서
인스턴스 내에서 메서드를 선언했어야 했다.
반면 람다식을 사용할 경우,
이름과 타입 지정 등의 과정을 생략할 수 있기 때문에
간결하면서도 간편하고 이해하기 쉽다는 장점이 있다.
심지어,
식(expression)임에도 불구하고
변수처럼 사용할 수가 있는데
메서드의 매개변수로 전달되는 것도 가능함과 동시에
메서드의 결과로 반환 될 수도 있다.
위에서 간결하고 간편하다고 언급했다시피
만드는 방법은 간단하다.
- 메서드의 이름과 반환타입을 제거 ( " 매개변수 타입 "을 추론할 수 있을 때 )
- 선언부와 몸통
{}
사이에 [->
] 를 추가
- 끝에 "
;
(세미콜론) " 삭제int max(int a, int b) { return a > b ? a : b ; } // 람다식으로 변환 (a, b) -> a > b ? a : b int sumArr(int[] arr) { int sum = 0; for ( int i : arr ) { sum += i ; } reutrn sum ; } (int[] arr) -> { int sum = 0; for ( int i : arr ) { sum += i ; } reutrn sum ; }
추가적으로
만약 " 매개변수가 하나일 때 "는
선언부의 괄호()
도 생략할 수 있고int square(int x) { return x * x; } x -> x * x // 단, 매개변수가 없을 땐 "생략할 수 없다 " int roll() { return (int)(Math.random() * 6) ; } () -> (int)(Math.random() * 6)
" 구현부 내 문장이 한 줄일 때 "는
중괄호 생략 (블록 해제)도 가능하다.void printProductName(String prouct, int i) { System.out.println(prouct+" "+i) ; } (product, i) -> System.out.println(prouct+" "+i)
대부분 위 방식대로 간단하게 작성할 수 있는데
" 중괄호 생략 부분 "의 경우
가끔 구현부 내 문장이 한 줄이지만 return문인 경우가 있다.
이 때는 중괄호 생략이 불가능하다.
여기까지 람다식을 작성하는 방법을 알아보았다.
처음에 " 람다식은 변수처럼 사용할 수 있다 "라고 언급했었다.
그러기 위해서는 만든 람다식을 참조변수를 만들어 대입한 다음, 사용하면 된다.
그런데 여기서 잠깐
Java에서는 본래 참조변수 앞에 클래스 타입을 지정해주어야한다.
하지만 위에서도 볼 수 있듯
저 람다식의 참조변수에는 어떤 타입을 지정해주어야 하는가...
참조 변수 사용법을 알아보기 앞서
이 Java의 람다식은 무엇인가를 알고가야한다.
맨위에서는 람다식을 " 익명 함수 (annonymous function) "라고 부를 수 있다고 했지만
엄밀히 따지자면
" 익명 객체 "라고 해야한다. ( 이전 게시물 - 「 객체 지향 프로그래밍Ⅱ : 익명 클래스 」 참고 )
람다식이 바로
선언과 생성을 동시에 하는
" 이름이 없는 일회용 클래스 "
즉, 익명 객체 인 것이다.
(a, b) -> a > b ? a : b
▼▼▼익명 객체 구현▼▼▼
/*
예시일뿐
Object로 만들고 참조변수 타입도 Object로 하면 에러 발생한다.
*/
new Object() {
int max(int a, int b) {
return a > b ? a : b ;
}
}
▼▼▼참조변수 대입 → 실패▼▼▼
Object obj = new Object() {
int max(int a, int b) {
return a > b ? a : b ;
}
};
위와 같이 new를 통해 익명 객체를 선언 및 생성하고 참조변수에도 동일하게 그 클래스 타입을 지정해줘야 하지만
예시처럼 Object
같이 이미 존재하는 상위 클래스나 다른 클래스에는
해당 이름의 메서드를 가지고 있지 않기 때문에
사용할 수가 없다.
"""
그럼 인터페이스를 활용해서
추상 메서드를 사용하면 되는 것 아닌가?!!
"""
정답엔 거의 근접했지만 보통의 일반적인 인터페이스를 통한 방법으론 불가능하다.
이 때, 활용해야 하는 것은
인터페이스 중에서도 " 함수형 인터페이스(Functional Interface) "이다.
※ 람다식 참조 변수 사용 방법 - "함수형 인터페이스" : 다음 게시물 참고