인프런 워밍업 클럽 3일차 과

인프런 워밍업 클럽 3일차 과

Q1- 람다식의 등장이유

Stream 연산들은 매개변수로 함수형 인터페이스(Functional Interface)를 받도록 되어있다. 그리고 람다식은 반환값으로 함수형 인터페이스를 반환하고 있다. 그렇기 때문에 우리는 Stream API를 정확히 이해하기 위해 람다식과 함수형 인터페이스에 대해 알고 있는것이 좋다.

 

익명함수(Anonymous Function)란 함수의 이름이 없는 함수로, 익명함수들은 모두 일급 객체이다. 일급 객체인 함수는 변수처럼 사용가능하며 매개 변수로 전달이 가능하는 등의 특징을 가지고 있다.
 
기존의 방식에서는 함수를 선언할 때 다음과 같이 선언하였다.
// 기존의 방식
반환티입 메소드명 (매개변수, ...) {
	실행문
}

// 예시
public String hello() {
    return "Hello World!";
}

하지만 람다 방식으로는 위와 같이 메소드 명이 불필요하며, 다음과 같이 괄호() 와 화살표-> 를 이용해 함수를 선언하게 된다.
// 람다 방식
(매개변수, ... ) -> { 실행문 ... }

// 예시
() -> "Hello World!";

이렇게 람다식이 등장하게 된 이유는 불필요한 코드를 줄이고, 가독성을 높이기 위함이다. 그렇기 때문에 함수형 인터페이스의 인스턴스를 생성하여 함수를 변수처럼 선언하는 람다식에서는 메소드의 이름이 불필요하다고 여겨져서 이를 사용하지 않는다. 대신 컴파일러가 문맥을 살펴 타입을 추론한다. 또한 람다식으로 선언된 함수는 1급 객체이기 때문에 Stream API의 매개변수로 전달이 가능해진다.   람다식(Lambda Expression) 의 특징 람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주된다. 람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없다. 람다식(Lambda Expression) 의 장점 코드를 간결하게 만들 수 있다. 식에 개발자의 의도가 명확히 드러나 가독성이 높아진다. 함수를 만드는 과정없이 한번에 처리할 수 있어 생산성이 높아진다. 병렬프로그래밍이 용이하다. 람다식(Lambda Expression) 의 단점 람다를 사용하면서 만든 무명함수는 재사용이 불가능하다. 디버깅이 어렵다. 람다를 남발하면 비슷한 함수가 중복 생성되어 코드가 지저분해질 수 있다. 재귀로 만들경우에 부적합하다. ☞ 람다라고 무조건 좋은건 아니다. 상황에 맞게 적절하게 사용하자:)

 

Q2 람다식과 익명 클래스의 관계

 

익명클래스가 필요한 상황

1. 프로그램 내에서 일시적으로(단발성으로) 한번만 사용되어야 하는 객체일 경우

-> UI 이벤트처리, 스레드 객체 등 (단발성 이벤트 처리)

2. 재사용성이 없고, 확장성을 활용하는 것이 유지보수에서 더 불리할 때

-> 비즈니스 로직이 정말 재각각이며, 재사용성이 전혀없어 매번 클래스를 생성해야하는 비용이 더 많을 때

정리하자면 클래스를 별도로 만들 필요없이 코드에서 익명객체를 생성/정의하여 단 한번의 쓰임을 다하고 소멸한다.

그래서 만일 어느 메소드에서 부모 클래스의 자원을 상속받아 재정의하여 사용할 자식 클래스가 한번만 사용되고 버려질 자료형이면, 굳이 상단에 클래스를 정의하기보다는, 지역 변수처럼 익명 클래스로 정의하고 스택이 끝나면 삭제되도록 하는 것이 유지보수면에서나 프로그램 메모리면에서나 이점을 얻을 수 있다.

 

다만 주의해야 할 점이 있다.

기존의 부모 클래스를 상속한 자식 클래스에서는 부모 클래스의 메서드를 재정의 할뿐만 아니라 새로운 메소드를 만들어 사용할수 도 있다는 점은 다들 알고 있을 것이다.

하지만 익명 클래스 방식으로 선언한다면 오버라이딩 한 메소드 사용만 가능하고, 새로 정의한 메소드는 외부에서 사용이 불가능 하다.

이런 익명클래스중

익명클래스 중에서 한 가지 메소드만 구현하는 경우, 람다식으로 변경할 수 있다.

  • 둘 다 함수적 프로그래밍을 구현하는 방식이지만 람다식는 앞서 말했듯이 익명 클래스의 단점을 보완하기 위해 등장했음. 람다식은 익명 클래스보다 간결하고, 가독성이 높으며, 함수적 프로그래밍 적용이 쉽고, 스코프 개념으로 감싸고 있는 변수를 직접 참조가 가능하며 마지막으로 직렬화도 가능함.

 

출처: https://itkjspo56.tistory.com/289 [로춘남의 IT이야기:티스토리]

댓글을 작성해보세요.