String클래스

  • 문자열을 다루기 위한 클래스.
  • String클래스 = 데이터(char[]) + 메서드(문자열 관련)

특징

  • 내용을 변경할 수 없는 불변(immutable) 클래스
  • 문자열 연산시 새로 객체를 만드는 Overhead 발생(성능이 떨어진다.)
  • 문자열의 결합이나 변경이 잦다면, 내용을 변경가능한 StringBuffer, StringBuilder를 사용

문자열 비교

String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = new String("abc");

  • str1 ,str2 는 문자열 abc를 가리킨다.
  • str3, str4 는 각각의 인스턴스를 가리킨다.
  • 문자열 리터럴로 문자열을 생성 시
    • 하나의 문자열을 여러 참조변수가 공유한다.
  • new 연산자를 사용 시
    • 항상 새로운 문자열이 만들어진다.
  • 문자열은 내용변경이 불가하기 때문에 여러 참조변수가 공유해도 문제가 생기지 않는다.
  • 문자열 변수는 "==" 연산자로 비교 시 주소를 비교하기 때문에 값을 비교하기 위해선 equals함수를 써야한다.

문자열 리터럴

  • 문자열 리터럴은 프로그램 실행시 자동으로 생성된다.(constant pool에 저장)
  • constant pool
    • 프로그램에 있는 모든 상수를 저장하는 곳
  • JVM은 문자열 상수 풀에 객체를 생성하고 해당 참조를 스택에 저장한다.
  • JVM은 문자열 상수 풀에 리터럴의 복사본을 하나만 저장하여 문자열에 할당된 메모리 양을 최적화 할 수 있다.
    • interning 이라고함!
    • String변수를 만들고 값을 할당하면 JVM이 상수풀에서 동일한 String을 검색하고, 발견되면 메모리 주소값을 반환하고 그렇지 않으면 풀에 등록하고(interning) 해당 주소값을 반환한다.

StringBuffer클래스, StringBuilder클래스

  • 공통점
    • new 연산으로 클래스를 한 번만 만듬 (Mutable)
    • 문자열 연산시 새로 객체를 만들지 않고, 크기를 변경시킴
    • StringBuffer와 StringBuilder 클래스의 메서드가 동일함.
  • 차이점
    • StringBuffer는 동기화되어 있다. 멀티 쓰레드에 안전함
    • StringBuilder는 동기화 되어 있지 않아서. 멀티 쓰레드에 안전하지 않음.
    • 멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요한 성능저하를 일으킨다. 그럴때 StringBuilder를 쓰자.

'Computer science > JAVA' 카테고리의 다른 글

Casting  (0) 2023.01.01
Object Class  (0) 2023.01.01
Serialization(직렬화)  (0) 2022.12.25
오토 박싱 & 오토 언박싱  (0) 2022.12.25
Primitive type & Reference type  (0) 2022.12.24

+ Recent posts