ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바(JAVA)] 문자 리스트를 문자열로 변환하기 / stream, .collect, Collector.joinning(), String.join
    프로그래머스/자바(JAVA) 2023. 7. 1. 21:14
    728x90

     

     

     

    주어진 배열을 순서대로 합쳐서 String 타입으로 출력하면 된다.

    나는 여기서 향상된 for문이 떠올랐으나 stream으로 풀어보았다.

     

     

    👉👆👇👈🫶👀🤔🤐🙄🙆‍♀🤷‍♀🙋‍♀🔥⚡♦♥📲🖥🔎🔍

    📕📔📗📘📙📄📌📍🚫⛔⬆↗➡↘⬇↙⤵⤴↪↩↔↕↖⬅

    🔃🔄▶⏩⏭⏯◀⏪⏮🔼⏫🔽⏬⏸⏹⏺⏏🎦📶🛜‼⁉

    ❓❗✖➕➖❌⭕✅🔴🟠🟡🟢🔵🟣🟤⚪⚫🔻🔺🔸🔷🔶🔹

     

    💫💯💢💤💭💬🗨⭐🌟🌙🌝♥♦🎲✌🖐✊🎈🏷✔

    🔴🟠🟡🟢🔵🟣🟤⚪⚫

    🟥🟧🟨🟩🟦🟫🟫⬛⬜◼◻◾◽▪▫

    🔶🔷🔸🔺🔻🔹💠🔘🔲🔳

     

    ✅ 내 풀이

    import java.util.Arrays;
    import java.util.stream.Collectors;
    
    
    class Solution {
        public String solution(String[] arr) {
         
            return Arrays.stream(arr).collect(Collectors.joining());
        }
    }

     

     

    1. Arrays.stream(arr): Arrays 클래스의 stream() 메서드를 사용하여 배열 arr을 스트림으로 변환합니다. 이를 통해 배열의 각 요소에 접근하여 연산을 수행할 수 있습니다.
    2. .collect(Collectors.joining()): 스트림의 요소들을 연결하여 하나의 문자열로 반환하는 최종 연산입니다. 3. Collectors.joining()은 스트림의 요소들을 이어붙이는 역할을 합니다. 기본적으로 각 요소 사이에는 구분자 없이 연결됩니다.
    만약 구분자를 지정하려면 Collectors.joining(delimiter) 형식으로 사용하면 됩니다. 여기서 delimiter는 각 요소를 구분할 문자열입니다. 예를 들어, Collectors.joining(", ")는 각 요소를 쉼표와 공백으로 구분하여 연결합니다.
    4. Collectors.joining()은 String 클래스의 join() 메서드와 유사한 역할을 수행합니다. 하지만 Collectors.joining()은 스트림의 요소를 연결하기 위해 스트림 파이프라인과 함께 사용되는 것이 특징입니다.

     

    기껏 stream을 찾아서 풀었더니 String 클래스에 join메서드와 "유사한"역할을 한다고 알려줬다.

    그렇다면 String의 join메서드를 활용하면 어떻게될까?

     

     

     


    ✅ 다른사람 풀이 1

    class Solution {
        public String solution(String[] arr) {
            return String.join("", arr);
        }
    }

    나는 String에 join이라는 메서드가 있는지 몰랐다..

    확실히 코드는 깔끔하지만 String이기 때문에 처음 생성된 문자열의 수정이 아닌 추가생성으로 진행된다.

    즉, arr = {'a', 'b', 'c'} 인 경우

    a

    ab

    abc

    이렇게 3개의 문자열을 만들게 된다.

    요소가 많을 경우 불필요한 문자열을 계속 만드는거라 효율적이지 않아 보인다.

     

     

    ✅ 다른사람 풀이 2

    class Solution {
        public String solution(String[] arr) {
            StringBuilder answerBuilder = new StringBuilder();
            
            for (String str : arr) {
                answerBuilder.append(str);
            }
            
            return answerBuilder.toString();
        }
    }

    처음 생각했던 향상된 for문을 사용하고, Stringbuilder를 사용하여 효율성을 높였다.

     

     

     

    그럼 내가 처음에 만든 stream은 문자열의 수정일까 추가생성일까?

    Arrays.stream(arr) 메서드를 호출하여 배열을 스트림으로 변환할 때, arr 배열의 각 요소들이 순차적으로 스트림에 추가됩니다. 이때, 문자열을 연결하는 작업은 스트림 요소가 추가될 때마다 수행되는 것이 아니라, 내부적으로 스트림의 모든 요소를 처리하면서 한 번에 수행됩니다.

    스트림은 지연 연산(lazy evaluation)을 지원하며, 연산을 수행하기 전까지 실제 계산을 진행하지 않습니다. 따라서, Arrays.stream(arr) 메서드를 호출하더라도 실제 문자열 연결은 collect(Collectors.joining()) 메서드를 호출할 때까지 지연됩니다. 그리고 collect(Collectors.joining()) 메서드는 내부적으로 모든 요소를 한 번에 처리하여 최종 문자열을 생성합니다.

    결과적으로, 스트림을 사용하여 문자열을 연결하는 경우에는 중간 단계에서 개별 문자열을 계속 생성하는 것이 아니라, 스트림 내부에서 최종 문자열을 한 번만 생성합니다. 이를 효율적으로 처리하기 위해 스트림은 내부적으로 버퍼링 등의 최적화 작업을 수행합니다. 따라서, 스트림을 사용한 문자열 연결은 일반적으로 효율적이고 성능적으로 우수한 방법입니다.

    이렇게 스트림을 열심히 공부해야할 이유가 또 생겨났다...ㅎ

     

    728x90
Designed by Tistory.