Home » 레퍼런스 » JAVA » java string join 메서드에 대해 알아봅시다.

java string join 메서드에 대해 알아봅시다.

java에는 문자열을 concat 하기 위한 방법이 있습니다.

이 글에서는 java string join 메서드를 알아봅니다.


사용 예제

먼저, 메서드에 대한 설명과 예제를 보도록 하겠습니다.

[그림 1] delimeter와 charSequence들을 넘기기

먼저, 아래와 같이 넘기는 방법이 있습니다.

  • delimeter
  • element1, … elementn

1번째 인자로 구분자를 넘깁니다. 그리고, 나머지 인자들은 모두, 원소들입니다. 예를 들어, 구분자로 “-“를 넘기고 element로 “a”, “b”를 넘겼다면, 출력은 “a-b”가 됩니다. 가변 인자라고 하는데요. 호출 받는 쪽에서는 배열로 변환됩니다.

[그림 2] 원소 각각 대신에 묶음으로 넘기기

묶음으로 넘기는 방법도 있습니다. Charsequence들을 저장한 Iterable한 무언가를 넘기면 됩니다. 대표적인 예로 List 계열이 될 수 있습니다. 예제를 보겠습니다.

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

strList에는 2개의 원소 “a”, “b”가 있습니다.

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

실행 결과는 위와 같습니다. 당연하게도, 단순히 append만 하려면, delimeter로 “”, 빈 문자열을 넘겨주면 됩니다. 아래 예제 2번을 보세요.

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

li에는 “a”, “b”, “c” 순서로 들어가 있어요. iterable한 CharSequence를 모아놓은 것입니다. 6번째 줄에 String의 join을 호출하였는데요. delimiter로 “”, 빈 문자열을 주었어요. 그러면, 결과가 어떻게 나올까요? “abc”가 나오겠지요.

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

실행 결과는 “abc”가 나옵니다.

  • List 등으로 join할 문자열을 모아 놓습니다.
  • join 함수에 문자열을 모아놓은 iterable한 것을 구분자와 함께 인자로 넘깁니다.

이 패턴은 생각보다 많이 쓰이니, 알아두면 좋겠습니다.


Java String Join 은 어떻게 동작하는가?

내부를 뜯어보겠습니다. 먼저, element를 모두 넘기는 1번째 경우입니다.

[그림 7] elements를 넘기는 join 함수의 로직

우리는 이미 elements의 개수를 알고 있습니다. 무슨 소리인가? 디버그를 해 봅시다.

[그림 8] elements 변수

elements 변수를 보면, CharSequence의 배열의 참조값임을 알 수 있습니다. 이 말인 즉슨, 가변 인자의 경우, 실제로 넘겨 받은 쪽에서

  • elements 들을 차례로 읽은 다음에
  • 이를 배열로 만들었다.

는 의미입니다. 배열이 만들어졌다는 것이 포인트입니다. 배열의 길이는 length를 호출하면 알기 때문에, 순회하면서 elem 배열에 넣어주기만 하면 됩니다. 당연하게도, 고정 배열의 경우, 크기 또한 고정으로 할당하면 됩니다. 그리고 실제 결과값을 내는 join을 호출합니다. 이 때, elems은, String의 참조값을 저장하고 있는 배열입니다.

[그림 9] Iterable한 것을 넘긴 경우

Iterable한 것을 넘긴 경우에는 어떨까요? 순회하는 부분이 다릅니다. 먼저, elems가 String을 받는 배열입니다. 문자 단위로 동작하지 않습니다.

처음 elems는 위와 같이 초기화 되어 있습니다. 순회를 했더니, ’11’과 ‘222’가 있었다고 해 보겠습니다.

’11’이 추가되면, elems은 위와 같이 변합니다. 0번째 원소에 ’11’이 저장되는 게 아니라, ’11’의 참조값이 저장됩니다.

다음에 ‘222’가 있었습니다. 이 경우, 1번째 원소에 ‘222’가 아니라 ‘222’의 참조값이 저장됩니다. 이들은, 최종 결과를 return 하는 join 에서 elems의 string에 최소 2번 이상 접근하게 됩니다.

  • 전체 길이를 산정할 때
  • 실제 원소를 결과에 복사할 때

정말 그럴까요? java string join 메소드에서 호출한, 다른 join 메서드의 내부를 봅시다.

[그림 10] 결과 길이 산정

결과 길이 계산하는 과정에서, elements에 접근합니다.

[그림 11] 결과에 원소들을 넣을 때

결과에 원소들을 넣을 때에도 elements에 접근합니다.

Leave a Comment

6 + 6 =