반응형
강의 출처
진도표 3일차와 연결됩니다
우리는 JdbcTemplate을 사용하는 과정에서 익명 클래스와 람다식이라는 자바 문법을 사용했습니다. 익명 클래스는 자바의 초창기부터 있던 기능이고, 람다식은 자바 8에서 등장한 기능입니다. 다음 키워드를 사용해 몇 가지 블로그 글을 찾아보세요! 아래 질문을 생각하며 공부해보면 좋습니다! 😊
[키워드]
익명 클래스 / 람다 / 함수형 프로그래밍 / @FunctionalInterface / 스트림 API / 메소드 레퍼런스
[질문]
자바의 람다식은 왜 등장했을까?람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?
키워드
익명 클래스
- 클래스 선언과 객체의 생성을 동시에 하기 때문에 단 한 번만 사용 가능 → 일시적으로 한 번만 사용되고 버려지는 객체 → 재사용 불가
- 이름이 없기 때문에 생성자도 가질 필요가 없다.
- 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있음.
- 클래스 파일명 : '외부 클래스명$숫자.class' 형식
- 오버라이딩한 메서드 사용만 가능하고 새로 정의한 메서드는 외부에서 사용이 불가능하다.
- 사용 이유
- 프로그램 내에서 일시적으로(단발성으로) 한 번만 사용되어야 하는 객체일 경우
- 재사용성이 없고, 확장성을 활용하는 것이 유지보수에서 더 불리할 때
- 선언 위치
- 클래스 필드로 이동
- 지역 변수로서 이용
- 메서드 아규먼트로 이용
반응형
람다
- 메서드를 하나의 식(expression)으로 표현
- 함수를 간략하면서도 명확한 식으로 표현할 수 있게 함
- 메서드의 이름과 반환값이 없어짐 → 익명 함수(anonymous function)라고도 함
- 메서드를 변수처럼 다루는 것이 가능함
- 스트림 API의 매개변수로 전달 가능
- 람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주
- 형식
// 기존 메서드
반환타입 메서드이름 (매개변수 선언) {
문장들
}
// 람다식
(매개변수 선언) -> {
문장들
}
- 반환값이 있는 메서드의 경우 return문 대신 '식(expression)'으로 대신할 수 있음.
- 식의 연산결과가 자동적으로 반환값이 됨. 문장이 아닌 '식'이므로 끝에 ';' 붙이지 않음.
- 매개변수는 타입 추론으로인해 타입 생략이 가능하다. 단, 두 매개변수 중 어느 하나의 타입만 생략하는 것은 허용되지 않음
- 매개변수가 하나만 있을 경우 괄호 생략 가능. 단, 매개변수의 타입이 있으면 생략 불가능함
- 괄호{} 안의 문장이 하나일 때는 괄호{}를 생략할 수 있음.
- 단점
- 람다를 사용하면서 만든 무명함수는 재사용 불가
- 디버깅 어려움
- 람다를 남발하면 비슷한 함수가 중복 생성되어 코드가 지저분해짐
- 재귀로 만들 경우에 부적합
함수형 프로그래밍 / @FunctionalInterface
- 람다식을 다루기 위한 인터페이스
- 함수형 인터페이스에는 오직 하나의 추상 메서드가 정의되어야 함 → 람다식과 인터페이스의 메서드가 1:!
- @FunctionalInterface를 붙이면 컴파일러가 함수형 인터페이스를 올바르게 정의했는지 체크해줌
- @Overrie 어노테이션과 비슷한 역할을 한다.
스트림(Streame) API
- 스트림이란 데이터를 운반하는데 사용되는 연결 통로
- 스트림은 데이터를 추상화하여 다룸.
- 스트림 API의 특징
- 스프림은 외부 반복을 통해 작업하는 컬렉션과 달리 반복을 통해 작업 수행
- 스트림은 최소한 재사용이 가능한 컬렉션과 달리 단 한 번만 사용할 수 있음
- 스트림은 원본 데이터를 변경하지 않음
- 스트림의 연산은 필터 -> 맵(filter-map) 기반의 API를 사용하여 지연(lazy) 연산을 통해 성능 최적화
- 스트림은 paralleSTream() 메서드를 통해 손쉬운병렬 처리 지원
반응형
메서드 레퍼런스
- 람다 표현식을 더 간단하게 표현하는 방법
- 람다식과 함께 사용될 수 있다
- ClassName::MethodName() 형식으로 입력함.
- 분류
- Static 메서드 레퍼런스
- Instance 메서드 레퍼런스
- Constructor 메서드 레퍼런스
자바의 람다식은 왜 등장했을까?
이 부분은 OT날 강사님께 짧막한 '자바의 역사' 강의에서 언뜻 들었던 게 생각이 난다. 자바 8에서 엄청난 기능들이 추가되었고, 그 전에 자바는 영 힘을 못 쓰는 언어라 했다. Node.js 등 새로운 프레임워크나 언어가 유행하면서 자바는 서서히 침체되었다고 한다. 그러면서 함수형 프로그래밍이 덩달아 유행했는데 이러한 변화 때문에 자바에 함수형 프로그래밍을 지원하기 위한 람다식이 추가된 것으로 생각된다..!
아래) 모던 자바 인 액션 참고
프로그래밍 언어 생태계에 변화가 생겼다. 바로 빅데이터. 멀티코어 컴퓨터나 컴퓨팅 클러스터를 이용해서 빅데이틀 효과적으로 처리할 필요성이 커졌다. 즉, 병렬 프로세싱을 활용해야 하는 데 자바 8 이전의 언어를 사용하기엔 미숙했다. 즉, 변화하는 환경에 발맞춰 다양한 기능을 가진 자바 8을 출시한 것이다.
람다식과 익명 클래스의 관계?
- 람다 표현식은 익명 함수의 일종이다. 이름은 없만 파라미터 리스트, 바디, 반환 형식을 가지며 예외을 던질 수 있다.
- 차이점
- 익명 내부 클래스는 새로운 클래스를 생성하지만, 람다는 새로운 메서드를 새성하여 포함한다.
- 익명 내부 클래스의 this: 새로 생성된 클래스, 람다의 this : 람다식을 포함하는 클래스
람다식 문법
- 기본
(타입 매개변수, ...) -> {실행문;... }
- 타입 매개변수 : 오른쪽 블록을 실행하기 위해 필요한 값 제공
- -> : 매개변수를 이용해서 블록 실행
- a 메서드 출력
a -> (System.out.println(a));
- 하나의 매개변수가 존재할 때는 소괄호 제거 가능 / 중괄호 안에 실행문이 하나만 있다면 중괄호 제거 가능
a -> System.out.println(a);
- 중괄호 안에 return문만 있을 경우 중괄호와 return문을 제거하고 사용하는 것이 일반적임
(x,y) -> x + y;
와 오늘은 진짜 엄청 피곤해서 별로 집중을 못했다... 직장인이라 체력 관리를 더 잘해야 더 스터디를 활용할 수 있을 거 같다...ㅠ
Reference
https://mangkyu.tistory.com/113
https://gimmesome.tistory.com/209
https://steady-coding.tistory.com/304
반응형