String, StringBuffer, StringBuilder

yunuyununu·2024년 11월 23일
0

개발 상식

목록 보기
7/17

String

자바에서 String은 불변(immutable)한 문자열을 처리하기 위한 클래스.
String 객체가 생성되면 그 값은 변경되지 않는다. "새로운 객체"로 추가 및 변경된다.

불변(immutable)한 클래스

  • 최초 객체를 생성한 뒤 상태를 변경 할 수 없는 것을 의미. 최초 생성한 객체에 추가나 변경이 발생하는 경우 새로운 객체가 다시 생성이 되어 구성된다.
  • ex) String, Integer, Float, Double, Long, Short, Byte, Character, BigDecimal, BigInteger 등

StringBuffer

자바에서 StringBuffer는 가변(mutable)한 문자열을 처리하기 위한 클래스.
새로운 문자열을 추가하거나 변경하게 되면 "기존의 객체"로 추가 및 변경된다.

가변(mutable)한 클래스

  • 최초 객체를 생성한 뒤 상태를 변경 할 수 있는 것을 의미. 최초 생성한 객체에 추가나 변경이 발생하는 경우 "기존의 객체"에 상태가 변경되어 구성된다.
  • ex) StringBuffer, StringBuilder, ArrayList, LinkedList, HashMap, HashSet, TreeMap, TreeSet 등

StringBuilder

자바에서 StringBuilder는 가변(mutable)한 문자열을 처리하기 위한 클래스.
StringBuffer와 마찬가지로 새로운 문자열을 추가하거나 변경하게 되면 "기존의 객체"로 추가 및 변경된다.
StringBuffer와 다르게 멀티쓰레드 환경에서 안정적이지 않으며, 싱글쓰레드 환경에서는 더 빠른 성능을 가진다.

싱글쓰레드(Single Thread)

  • 하나의 코드 블록을 실행하는 동안 다른 코드 블록이 실행되지 않는 경우. 동시에 하나의 작업만 실행할 수 있음.

멀티쓰레드(Multi Thread)

  • 두 개 이상의 쓰레드가 동시에 실행되는 것. 여러 개의 코드 블록이 동시에 실행될 수 있으므로, 멀티쓰레드 환경에서는 동기화(synchronization) 문제가 발생할 수 있으며, 이를 해결하기 위해 락(lock)과 언락(unlock) 메커니즘이 사용된다.


📊 String, StringBuffer, StringBuilder 차이점

ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ㅤㅤㅤㅤStringㅤㅤㅤㅤ StringBuffer StringBuilder
선언방식 String str="Hi"; StringBuffer sb
= new StringBuffer("Hi");
StringBuilder sb
= new StringBuilder("Hi");
문자열 추가방법 str += "car"; sb.append("car"); sb.append("car");
클래스 종류 불변 가변 가변
변수 추가 및
변경시 메모리 성능
불리함 유리함 유리함
단일쓰레드 환경에서 성능 안정적 안정적 안정적
멀티쓰레드 환경에서 성능 안정적 안정적, 동기화 과정에서 성능저하 안정적, 동기화 과정에서 성능저하
속도 매우 느림 빠름 빠름
사용목적 문자열 추가와 변경이
발생하지 않는 경우
사용하는 것이 좋다.
멀티쓰레드 환경에서
문자열의 변수의 추가/변경이
자주 발생하는 경우 사용하면 좋다.
단일쓰레드 환경에서
문자열의 변수의 추가/변경이
자주 발생하는 경우 사용하면 좋다.


💫 변환방법

① String을 StringBuffer/StringBuilder로 변환방법

  • String 객체를 StringBuffer/StringBuilder로 생성시 포함시키면 변환가능
String str1 = "안녕하세요.";

// String to StringBuffer
StringBuffer strToSb1 = new StringBuffer(str1);   // 안녕하세요.

// String to StringBuilder
StringBuilder strToSb2 = new StringBuilder(str1); // 안녕하세요.

② StringBuffer/StringBuilder 객체를 String으로 변환방법

  • String.valueOf() 혹은 .toString()을 사용하면 변환가능
// StringBuffer
StringBuffer sb3 = new StringBuffer("반갑습니다.");

// StringBuffer to String
String str3 = String.valueOf(sb3); // 반갑습니다.


// StringBuilder
StringBuilder sb4 = new StringBuilder("반갑습니다."); 

// StringBuilder to String
String str4 = String.valueOf(sb4); // 반갑습니다.


📚 참고 - 메서드

① StringBuffer 메서드

  • 반환타입 : StringBuffer
append(String str) : 문자열 끝에 추가
reverse() : 문자열 뒤집기
insert(int offset, String str) : 지정된 위치에 문자열 삽입
delete(int start, int end) : 지정된 위치에 문자열 삭제
replace(int start, int end, String str) : 지정된 위치에 문자열 대체
  • 반환타입 : String
substring(int start) : 시작 위치부터 끝까지 문자열 반환
substring(int start, int end) : 지정된 범위의 문자열 반환
toString() : 
  • 반환타입 : int
capacity() : 현재 용량 반환
length() : 문자열 길이 반환 //배열 => length
  • 반환타입 : void
ensureCapacity(int minimumCapacity) : 최소 용량 보장
setCharAt(int index, char ch) : 지정된 인덱스의 문자를 변경
  • 반환타입 : char
charAt(int index) : 지정된 인덱스의 문자를 반환

② StringBuilder 메서드

  • 반환타입 : StringBuffer/StringBuilder
append(String str) : 문자열 덧붙이기
append(char[] str) : 문자배열 덧붙이기
append(Object obj) : 객체 덧붙이기
append(boolean b) : boolean 값 덧붙이기
append(char c) : 문자 덧붙이기
append(int i) : int 값 덧붙이기
append(long lng) : long 값 덧붙이기
append(float f) : float 값 덧붙이기
append(double d) : double 값 덧붙이기
appendCodePoint(int codePoint) : 유니코드 코드포인트 값 덧붙이기
delete(int start, int end) : 지정된 범위의 문자 삭제
deleteCharAt(int index) : 지정된 위치의 문자 삭제
insert(int offset, String str) : 문자열 삽입
insert(int offset, char[] str) : 문자배열 삽입
insert(int offset, Object obj) : 객체 삽입
insert(int offset, boolean b) : boolean 값을 삽입
insert(int offset, char c) : 문자를 삽입
insert(int offset, int i) : int 값을 삽입
insert(int offset, long lng) : long 값을 삽입
insert(int offset, float f) : float 값을 삽입
insert(int offset, double d) : double 값을 삽입
insert(int dstOffset, CharSequence s) : CharSequence를 삽입
insert(int dstOffset, CharSequence s, int start, int end) : 지정된 범위의 CharSequence를 삽입
replace(int start, int end, String str) : 지정된 범위의 문자를 새 문자열로 대체
reverse() : 문자열 뒤집기
  • 반환타입 : String
substring(int start) : 지정된 시작 위치부터 문자열 끝까지 반환
substring(int start, int end) : 지정된 범위의 문자열 반환
  • 반환타입 : void
setCharAt(int index, char ch) : 지정된 위치의 문자 설정
setLength(int newLength) : 문자열 길이 설정
trimToSize() : 저장된 문자열 길이에 따라 버퍼 크기 조정

출처: https://adjh54.tistory.com/129#google_vignette
https://velog.io/@gates/JAVA-String-StringBuilder-StringBuffer%EC%9D%98-%EC%B0%A8%EC%9D%B4

profile
코딩이의 끄적끄적

0개의 댓글