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