개발공부/자바

[자바] 람다식을 쓰긴 썼는데 뭐하는 건지 모르겠어서 쓰는 정리글

장아장 2022. 11. 14. 11:14

스프링 스터디 프로젝트를 할 때 람다식이라는 개념이 처음 이야기되었다. 

 

"람다식을 쓰면 코드가 더 간결하고 쓰기 수월해진다. "

이런 말을 하면서, Comparator를 쓰거나 할 때 람다식을 이용했다. 

그런데, 람다식이 무슨 말이고 왜 좋은지는 하나도 생각해본 적이 없다. 그래서 한번 공부할 겸 정리해보려고 한다. 

 

람다식, 람다함수란 익명 함수로써, 함수의 단순화를 위해 사용한다. 

익명 함수 => 말 그대로 이름이 없다. 정해진 것이 없어 파라미터로, 변수로 마음대로 사용 가능하다는 이야기들을 접했다. 

 

기본적인 구조는 (연산에 사용할 변수) -> {연산 내용 ;}의 방식으로 사용되며, 단일 실행문이면서 return문이 없을 때에는 중괄호를 없앨 수 있다. 

 

익명함수라는 말을 처음 들어보진 않았다. 자바스크립트에서 익명함수라는 기능이 있었다. 

let show = function() { console.log('Anonymous function'); };

이런 식으로 show라는 변수에 바로 function(=함수)를 두어 메서드의 결과를 받게 한다. 

 

코드를 보고있으면 문법만 다르지 말하고자 하는 바는 같다는 느낌이 든다.

 

void 숫자0이_있으면_예외처리(){
    assertThatThrownBy(()->playerException.checkException("012"))
            .isInstanceOf(IllegalArgumentException.class)
            .hasMessageContaining("입력은 1부터 9중 서로 다른 3개의 숫자여야 합니다.");

가장 흔하게 람다식을 쓸 때 = 예외작성할 때 😎

 

여기에서 람다식의 예시를 들자면, 연산에 사용할 변수는 없다. 연산은 playerException.checkException("012")이다. 

이렇게 두었을 때 연산의 결과가 나오고 여기에 추가적으로 원하는 바를 자연스럽게 붙일 수 있다. 

 

그냥 playerException.checkException("012")를 넣으면 되지 않는가?

되지 않는다....(이왜진?)

그냥 넣었을 때에는 결과를 가져와 확인을 한다. 즉, 이미 예외가 발생해 애플리케이션이 끝나버린 상황에서 메서드에서 에러가 발생하는지 캐치할 수 있냐고 물어보는 것이다. (마치 밥을 다 태워먹고 밥이 탈 것 같다고 말하는 나 같다!)

 

람다식으로 ()-> playerException.checkException("012")를 넣었을 때 테스트중에 처음부터 매 상황을 체크하고, 이 상태에서 예외가 발생할 경우 이를 캐치한다. 이 에러가 어떤 에러클래스인지, 어떤 메시지를 가지는지 확인 할 수 있다. 

 

다른 람다의 예시를 들어보자. 

(x, y) -> x < y ? x : y;

간단한 람다식이다. x, y를 입력변수로 받아, 연산자를 이용해 결과를 반환시키는 방식이다. 

private int getBiggerNumber(int x, int y){
    return x < y ? x : y ;
}

이런 메서드를 문장 하나로 줄일 수 있다. 

분명 메서드를 줄이고, 짧게 만드는 장점은 존재한다. 이를 이용해 조금 더 깔끔한 코드를 만들 수 있다. 

 

분명 장점도 분명하지만, 단점도 존재한다. 이전에 포스팅에도 몇 번 언급했지만, 아는 기술들을 전부 쓰려고 하는 것 보다 지금 상황에서 뭐가 더 좋은지를 생각해야한다. 

 

단점

  1. 람다식으로 만들어진 메서드는 일회용이다. 반복해서 사용해야 할 경우 하나의 메서드로 만들어 사용하는 게 더 깔끔한 코드를 만드는 방법이다. 
  2. 간단한 연산의 경우 람다를 통해 줄이는 것이 좋지만, 기능적으로 명시되며 보여줘야 할 부분은 사용할 경우 무슨 용도인지 흐려질 수 있다. 
  3. 정확한 에러 부분을 찾기 어렵다. 람다를 메서드로 나누었을 때에는, 어느 메서드에서 오류가 발생했는지 알 수 있다. 하지만, 람다는 그냥 '람다가 이상해' 라고 오류가 발생하는데, 이를 추적해 에러를 수정하기 어렵다. 

 

개인적인 느낌은, 하나의 기능을 구현함에 있어, 중간 연산자를 줄이는 용도로는 쓸만할 것 같다. 

하지만, 비즈니스 로직을 사용함에 있어 조심해야 하는 부분이 있다고 생각된다. 

'No Silver Bullet'

완벽하게 편한 길은 없다. 그저 길에서 뭐가 더 좋을지를 생각하고 판단하는 능력을 더 기르면서, 그 판단하에 사용할 수 있는 방법들을 더욱 공부해봐야 겠다.