1. 개요
Java에서 문자열 연결은 가장 일반적인 작업 중 하나입니다. 이 사용방법(예제)에서는 문자열 연결에 대한 몇 가지 접근 방식을 살펴보겠습니다. 그러나 concat() 및 " + " 연산자 접근 방식 을 사용하는 방법을 설명하는 데 중점을 둘 것 입니다. 마지막으로 해야 할 일에 따라 올바른 것을 선택하는 방법에 대해 논의합니다.
2. 연결에 대한 접근
일반적으로 Java에서 두 개 이상의 문자열을 연결하는 방법에는 여러 가지가 있습니다. 또한 각각에 대한 설명과 함께 몇 가지 예를 살펴보겠습니다.
2.1. " + " 연산자 사용
Java에서 가장 일반적인 연결 방법 중 하나는 " + " 연산자 를 사용하는 것 입니다.
" + " 연산자는 다른 접근 방식보다 문자열 연결에 더 많은 유연성을 제공합니다. 첫째, null 값에 대한 예외를 throw하지 않습니다. 둘째, null을 문자열 표현으로 변환합니다. 게다가 두 개 이상의 문자열을 연결하는 데 사용할 수 있습니다.
코드 예제를 보자:
@Test
void whenUsingPlusOperatorANull_thenAssertEquals() {
String stringOne = "Hello ";
String stringTwo = null;
assertEquals("Hello null", stringOne + stringTwo);
}
컴파일러는 내부적으로 " + " 연산자를 StringBuilder (또는 StringBuffer ) 클래스 및 해당 append() 메서드로 변환합니다.
" + " 연산자는 자동으로 인수를 문자열 로 변환 하므로 ( 개체 에 toString() 메서드 사용 ) NullPointerException 을 피할 수 있습니다. 그러나 최종 문자열 결과가 문자열 본문의 "null"과 함께 작동하는지 고려해야 합니다.
2.2. concat() 메서드 사용
String 클래스 의 concat() 메서드 는 현재 문자열 끝에 지정된 문자열을 추가하고 새로 결합된 문자열을 반환합니다. String 클래스는 변경할 수 없으므로 원래 String 은 변경되지 않습니다.
이 동작을 테스트해 보겠습니다.
@Test
void whenUsingConcat_thenAssertEquals() {
String stringOne = "Hello";
String stringTwo = " World";
assertEquals("Hello World", stringOne.concat(stringTwo));
}
이전 예에서 stringOne 변수는 기본 문자열입니다. concat() 메서드를 사용 하면 stringTwo 가 stringOne 끝에 추가됩니다 . concat() 작업은 변경할 수 없으므로 명시적 할당이 필요합니다 . 다음 예는 이 경우를 보여줍니다.
@Test
void whenUsingConcatWithOutAssignment_thenAssertNotEquals() {
String stringOne = "Hello";
String stringTwo = " World";
stringOne.concat(stringTwo);
assertNotEquals("Hello World", stringOne); // we get only Hello
}
또한 이 경우 최종 연결된 문자열을 얻으려면 concat() 결과를 변수에 할당해야 합니다.
stringOne = stringOne.concat(stringTwo);
assertEquals("Hello World", stringOne);
concat() 의 또 다른 유용한 기능은 여러 String 객체를 연결해야 할 때입니다. 이 방법은 허용합니다. 또한 공백과 특수 문자를 추가할 수도 있습니다.
@Test
void whenUsingConcatToMultipleStringConcatenation_thenAssertEquals() {
String stringOne = "Hello";
String stringTwo = "World";
String stringThree = ", in Jav";
stringOne = stringOne.concat(" ").concat(stringTwo).concat(stringThree).concat("@");
assertEquals("Hello World, in Jav@", stringOne);
}
null은 어떻습니까? 현재 문자열이나 추가할 문자열은 모두 null 값이 될 수 없습니다. 그렇지 않으면 concat() 메서드 는 NullPointerException 을 발생 시킵니다 .
@Test
void whenUsingConcatAppendANull_thenAssertEquals() {
String stringOne = "Hello";
String stringTwo = null;
assertThrows(NullPointerException.class, () -> stringOne.concat(stringTwo));
}
2.3. StringBuilder 클래스
먼저 StringBuilder 클래스가 있습니다. 이 클래스는 연결 작업을 수행하는 append() 메서드를 제공합니다. 다음 예는 작동 방식을 보여줍니다.
@Test
void whenUsingStringBuilder_thenAssertEquals() {
StringBuilder builderOne = new StringBuilder("Hello");
StringBuilder builderTwo = new StringBuilder(" World");
StringBuilder builder = builderOne.append(builderTwo);
assertEquals("Hello World", builder.toString());
}
다른 한편으로 비슷한 연결 접근 방식이 StringBuffe r 클래스입니다. 동기화되지 않은(즉, 스레드로부터 안전하지 않은) StringBuilder 와 달리 StringBuffer 는 동기화됩니다 (즉, 스레드로부터 안전함). 그러나 StringBuilder 보다 성능이 떨어집니다 . StringBuilder 와 마찬가지로 append() 메서드 가 있습니다.
2.4. 문자열 형식() 메서드
문자열 연결을 수행하는 또 다른 방법 은 String 클래스 의 format() 메서드를 사용하는 것입니다. %s 와 같은 형식 지정자를 사용하여 문자열 값이나 객체로 여러 문자열을 연결할 수 있습니다.
@Test
void whenUsingStringFormat_thenAssertEquals() {
String stringOne = "Hello";
String stringTwo = " World";
assertEquals("Hello World", String.format("%s%s", stringOne, stringTwo));
}
2.5. Java 8 이상에서 연결에 대한 접근 방식
String 클래스 의 메소드 join() 은 Java 8 이상에서 문자열 연결을 수행할 수 있습니다. 이 경우 이 메서드는 연결할 문자열 사이에 사용되는 구분 기호를 첫 번째 인수로 사용합니다.
@Test
void whenUsingStringJoin_thenAssertEquals() {
String stringOne = "Hello";
String stringTwo = " World";
assertEquals("Hello World", String.join("", stringOne, stringTwo));
}
Java 8부터 StringJoiner 클래스가 추가되었습니다. 이 클래스는 구분 기호, 접두사 및 접미사를 사용하여 String 을 결합합니다. 다음 코드 스니펫은 사용 예입니다.
@Test
void whenUsingStringJoiner_thenAssertEquals() {
StringJoiner joiner = new StringJoiner(", ");
joiner.add("Hello");
joiner.add("World");
assertEquals("Hello, World", joiner.toString());
}
또한 Java 8에서는 Stream API 가 추가되어 Collector 를 찾을 수 있습니다 . Collectors 클래스에는 Join () 메서드가 있습니다. 이 메서드는 String 클래스 의 join() 메서드 와 유사하게 작동합니다 . 컬렉션에 사용됩니다. 다음 예제 코드 스니펫은 작동 방식을 보여줍니다.
@Test
void whenUsingCollectors_thenAssertEquals() {
List<String> words = Arrays.asList("Hello", "World");
String collect = words.stream().collect(Collectors.joining(", "));
assertEquals("Hello, World", collect);
}
3. 접근법 선택
마지막으로 concat() 메서드와 " + " 연산자 중에서 선택해야 하는 경우 몇 가지 측면을 고려해야 합니다.
첫째, concat() 메서드는 문자열만 허용합니다. 한편, " + " 연산자는 모든 유형을 취하여 문자열로 변환합니다. 반면에 concat() 메서드 는 null 값에 대해 NullPointerExeption 을 발생시킵니다. " + " 연산자에서는 그렇지 않습니다.
또한 둘 사이에는 성능 차이가 있습니다. concat() 메서드 는 " + " 연산자 보다 더 잘 수행 됩니다. 후자는 문자열의 길이에 관계없이 항상 새 문자열을 만듭니다. 또한 concat() 메서드는 추가할 문자열의 길이가 0보다 큰 경우에만 새 문자열을 생성 한다는 점을 고려해야 합니다 . 그렇지 않으면 동일한 객체를 반환합니다.
4. 결론
이 기사에서는 Java의 문자열 연결에 대한 간략한 개요를 수행했습니다. 또한 concat() 및 " + " 연산자를 사용하여 문자열 연결을 수행 하는 방법에 대해 자세히 설명했습니다 . 마지막으로 concat() 메서드와 " + " 연산자 를 비교 분석 하고 서로 다른 컨텍스트에서 둘 중 하나를 선택할 수 있는 방법을 수행했습니다.
항상 그렇듯이 이 기사에서 사용된 모든 스니펫은 GitHub 에서 사용할 수 있습니다 .