본문 바로가기

컴퓨터/JAVA

자바 고급 스터디 1. 스트림, 람다 (stream, lamda)

반응형

자바 고급 스터디 목록
공부 시간 : 2021/03/09 02:00 ~ 03:40 / 2021/03/10 12:00 ~ 12:30 / 2021/04/07 05:30 ~ 05:55

1주차. Stream, lamda에 대해서 아는대로 설명해보세요.

스트림과 람다는 자바8에서 새롭게 생긴 기술 중 하나이다.

주제는 아는대로 설명하시오.. 이지만 이미 알고 있는 기본적인 사용 방법은 생략하고 고오급 내용이라 생각되는 부분만 정리해보려고 한다.

stream의 작동순서

list에 "aaa" , "aa"가 있을때

list.stream()
        .filter(str->{
        System.out.println("filter() 작동");
        return str.contains("a");
        })
        .map(str->{
        System.out.println("map() 작동");
        return str.toUpperCase();
        })

작동결과를 예상해보자.

작동 결과는 아래와 같다.

    ilter()작동
        map()작동
        ilter()작동
        map()작동

그렇다면 list에 "aaa" , "bbb"는 어떻게 작동될까?

(case A) :
list.stream()
    .filter(str → str.contain("a"))    
    .map(str → str.toUpperCase()
)

(case B) :
list.stream()
    .map(str → str.toUpperCase())
    .filter(str → str.contain("a")
)

결과는 아래와 같다.

case A는 "aaa"가 먼저 필터를 거친후 map 을 통해 "AAA"로 바뀌게 된다.

그 후 "bbb"가 필터를 거치고 종료된다.

case B는 "aaa"가 map을 거친 후 "AAA" 로 바뀌게 된 후 filter를 거친 후 "AAA"가 남게된다.

그 후 "bbb"가 map을 거친 후 "BBB" filter에서 걸러지게 된다.

따라서 filter를 해야할 일이 있다면 filter를 가장 먼저 하는 것이 효율적이다.

filter와 비슷하게 앞쪽에 위치 시킴으로써 효율을 높힐 수 있는 다른 메서드는 skip, distinct가 있다.

정리 하자면 스트림의 한 요소는 filter 등에서 false가 반환되기 전, 혹은 모든 메서드체인을 거칠때 까지 실행 된 후 다음 요소로 넘어가는 것을 알 수 있다.

병렬 stream

stream 은 parallel() 함수를 사용 함 으로써 아주 쉽게 병렬처리를 할 수 있다. 병렬처리를 올바른 조건에서 잘 처리한다면 cpu의 코어수에 비례하는 성능을 높힐 수 있다. 하지만 모든 상황에서
병렬처리를 할 수 있는 것이 아니다. 상당히 많은 예시들을 봤지만 아직은 상황들이 잘 이해가 가지 않는다. 지금으로썬 내가 할 수 있는 성능최적화를 모두 시도해본 후에도 부족하다면 그때 병렬처리에 대해서 더 공부해본
후, 시도하는 것이 현명하다고 생각된다.

람다

자바 8이전에는 Sort를 하기위해 Collections.sort( words , new Compator {.... }

과 같이 익명클래스를 사용하였다. 익명클래스는 코드의 길이가 너무 길어 사용하기 불편한데, 람다는 짧은 길이로 아주 간단하게 똑같은 기능을 할 수 있다.

하지만 람다식에서 this는 람다식 밖의 인스턴스를 가르키기에 자신을 가르켜야 할 상황이 생긴다면 익명클래스를 사용해야한다.

람다를 사용함으로써 얻을 수 있는 이점은 이전보다 코드를 간결하게 만들수 있다는 점이다. 람다보다 더 간결한 코드를 작성 할 수 있는 방법이 있는데 바로 메서드 참조이다. 하지만 메서드 참조는 코드의 의미를
파악하는데 직관적이지 않은 것 같아 개인적으로 사용하는 것을 좋아하지는 않는다. 또한 람다의 모든 것을 메서드 참조로 표현하지는 못한 다는 것도 메서드참조를 사용하지 않는 하나의 이유이다. (클린코드에서 본
형식맞추기에 대한 것을 깨는것 같아서.)

또한 보통은 람다에서 변수의 타입을 생략하기 때문에 변수명을 적절히 잘 짓는 것이 중요하다. 너무 과하게 줄여쓰다보면 코드의 가독성 많이 줄어들 것 이다. str, a, b, s 등과 같은 변수명 보다는 목적에 맞고
의미있는 변수명을 사용하는 습관을 가지도록 노력하자!

람다식내에서 continue, break, return, try cath 사용을 기대하는 경우는 별로 없겠지만, 이는 불가능하니 참고하자.

참고자료 : Java 스트림 Stream(2) 고급 , 이펙티브자바 7장 스트림과 람다

반응형