[인프런 워밍업 클럽] BE 0기 3일차 과제
자바의 람다식은 왜 등장했을까?
프로그래밍 패러다임은 시간이 지남에 따라 계속 발전해오고 있다. 최근의 프로그래밍 패러다임은 명령형 프로그래밍과 선언형 프로그래밍으로 구분되고 있다. 절차지향과 객체지향 같은 명령형 프로그래밍은 개발하는 소프트웨어의 크기가 커짐에 따라, 스파게티 코드를 유지보수하기 매우 힘들단 것을 깨닫게 되었고, 이를 해결하기 위해 함수형 프로그래밍이라는 프로그래밍 패러다임에 관심을 갖게 되었다. 함수형 프로그래밍은 거의 모든 것을 순수 함수로 나누어 문제를 해결하는 방식으로, 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다.
이와 같은 흐름에 따라, 자바 진영도 jdk8부터 람다식, Stream API, Functinal Interface와 같은 함수형 프로그래밍을 지원하기 시작했다. 람다식이 도입됨에 따라 함수형 프로그래밍의 장점을 가져왔으며 그 장점인 코드의 효율과 가독성의 향상을 가져왔다.
람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?
익명 클래스(Anonymous Class)
프로그램에서 일시적으로 한번만 사용되고 버려지는 객체다.
프로그램 내에서 일시적으로 사용되는 객체 처리에 사용한다.
확장성을 활용하는 것이 유지보수에서 더 불리할 경우에 사용한다.
예시)
// Animal이라는 부모 클래스
class Animal {
public String bark() {
return "동물이 우는 소리";
}
}
public class Main {
public static void main(String[] args) {
// 객체 생성과 동시에 클래스 정의
Animal dog = new Animal() {
@Override
public String bark() {
return "개가 짖는 소리";
}
}; // 익명 클래스의 끝에 세미콜론을 반드시 붙여 주어야 한다.
dog.bark();
}
}
람다(Lambda)
람다식은 메소드를 하나의 식으로 표현한 것이다. 익명 클래스와 비슷한 개념이지만 코드는 훨씬 간결하다.
표현식은 다음과 같다.
예시)
List<String> words = new ArrayList<>();
words.add("apple");
words.add("banana");
words.add("cherry");
// words를 sort하는 class method
Collections.sort(words, new Comparator<String>() {
// 익명 클래스 정의
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
for (String word : words) {
System.out.println(word);
}
위와 같은 익명클래스를 람다식으로 변환)
Collections.sort(words, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
람다식을 메서드 레퍼런스로 변환)
Collections.sort(words, comparingInt(String::length));
람다(Lambda) 사용 시 주의할 점
1. 람다는 이름이 없고 문서화도 불가능하므로, 코드 자체로 동작이 명확히 설명되지 않거나 코드 줄 수가 많아지면 쓰지 말아야 한다.
코드 줄 수가 많다는 기준 - 한 줄이 가장 좋고 길어야 세 줄!
2. 람다가 익명 클래스보다 훨씬 간결한 것은 맞지만, 대체 불가능한 경우가 있다.
람다는 함수형 인터페이스에서만 쓰이므로, 추상 클래스의 인스턴스를 만들 때는 익명 클래스를 써야 한다.
람다는 자기자신을 참조할 수 없다.(this X) 함수 객체가 자신을 참조해야 한다면 익명 클래스를 써야 한다.
람다를 직렬화하는 일은 극히 삼가야 한다.
1. 익명 내부 클래스는 새로운 클래스를 생성하지만, 람다는 새로운 메서드를 생성하여 포함한다.
람다는 static 이든, 객체 사용을 위한 non-static 이든, 메서드로 생성된다.
이에 반해 익명 내부 클래스는 새로운 클래스파일이 생성된다.
2. 익명 내부 클래스의 this : 새로 생성된 클래스, 람다의 this : 람다식을 포함하는 클래스
위와 완벽하게 일맥상통하는 말이다.
새로운 클래스를 만들기 때문에, 익명 내부클래스에서의 this 는 해당 클래스를 가리킨다.
새로운 클래스를 만드는 게 아니고 그냥 메서드를 만드는 람다는, 메서드 즉 람다가 있는 클래스를 가리킨다.
출처)
이펙티브자바,
https://mangkyu.tistory.com/111,
https://cobinding.tistory.com/213
댓글을 작성해보세요.