ahlight
개발 저장소
ahlight
전체 방문자
오늘
어제
  • 분류 전체보기 (197)
    • Java (7)
    • Spring (5)
    • JPA (2)
    • JavaScript (0)
    • Computer Science (12)
      • 디자인패턴, 프로그래밍 패러다임 (1)
      • 네트워크 (4)
      • 운영체제 (4)
      • 데이터베이스 (3)
      • 자료구조 (0)
    • 알고리즘 (1)
    • 프로그래머스 (13)
    • 백준 (94)
    • 서평 (3)
    • 회고 (1)
    • TIL (58)
    • 기타 (1)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 넥스트스텝
  • 라즈베리파이4 #홈서버 #포트포워딩 #dhcp
  • Java
  • 클린코드
  • TDD

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ahlight

개발 저장소

String vs StringBuffer vs Stringbuilder
Java

String vs StringBuffer vs Stringbuilder

2022. 11. 1. 22:25

1. 배경

  • 문자열을 다루는 대표적인 3개의 클래스.
  • 평소에 3개의 클래스들에 대한 차이를 헷갈려했는데 오늘 공부중에 관련내용이 나와 이참에 확실하게 차이점을 공부하려한다.

 

2. 주요 차이점

  • String <->StringBuffer/StringBuilder 클래스들의 가장 큰 차이는 변경가능여부이다. 한번 생성된 String인스턴스가 갖고 있는 문자열은 read only, 변경 불가능(immutable) 클래스이다.
  • StringBuffer <->StringBuilder의 차이는 동기화 여부에 따른다. StringBuffer는 동기화를 지원해 멀티쓰레드에 안전하도록 되있기에 멀티쓰레드 환경이 아닌 경우 동기화는 불필요하게 성능을 낮춘다. 단일쓰레드에선 Builder클래스가 더 유리하다.

3. 예시

  • String클래스

위 코드와 같이 문자열 결합시 인스턴스내의 문자열이 바뀌는 것이 아닌 새로 결합된  문자열을 담는 String인스턴스가 새로 생성된다. 연산시 마다 새로운 문자열을 가진 String 인스턴스가 생성되기에 메모리공간을 낭비하게 된다.

  • StringBuffer/StringBuilder

a. append()는 반환타입이 StringBuffer이며 자신의 주소를 반환한다.

b. 위 코드와 같이 sb에 새로운 문자열이 추가되고 자기 주소를 반환해 sb2에는 sb의 주소가 저장된다.

c. 그러므로 sb, sb2를 출력하면 값이 동일하다.

d. 추가적으로 append().append()의 방식으로 연속호출이 가능하다.

 

4. 정리

String 1. 문자열 연산이 적거나 간단한 경우
2. 멀티쓰레드 환경에 유리
문자열 연산, 변경 시 해당 인스턴스의 값이 변경되는 것이 아닌 새로운 인스턴스를 생성하므로 잦은 연산 발생 시 메모리낭비가 우려된다.
StringBuffer 1. 문자열 연산이 많은 경우 
2. 멀티쓰레드 환경에 유리
객체 생성시 값을 입력하지 않으면 기본 16개의 길이를 가진 배열로 생성된다. 문자열 변경 시 해당 배열에 추가됨.
StringBuilder 1. 문자열 연산이 많은 경우
2. 싱글쓰레드 환경에 유리
상동

 

5. 추가

String의 메모리 할당 방식에 대해서도 궁금한 점이 생겼다. 일단 아래 블로그에서 가볍게 공부를 하고 추후 자세한 내용을 포스팅 해보자

https://medium.com/@joongwon/string-%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0-57af94cbb6bc

 

Java String 의 메모리에 대한 고찰

Java 언어에서 String은 무심코 사용되는 클래스 중에 하나가 아닐까 생각이 든다. String은 두 가지 생성 방식이 있고 각각의 차이점이 존재한다.

medium.com

 

'Java' 카테고리의 다른 글

Java - List의 제네릭 타입이 달라도 오버로딩은 불가하다.  (0) 2023.10.03
Java - List vs Map  (0) 2023.09.21
Java - 서블릿과 서블릿 컨테이너  (0) 2023.07.08
Java - 얕은 복사 vs 깊은 복사(shallow copy vs deep copy)  (0) 2022.12.07
Java 입력방법 2가지  (0) 2022.09.01
    'Java' 카테고리의 다른 글
    • Java - List vs Map
    • Java - 서블릿과 서블릿 컨테이너
    • Java - 얕은 복사 vs 깊은 복사(shallow copy vs deep copy)
    • Java 입력방법 2가지
    ahlight
    ahlight

    티스토리툴바