-
[Java] String.concat(), '+'연산자, StringBuilder, StringBuffer에 대하여■ Back-End/- Java 2019. 7. 2. 13:56
일반적으로 문자열을 연결할 때 자주 사용하는 방법은
(1) String.concat();
(2) '+' 연산자
(3) StringBuilder
(4) StringBuffer
이렇게 4가지이다.
이런 방법들이 언제, 어떻게 사용하는게 더 효율적일지 알아보려고 한다.
1. String 클래스의 concat() 메서드
- String 클래스에서 제공하는 기본 메서드이다.
- concat() 메서드를 이용해서 문자열을 추가할 때마다, 새로운 인스턴스를 생성한다. 따라서 성능이나 속도 면에서 좋지 않다.
예제 코드
실행 결과
실행 결과를 보면 초기 "공유" 라고 저장된 str의 주소와 concat() 메서드 실행 후 str의 주소가 달라진 것을 볼 수 있다.
만약 반복적인 문자열 연결이 이루어진다면 주소 값이 stack에 계속해서 쌓이게 될 것이다.
2. '+' 연산자
사실 Java를 배운지 얼마 안됐을 때에는 '+' 연산자보다 concat() 메서드를 쓰는게 더 멋진 개발자?라고 생각했었다. '+' 연산자는 약간 꼼수 같은 느낌이었음..;;
- Java 1.5 이전에는 concat() 메서드처럼 문자열을 추가할 때마다 새로운 인스턴스를 생성했다고 한다. 그러다가 1.5 이후에는 StringBuilder로 변환해서 처리하는 것으로 변경 되었다. 그래서 일반적으로 간단한 문자열 추가의 경우에는 '+' 연산자를 사용하는게 좋다.
3. StringBuilder
StringBuilder의 경우에는 복잡하거나 반복적인 문자열 수정시 사용하는 것이 좋다. 예를 들면, for 문이나 while 문 같은 반복문 안에서 문자열을 계속 추가해야하는 경우에는 '+' 연산자보다는 StringBuilder를 사용하는 것이 좋다.
예제 코드
실행 결과
StringBuild의 경우, 계속해서 문자열을 추가해도 주소 값은 바뀌지 않는다.
4. StringBuffer
StringBuffer는 멀티쓰레드 환경에서 StringBuilder 대신 사용한다. StringBuilder의 경우 동기화를 지원하지 않기 때문이다.
실제로 아래와 같이 멀티쓰레드 환경을 만들어서 테스트를 해보면 StringBuffer의 길이가 더 길게 나온다.
예제 코드
실행 결과
참고 사이트 :
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html
String (Java Platform SE 7 )
Compares two strings lexicographically. The comparison is based on the Unicode value of each character in the strings. The character sequence represented by this String object is compared lexicographically to the character sequence represented by the argum
docs.oracle.com
https://novemberde.github.io/2017/04/15/String_0.html
Khbyun's blog
Novemberde's dev
novemberde.github.io
'■ Back-End > - Java' 카테고리의 다른 글
[자료구조] 02. 연결 리스트 (0) 2019.07.17 [Java] Java 8 에서 추가된 기능 사용해보기 (0) 2019.07.02 [자료구조] Java로 Tree 구현하기 (0) 2019.05.19 [자료구조] 01. 배열과 문자열 (0) 2019.05.15 [Java] Thread_쓰레드 (0) 2019.05.15