-
[Java-21] 화살표 연산자 (->) 그리고 람다 원리Java 2020. 11. 27. 14:42
Java lambda expression
우리가 -> 를 처음보면 당황할수 밖에 없다. 기본 개념을 모르고 접근하면, 요 안에서 무슨일을 하는지 도저히 알 수가 없기 때문이다. 이 포스팅은 클래스, 인터페이스를 알고 있다는 전제하에 얘기를 한다. 만약에 클래스와 인터페이스에 대한 개념이 부족하다면, 꼭 그 부분을 보고 와야 한다.
1. 람다 이전의 자바
(함수형) Interface
interface는 말그대로 껍대기로만 생각을 하자, 기본적으로 interface를 사용하면, 보통은 그 안에다가 메소드 이름과 파타미터의 타입만 정의 한다. 말 그대로 interface의 역할만 하는 것이다.
물론 static과 default 키워드를 사용하면 Interface 안에서도 메소드 구현이 가능하지만, 그 부분까지 얘기하면 너무 삼천포로 빠진다.
여기서 interface에 정의된 printInt를 사용할 수 없다. 왜냐면 구현을 하지않고
추상 메소드만 정의 했기 때문이다.
추상메소드 사용하기
- class로 구현체 만들기
- 메소드 내에서 구현체 만들기 (내부 익명 클래스)
람다는 메소드 내에서 저런 내부익명 클래스를 통해서 만든 구현체의 단점을 보안할 수 있다. 예를들어서, 정말 간단한 한줄짜라 System.out.println(x) ; 를 구현하기 위해서 대충 6줄이 추가되고, 가독성도 떨어진다. 이래서 자바는 자바 8부터 람다를 받아들였다.
- 람다를 이용한 구현체 만들기
이렇게 한줄로 작성이 가능하다. 그럼 이런 생각을 할 수 있다.
어떻게 람다가 printInt()라는 메소드를 알고 구현한거야?
다른 메소드를 구현할 수 있지않나?
@FunctionalInterface 와 함수형 인터페이스
우리가 interface를 선얼 할 때,
다음과 같이 @FunctionalInterface 를 어노테이션에 붙히면 실질적으로 interface에는 추상 메소드 하나만 정의할 수 있다. 만약 2개를 정의하려 한다면,
다음과 같이 @FunctionalInterface에서 에러를 뱉는다.
@FunctionalInterface 를 제거하면?
이렇게 람다를 구현부에서 에러를 뱉는다.
이게 사실 함수형 인터페이스, 의 특징인데, 함수 자체를 입급 객체로 사용할 수 있다. 일급객체의 특징에는 여러가지가있는데, 메소드를 리턴한다던지 여러가지가 있다. 이 부분은 나중에 포스팅 하도록 하겠다.
메소드 하나 때문에 interface를 만들어야되?
그렇지 않다. 실제로 이렇게 구현하지 않고, 자바에서 기본적으로 지원하는 Interfece를 사용하면 문제없이 사용할 수 있다.
이렇게 여러가지 몇개가 있는데 이건 나중에 더 자세히 알아보도록 하자 : D
'Java' 카테고리의 다른 글
[Java-23] 자바 조건문, 반복문 (0) 2020.12.04 [Java-22] 자바13 스위치, java13 switch 연산 (0) 2020.11.27 [Java-20] 자바 연산자 우선순위 (0) 2020.11.27 [Java-19] 삼항 연산자 기본 (원리) ?: (0) 2020.11.27 [Java-18] 자바 대입 연산자 & 증감 연산자 (0) 2020.11.27