학습목표
- String
- StringBuffer
- StringBuilder
- concat과 +, StringBuffer의 append의 차이
String
특징
- java의 String 클래스로 예를 들어 "abc"라는 클래스를 만든다면 "abc"를 가지는 인스턴스로 implement된다.
- 가장 큰 특징은 "constant" 한 것이다. 생성되면 변경할 수 없다.
- immutable한 것이 특징이고. StringBuffer가 이런 특징을 해결할 수 있어서 mutable하다고 할 수 있다.
- 만약 new 를 통해서 String 클래스를 변경하고 싶을때, 변할 수 없다면 문자의 변경이 필요할 때마다 객체를 생성해야 한다.
- 이것은 메모리 낭비로 이어진다. 이런 이유 때문에 StringBuffer의 append()를 활용한다.
활용도
- String 문자의 특성을 활용할 수 있는 여러 매서드를 제공한다. substring, toCharArray 등.
- String의 concat 메소드를 통해 converting이 가능하다. 이것의 로직은 StringBuffer(StringBulider)를 활용한다.
- Unicode 인코딩을 대처하기 위한 메소드도 제공한다.
추가적으로, toString()에 대해 알아보자.
- 모든 Object 클래스에 가지고 있는 메소드로, 기본적으로 plain text를 읽을 수 있는 메소드이다.
- 공식문서에 권장하는 부분은, 모든 서브클래스들은 오버라이드해서 쓰도록 추천을 한다.
StringBuffer
- Mutable 한 것이 특징. 그러므로 값이 변경될 수 있고, 사이즈가 변경될 수 있다.
- Thread-safe 하여 동시성 이슈도 해결해준다.
- append, insert 를 통해 문자를 붙힐 수 있다.
- StringBuffer, then sb.append(x) has the same effect as sb.insert(sb.length(), x)
- 2개 메소드는 실행될 때, synchronizes 처리된다 -> 임계영역 설정됨.
- StringBuffer에 보충된 기능을 더해 JDK 1.5이후에, 싱글스레드에서 사용되도록 설계된 StringBuilder 클래스가 있습니다.
StringBuilder
- StringBuilder 클래스는 StringBuffer와 동일한 작업을 모두 지원하지만 synchronize 를 수행하지 않으므로 더 빠르기 때문에 일반적으로 이 클래스를 우선적으로 사용해야 합니다.
- 동시성은 보장하지 않습니다.
- StringBuilder의 인스턴스는 여러 스레드에서 사용하기에 안전하지 않습니다. 이러한 동기화가 필요한 경우 StringBuffer를 사용하는 것이 좋습니다.
concat과 +, StringBuffer의 append의 차이
public class Main {
public static void main(String[] args) {
String strSample1 = "Hello";
String strSample2 = "World";
String result1 = strSample1 + strSample2;
String result2 = strSample1.concat(strSample2);
StringBuilder result3 = new StringBuilder();
result3.append(strSample1);
result3.append(strSample2);
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
}
}
- concat을 이용할때는 초기값이 null이면 안된다. nullpointexception 주의.
- concat과 +를 이용하면 strSample2와 result2를 더해줄 때, 새로운 주소값의 객체가 생성된다 -> 메모리 낭비
- 그렇지만 StringBuilder를 이용하면 같은 주소값의 값을 변경하는 것이기 때문에 메모리 낭비를 줄일 수 있다.
- 자바 버전에 따라 다른데, 1.5 이전에는 concat을 이용하는 방식과 같고 1.5 이후에는 StringBuilder를 이용하는 방식과 같다. 이 내용은 아래 주소에서 읽다가 알게된 사실이다.
결론
- 결과값이 같아 아무거나 써도 될 것 같지만 구조적으로 다르기 때문에 사실 결과값이 완전히 같다고 할수는 없다. new를 통한 메모리를 낭비하고 싶지 않다면 StringBuilder를 사용하는 것이 좋고 JDK1.5이상 버전을 쓴다면 +를 사용해도 무관할 것 같다.
출처
'Backend > Java' 카테고리의 다른 글
[Java] 재귀함수 / 일반재귀 vs 꼬리재귀 / 언어별 꼬리 재귀 최적화 / 연결리스트 꼬리재귀 코드 (0) | 2022.02.20 |
---|---|
[Java] 싱글스레드 / 멀티스레드 / 스레드의 IO 블록킹 /스레드 우선순위 / 스레드 그룹 / 데몬 스레드 (0) | 2022.02.14 |
Java 인터페이스(Interface) (0) | 2021.03.06 |
Java - 패키지 (package/import/클래스패스/접근지시자) (0) | 2021.03.05 |
멀티쓰레드 프로그래밍 (0) | 2021.03.04 |