Home » 레퍼런스 » JAVA » java stringjoiner 사용법과 내부 동작을 알아봅시다.

java stringjoiner 사용법과 내부 동작을 알아봅시다.

java stringjoiner 클래스는 string을 join, concat 하기 위해 많이 씁니다. python의 join을 생각해 보면 편할 텐데요. 문자열 사이에 delimeter를 넣거나, prefix, suffix 등을 넣을 때에도 유용하게 쓰입니다. 비슷한 기능들을 하는 것들은, 아래 시리즈로 작성할 예정입니다.

  • java stringjoiner 클래스 [현재글]
  • java string.join
  • java stringbuiler, stringbuffer

이제, 간단한 예제와 내부 동작을 알아보도록 하겠습니다.


사용 방법

먼저, 사용 방법은 크게 어렵지 않습니다. StringJoiner의 생성자가 2가지 타입이 있어요.

  • delimeter
    • 문자열을 구분할 구분자를 의미합니다.
  • delimeter, prefix, suffix
    • 구분자와, 접두사와 접미사를 같이 받는 생성자입니다.

구분자만 받는 타입이 있고, 구분자와 접두 접미를 받는 타입이 있어요. 이 둘을 간단하게 설명하겠습니다.

[그림 1] 예제 1번 프로그램

먼저, 1번째 예제는 joiner에 구분자와 prefix, suffix를 넣은 예제입니다. 접두사로 “[“, 접미사로 “]”를 넣었기 때문에, 문자열 시작 전에 “[“가 나오고, 끝나면 “]”가 붙을 겁니다. 이제 남은 것은 add로 원소들을 추가한 것인데요.

  • 원소 “1”과 “2”를 추가했습니다.
  • 이 둘을 구분자 “,”로 구분합니다.

이렇게 되면 실제 문자열은 “1,2”에 접두, 접미가 붙어서 “[1,2]”가 됩니다. 아. 참고로 add 메서드의 경우, charSequence만 받는다는 것 조심하세요.

[그림 2] 예제 1번 프로그램의 결과

결과는 위와 같습니다. 이번에는 delimeter만 넣어볼까요?

[그림 3] 예제 2번 프로그램

예제 1번과 다른 점은 뒤에 2개 prefix와 suffix가 joiner의 생성자에 없다는 것입니다. 그러면, 앞에 “[“, 뒤에 “]”가 붙지 않겠지요. 구분자 “,”로 인해 원소 “1”과 “2”가 “,”로 구분된 결과인 “1,2”가 나오게 됩니다.

[그림 4] 예제 2번 프로그램의 결과

2번의 결과는 위와 같습니다.


어떻게 동작하는가?

이 클래스는 어떻게 동작할까요? 이를 이해하기 위해서는 동적 배열의 개념을 알아야 합니다.

왜냐하면, 이 글에서 많이 등장할 용어이기 때문입니다. 먼저 add부터 보겠습니다.

[그림 5] add 메서드의 내부

쭉 읽어보면 아래와 같은 변수들을 볼 수 있습니다.

  • elts는 실제 joiner에 있는 원소들을 의미합니다.
  • size는 joiner에 있는 원소들의 실제 개수를 의미합니다.

190번째 줄을 보면, 꽉 찼을 때, copyOf 함수로 새로운 배열을 만드는 것을 볼 수 있는데요. 이 size가 2배입니다. 결국, StringJoiner는 원소를 관리할 때 grow rate가 2인 동적 배열로 관리한다는 말이 됩니다.

[그림 6] StringJoiner를 println할 때 호출되는 흐름

다음에, StringJoiner를 println으로 출력해 봅시다. 그러면, 위와 같은 호출 흐름을 타게 됩니다. 최종적으로는, String의 join 메소드를 호출하게 되는데요. 3 부분으로 나누어서 보겠습니다.

[그림 7] suffix와 prefix 계산하기

먼저, 1249번째 줄을 보면, suffix와 prefix의 길이를 더합니다. 그리고, size가 나오는데요. 이 size는 어디에서 온 것일까요?

[그림 8] size는 어디에서?

elements로 “1”, “11”이 넘어왔어요. 이 배열의 크기는 8이였습니다. 동적 배열의 경우, 길이와 실제 원소 개수가 차이가 납니다.

따라서, 실제 원소 개수인 2를 추가로 넘겨준 것입니다. 원소 개수가 나오면, 몇 개의 구분자를 추가해야 할 지도 나옵니다.

  • 구분자의 개수는 실제 원소 개수 – 1만큼 하면 됩니다.
    • 물론 0개일 때에는 예외로 0개입니다.
  • 이 개수에 구분자의 길이를 곱하면 됩니다.

1251번째 줄이 이를 수행합니다. 여기까지 수행하면, 구분자와 suffix, prefix의 길이의 합을 계산합니다. 아직 계산이 안 된 부분은 어느 부분인가요?

바로 실제 원소의 길이입니다. 이것은, 어떻게 계산하면 될까요? 그냥 elements에 있는 원소들을 모두 돌면서 합산하면 됩니다.

[그림 9] 원소들의 길이까지 합산하기

1257번째의 for loop가 그 일을 수행합니다. 이렇게 되면

  • 구분자, prefix, suffix의 길이 총 합
  • 원소 길이의 총 합

이 둘의 합을 구하게 된 것입니다.

[그림 10] 목적 배열에 넣기

이제, prefix 먼저 넣고, 0번째 원소를 넣습니다. 그림으로 그리면 아래와 같은 상황입니다.

그림으로 그리면 이런 상황입니다. 그 이후에는 어떻게 하면 될까요?

  • 구분자
  • 원소

이 순으로 나오기 때문에, 구분자, 원소 순으로 계속 append 시켜주면 됩니다. 마지막으로, suffix를 복사해 주면 되겠습니다.

이제 suffix까지 붙여주면 끝나겠네요. 그냥 전체 결과 배열에 copy만 하므로, 효율적으로 동작합니다.

Leave a Comment

6 + 1 =