String(Immutable, 불변)
String 객체는 불변 객체이다. 우리가 String 객체에 + 연산이나 concat과 같은 메서드를 실행하여 값을 변경시키는 것은
실제로는 새로운 값을 가진 String 객체를 생성하는 것이다.
이로인해 String타입 객체의 값을 변경하는 작업은 메모리 자원 할당과 해제를 유발하여 속도저하와 메모리 자원의 비효율성을 유발한다.
값을 나타내는 value에 final 선언
private final byte[] value;
자바에서 String을 불변으로 설정한 이유 String 객체를 불변하게 설계한 이유는 캐싱, 보안, 동기화, 성능측면 이점을 얻기 위해서이다. 1. 캐싱 : String을 불변하게 함으로써 String pool에 각 리터럴 문자열의 하나만 저장하며 다시 사용하거나 캐싱에 이용 가능하며 이로 인해 힙 공간을 절약할 수 있다는 장점이 있다. 2. 보안 : 예를 들어 데이터베이스 사용자 이름, 암호는 데이터베이스 연결을 수신하기 위해 문자열로 전달되는데, 만일 번지수의 문자열 값이 변경이 가능하다면 해커가 참조 값을 변경하여 애플리케이션에 보안 문제를 일으킬 수 있다. 3. 동기화 : 불변함으로써 동시에 실행되는 여러 스레드에서 안정적이게 공유가 가능하다. |
[참고] String literal = “aaa”;와 String strObj = new String(“aaa”);의 차이
- “aaa”는 문자열 리터럴로 String Constant Pool에 저장
- new 연산자로 생성하는 경우 힙 영역에 할당
- literal == strObj //false;
StringBuffer, StringBuilder(mutable, 가변)
자바에서는 문자열 연산에 유리한 StringBuilder 클래스를 제공한다.
StringBuilder와 StringBuffer는 버퍼(데이터를 임시로 저장하는 메모리)라는 독립적인 공간을 통해 문자열을 추가, 수정, 삭제할 수 있다.
값을 나타내는 속성 value에 final 없음
byte[] value;
String의 경우 객체 자체를 새롭게 생성하고 제거하기 때문에 이로인한 메모리 사용이 더욱 크지만,
StringBuilder는 객체가 아닌 객체가 참조하는 값을 변경하기에 오버헤드가 더욱 적어 성능과 메모리 자원 사용에도 효율적이다.
허나, 버퍼라는 임시 공간을 할당 받아야하기에 초기 생성 비용이 String 보다 크다.
StringBuilder와 StringBuffer의 특징
- 버퍼를 갖음
버퍼의 크기의 기본값은 16개의 문자 저장할 수 있는 크기, 할당된 버퍼의 크기 넘어가면 자동으로 증가 시키지만, 효율 떨어짐
(인스턴스 생성시 사용자가 설정한 문자보다 16개 문자 더 저장할 수 있는 크기로 생성, 용량 설정시 해당 용량으로) - 동등비교
equals 메서드가 오버라이딩 되어있지 않아 동등 비교시 동일 비교를 하게 된다.
따라서 동등 비교시 String으로 변환하여 equals 메서드를 실행해야한다.
문자열 연산에서 String과 StringBuffer, StringBuilder의 성능 차이
메모리에 매번 자원을 할당하는 String에 비해 버퍼라는 임시 공간을 통해 연산을 진행하고 기존 객체의 속성값을 변경시키는
StringBuilder와 StringBuffer가 마냥 연산 성능에 좋을 것 같지만 꼭 그렇지는 않다.
StringBuffer와 StringBuilder는 초기화시 버퍼 공간 확보와 연산시 버퍼를 늘리고 줄이는 추가 연산 작업이 필요하다.
이로인해 문자열 연산 작업이 많지 않다면 오히려 String 클래스를 사용하는 것이 효율적일 수 있다.
StringBuilder와 StringBuffer의 차이
- 동기화 처리(Synchronized)의 유무
-> StringBuffer는 모든 메서드에 synchronized 키워드가 붙어 있음
-> synchronized 키워드로 인한 오버헤드로 단일 스레드에서 문자열 연산 처리는 StringBuilder가 더 우수 - 이외 모든 기능 같음
[참고] Synchronized 키워드란
여러 스레드가 동시에 공유자원에 접근할 때, 하나의 스레드만 접근을 허용하는 처리를 제공해줌
StingBuilder와 StringBuffer의 차이는 synchronized에 있으므로 synchronized의 특징에 대해 깊이 있게 학습하길 바란다.
'Language > 자바&코틀린' 카테고리의 다른 글
컴파일 타임 의존성과 런타임 의존성 (0) | 2024.02.11 |
---|---|
[진행중][자바, 코틀린] 제너릭이란? 그리고 공변성과 원시(primitive) 타입 비허용 (0) | 2023.12.20 |
불변(Immutable)객체와 가변(mutable) 객체 (0) | 2023.11.15 |
인터페이스와 추상클래스의 차이 (0) | 2023.11.15 |
객체지향 설계의 SOLID 원칙 (0) | 2023.11.15 |