티스토리 뷰

Server

[Java] Lambda와 Stream(1)

니용 2019. 10. 15. 18:49
반응형

람다기호

 

아래 소스는 Java8을 기준으로 작성되었습니다.  혹시 오타가 있거나 잘못 이해한 부분이 있으면 댓글로 적어주세요 :)


프로그래밍하면서 정말 많이 사용하는 것 중 하나가 for문이다.

for문은 원시적으로 아래와 같이 사용해왔다.

 

정말 눈에 익은 코드

 

이렇게 반복문을 사용하는 것을 Java8, JavaScript에서 제공하는 기본 라이브러리로 변경할 수 있다.

Stream이란 클래스 안에 내장되어 있다.

 

시작은 간단하다. list.stream()으로 시작만 하면 된다.

그리고 끝도 간단하다. list.stream(). ... .collect(Collectors.toList()); 로 닫으면 끝난다.

 

이렇게 보아선 도무지 감이 오지 않아서 예시를 한번 보면서 얘기하는 것이 좋을 것 같다.

위에서 제공한 것을 활용해보려고 한다.

 

스트림을 사용해서 코드를 한 줄로 줄여보았다.

여기서 사용한 것은 filterforEach이다.

filter는 조건에 맞는 값을 정제해주는 역할을 한다.

forEach의 반환값은 void이기 때문에 따로 지역변수를 만들지 않았다.

 

근데 왜 이걸 람다(Lambda)식이라고 할까? 분명 이 글만 보았을 때는 스트림을 알려주는 것이 아닐까? 싶지만

사실 이 안에 파라미터가 숨겨져 있는데..

위에서 보면 'abbo'라고 화살표 모양(->) 이전에 적어놓은 변수가 존재한다.

람다식은 -> 으로 사용하는 것이기 때문에 알게 모르게 람다를 사용한 것이다.

람다표현식(함수형 인터페이스)는 크게 3가지로 나뉜다.

1. 파라미터(abbo)

2. 화살표(->)

3. 바디("니용".equals(abbo.getNickname())

 

위에 세가지만 알면 끝이고, abbo는 list에서 가진 AbboVO 1개를 람다표현식 안에서 쓰고 싶은 변수명으로 사용한 것이다.

 


람다식을 사용하면 장/단점이 몇 가지 있다.

1. 객체 지향 언어보다 함수 지향 언어이다.

즉, 명령어를 수행하는 대신 함수를 호출하는 것이다. 이는 달리 말해 명령 프로그램은 상태에 따라 값이 변경되는 부작용이 생길 수 있는 반면, 함수형 프로그램은 실행되는 프로그램에 따라 다른 결과값을 표현하기 좋다. 

 

2. 함수를 간략시키면서 명확하게 표현할 수 있다.

기존의 메소드 또는 라이브러리 호출 방식은 내부의 로직을 확인하기 위해 일일히 소스를 타고 들어가서 봐야하는 번거로움이 있는 반면, 람다표현식은 내부에 이미 구현이 되어 있어 금방 확인이 가능하다.

하지만, 람다표현식에서 제공하는 함수를 알지 못한다면 이해하기 어렵다는 단점이 있다.

 

3. 코드 길이가 줄어든다.

위에서 보다 시피 코드 길이가 압도적으로 줄어든다. 이는 자원 낭비를 방지하는데 효과적이다.

단, 가독성은 떨어질 수 있어서 주석이 필요한 부분이 생길 수 있고, 재사용이 불가능하다.

 

4. 람다표현식의 내부는 절차적이다.

이는 기존의 메소드의 방식과 같이 top-down 방식으로 함수가 실행이 되기 떄문에, 먼저 작성된 소스의 영향을 받는다.

어떻게 보면 문장에 '주어-동사' 가 들어가있는 경우와 비슷해서 눈에 익으면 문장을 읽는 것과 비슷한 느낌을 준다.

 

어느 정도 의미 파악은 된 것 같으니, 구현은 어떻게 진행하면 좋을지 다음 글에서 살펴보자!

 

반응형

'Server' 카테고리의 다른 글

[Java] ORM과 JPA, 그리고 Hibernate  (0) 2019.11.28
[Java] NPE와 Optional Class  (1) 2019.10.26
[Java] Lambda와 Stream(2)  (0) 2019.10.15
REST의 정체는?  (1) 2019.10.15
[Spring] Annotation과 MVC  (1) 2019.09.17
[Spring] Spring Framework & Spring Boot  (1) 2019.09.16
댓글
공지사항