Java

[Java] String, StringBuilder, StringBuffer

Joo.v7 2024. 10. 6. 11:58

1. String

불변성(Immutable)

new 연산자 vs literal 방식

2. StringBuilder와 StringBuffer

공통점 - 가변성(Mutable)

차이점 - 동기화(Synchronization)

활용 시점


1. String

불변성 (Immutable)

  • Java에서 String 객체는 값이 할당되면 이 공간은 변하지 않는다.
  • String이 변경될 때마다 새로운 메모리를 할당받는다.
  • 아래 예시처럼 값 변경시, String 값만 가리키는 주소가 달라진다.

예시 코드

public class Main {
    public static void main(String[] args) {
        String string = "String";

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("StringBuilder");

        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("StringBuffer");

        System.out.println("값 변경 전");
        System.out.printf("String: %d \n", string.hashCode());
        System.out.printf("StringBuilder: %d \n", stringBuilder.hashCode());
        System.out.printf("StringBuffer: %d \n", stringBuffer.hashCode());

        string = "Change String";
        stringBuilder.append("Change");
        stringBuffer.append("change");

        System.out.println("값 변경 후");
        System.out.printf("String: %d \n", string.hashCode());
        System.out.printf("StringBuilder: %d \n", stringBuilder.hashCode());
        System.out.printf("StringBuffer: %d \n", stringBuffer.hashCode());
    }
}

 

실행 결과

값 변경 전
String: -1808118735 
StringBuilder: 118352462 
StringBuffer: 1550089733 

값 변경 후
String: -1022539135 
StringBuilder: 118352462 
StringBuffer: 1550089733

 

new 연산자 vs literal 방식

  1. new 연산자
    • Java에서 new 연산자를 사용하면 Heap 영역에 메모리가 할당된다.
    • Java에서 Primiteive Type은 Stack에 생성되지만, Reference Type은 Heap 영역에 생성된다.
    • 값 비교시, '=='를 사용하면 주소값만 비교하므로 .equals 등을 사용해야 한다.
    • ex) String string = new String("this is string");
  2. 리터럴(literal) 방식
    • String을 리터럴(literal) 값으로 할당하는 경우, Heap 영역안의 String Constant Pool에 저장된다.
    • 값 비교시, " " 안의 값을 String Constant Pool에 저장된 값들과 비교하므로 '=='를 사용해도 된다.
    • ex) String string = "this is string";

출처: https://deveric.tistory.com/123

 


2. StringBuilder와 StringBuffer

공통점 - 가변성(Mutable)

  • 값이 변경될 수 있다.
  • 값이 변경되더라도 같은 주소 공간을 참조한다.
  • 글 상단의 String 불변성 예시 참고.

 

차이점 - 동기화(Synchronization)

  • StringBuilder: 동기화를 지원하지 않는다.
  • StringBuffer: 동기화를 지원하여, 멀티 스레드 환경에서도 안전하게 동작한다.
    (메소드에 synchronized 되어 있음) 

 

활용 시점

  • StringBuilder: 공유 자원을 사용하지 않는 경우.(속도 면에서 성능이 더 우수하다)
  • StringBuffer: Multi Thread 환경에서 각 스레드들이 공유 자원을 사용하는 경우.

 


 

 

참고: 2024.08.28 - [NHN Java 백엔드 8기/Java] - [Java] 08. 참조 타입

 

[Java] 08. 참조 타입

Chapter 1: 참조 타입값 타입과 참조 타입 비교참조 타입 변수의 선언과 해제초기화되지 않은 참조 타입 변수값 타입의 비교와 참조 타입의 비교같은 객체에 대한 여러 변수의 참조메소드 파라미

lightningtech.tistory.com

'Java' 카테고리의 다른 글

[Java] Naming Convention: Camel Case, Pascal Case  (0) 2024.11.06
[Java] Java에서의 Stream (스트림)  (0) 2024.09.12
[Java] Java Logging  (0) 2024.09.11
[Java] Maven (메이븐)  (2) 2024.09.11
[Java] 14. Collections Framework  (0) 2024.09.02