Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

쇼트서킷은 어떻게 작동하는 것일까? #39

Open
sure-why-not opened this issue Mar 21, 2022 · 2 comments
Open

쇼트서킷은 어떻게 작동하는 것일까? #39

sure-why-not opened this issue Mar 21, 2022 · 2 comments
Assignees
Labels
ch4 about chapter 4

Comments

@sure-why-not
Copy link

문제

전체 스트림을 처리하지 않아도 결과를 반환할 수 있는 서킷 방식은 실제로 어떻게 작동하는 것일까?

선정 배경

스트림의 결과에만 집중했지, 내부적으로 어떻게 작동되고 있는지에 대해 집중해보진 못했었다.
책에서 간략하게 쇼트서킷을 언급했는데, 이 부분에 대해 찾아보고 실습해본 내용을 공유해보면 좋을 것 같다는 생각이 들어서 선정했다.

관련 챕터

  • [4장] 스트림 소개
    • p.151
@sure-why-not sure-why-not added the ch4 about chapter 4 label Mar 21, 2022
@sure-why-not
Copy link
Author

sure-why-not commented Mar 24, 2022

쇼트서킷이란?

  • 쇼트 서킷이란, 논리연산자 AND, OR 을 나타내기 위해 부호 &&, || 을 사용하는 것을 의미한다.
  • &&, || 와 &, | 를 비교할 때, 둘은 최종적으로 같은 결과를 내지만 다른 과정을 거친다.
  • & , | : 연산자의 앞 조건식과 뒤 조건식을 둘 다 실행 시킨다.
  • && , || : 연산자의 앞 조건식의 결과에 따라 뒤 조건식의 실행 여부를 결정한다. 이러한 논리연산자를 특별히 『쇼트-서킷』이라 한다.
  • 쇼트 서킷에서는 && 앞의 boolean 값이 false 일 때, && 뒤를 굳이 실행하지 않음으로 불필요한 연산을 생략하고
  • 마찬가지로 || 앞의 boolean 값이 false 일 때만 뒤를 실행한다. (|| 앞쪽이 True 라면 뒤를 굳이 연산하지 않는다.)
if ( 조건문1 && 조건문2 || 조건문3 ) {} 

조건문1이 거짓일 경우 다음 결과는 확인해볼 필요 없이 전체 if 문은 결과가 거짓이 된다.

스트림에서도 전체 스트림을 처리하지 않았더라도 결과를 반환할 수 있다.

findFirst, findAny, limit, allMatch, noneMatch 등의 연산은 모든 스트림을 처리하지 않고 결과를 반환할 수 있다.

@sure-why-not
Copy link
Author

예시 1. limit

 @Test
 void 스트림_limit2() {
     List<String> strings = List.of("a", "lala", "yaho", "greenlone", "jung", "tiki", "sun", "alpa", "Torr");
     List<String> results = strings.stream()
         .filter(word -> {
             System.out.println("Call filter method: " + word);
             return word.length() > 1;
         })
         .map(word -> {
             System.out.println("Call map method: " + word);
             return word.substring(0, 3);
         })
         .limit(2)
         .collect(Collectors.toList());

     System.out.println();
     System.out.println("결과 : " + results);
 }

결과

Call filter method: a
Call filter method: lala
Call map method: lala
Call filter method: yaho
Call map method: yaho

결과 : [lal, yah]

예시 2. 스트림 - findFirst()

    @Test
    void 스트림_findFirst() {
        List<String> strings = List.of("lala", "yaho", "greenlone", "jung", "tiki", "sun", "alpa", "Torr");
        String result = strings.stream()
            .filter(word -> {
                System.out.println("Call filter method: " + word);
                return word.length() > 3;
            })
            .map(word -> {
                System.out.println("Call map method: " + word);
                return word.substring(0, 3);
            })
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException(""));

        System.out.println();
        System.out.println("결과 : " + result);
    }

결과

Call filter method: a
Call filter method: lala
Call map method: lala

결과 : lal

예시 3. 병렬 스트림 - findFirst()

    @Test
    void 병렬스트림_findFirst() {
        List<String> strings = List.of("a", "lala", "yaho", "greenlone", "jung", "tiki", "sun", "alpa", "Torr");
        String result = strings.parallelStream()
            .filter(word -> {
                System.out.println("Call filter method: " + word);
                return word.length() > 3;
            })
            .map(word -> {
                System.out.println("Call map method: " + word);
                return word.substring(0, 3);
            })
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException(""));
        System.out.println();
        System.out.println("결과 : " + result);
    }

결과

Call filter method: jung
Call filter method: a
Call filter method: tiki
Call filter method: alpa
Call filter method: sun
Call filter method: lala
Call filter method: yaho
Call filter method: greenlone
Call filter method: Torr
Call map method: greenlone
Call map method: alpa
Call map method: tiki
Call map method: yaho
Call map method: lala
Call map method: jung
Call map method: Torr

결과 : lal

예시 4. 스트림 - findAny()

    @Test
    void 스트림_findAny() {
        List<String> strings = List.of("a", "lala", "yaho", "greenlone", "jung", "tiki", "sun", "alpa", "Torr");
        String result = strings.stream()
            .filter(word -> {
                System.out.println("Call filter method: " + word);
                return word.length() > 3;
            })
            .map(word -> {
                System.out.println("Call map method: " + word);
                return word.substring(0, 3);
            })
            .findAny()
            .orElseThrow(() -> new IllegalArgumentException(""));

        System.out.println();
        System.out.println("결과 : " + result);
    }

결과

Call filter method: a
Call filter method: lala
Call map method: lala

결과 : lal

예시 5. 병렬 스트림 - findAny()

    void 병렬스트림_findAny() {
        List<String> strings = List.of("a", "lala", "yaho", "greenlone", "jung", "tiki", "sun", "alpa", "Torr");
        String result = strings.parallelStream()
            .filter(word -> {
                System.out.println("Call filter method: " + word);
                return word.length() > 3;
            })
            .map(word -> {
                System.out.println("Call map method: " + word);
                return word.substring(0, 3);
            })
            .findAny()
            .orElseThrow(() -> new IllegalArgumentException(""));

        System.out.println();
        System.out.println("결과 : " + result);
    }

결과

Call filter method: yaho
Call filter method: sun
Call filter method: alpa
Call filter method: Torr
Call filter method: a
Call filter method: jung
Call filter method: tiki
Call map method: yaho
Call filter method: lala
Call map method: Torr
Call filter method: greenlone
Call map method: lala
Call map method: alpa
Call map method: tiki
Call map method: jung
Call map method: greenlone

결과 : yah

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ch4 about chapter 4
Projects
None yet
Development

No branches or pull requests

1 participant