Post

[Java] 문자열 관련 클래스 정리

String


  • 문자들의 집합을 표현하는 객체
  • 자바에서 String불변(immutable) (내용 변경❌)
  • 리터럴 Hello 자체도 String 객체

    1
    
      String s = "Hello";
    

불변성의 의미

1
2
String a = "Hello";
a = a + " World";
  • 위 코드는 실제로 "Hello World" 라는 새로운 String 객체를 생성한다.
  • 기존 "Hello" 는 변하지 않고 문자열 변경 후 새로운 객체가 생성되는 것

❓ 왜 불변해야 할까?

  • 보안성: 민감한 문자열(비밀번호 등) 변경 불가
  • 스레드 안정성: 동기화 없이도 안정적
  • String Pool 활용 가능

String Pool

1
2
3
4
5
6
7
8
9
10
11
12
13
// 객체 생성 (Heap 영역)
String a = new String("Java");

// 리터럴 (String Pool)
String b = "Java";
String c = "Java";

// 주소값을 비교
System.out.println(a == b); // false
System.out.println(b == c); // true

// 순수 문자열을 비교할땐 equals 를 사용
System.out.println(a.equals(b)); // true

String Pool

메서드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
String s = " Hello Java ";

// 앞뒤 공백 제거
s.trim(); // "Hello Java"

// 대/소문자 변환
s.toUpperCase(); // " HELLO JAVA "
s.toLowerCase(); // " hello java "

// 부분 문자열 추출
s.substring(1, 6); // "Hello"

// 포함 여부
s.contains("Java"); // true

// 문자 치환
s.replace("Java", "World"); // " Hello World "

// 문자열 분리
String[] split = "Hello".split(""); // ["H", "e", "l", "l", "o"]
String[] fruits = "apple,banana,orange".split(","); // ["apple", "banana", "orange"]

// 문자열 길이
s.length(); // 12

// 특정 인덱스 문자 가져오기
s.charAt(1); // 'H'

// 시작/끝 문자열 확인
s.startsWith(" H"); // true
s.endsWith("a "); // true

StringBuffer


  • 문자열을 자주 수정해야 하는 상황일 때 주로 사용
  • String 과 달리 값 변경이 가능
  • 멀티스레드 환경에서 안전
  • 기본적으로 16개 문자의 저장공간을 가짐
  • 메모리 낭비가 없음

생성 방법

1
2
3
StringBuffer sb1 = new StringBuffer(); // 16의 공간
StringBuffer sb2 = new StringBuffer("Hello"); // 문자열 길이 + 16
StringBuffer sb3 = new StringBuffer(100); // 초기 버퍼 크기 설정

메서드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
StringBuffer sb = new StringBuffer("Hello");

// 문자열 뒤에 추가
sb.append(" World"); // Hello World

// 특정 위치에 삽입
sb.insert(5, ","); // Hello, World

// 부분 문자열 교체
sb.replace(0, 5, "Hi"); // Hi, World

// 범위 삭제
sb.delete(3, 4); // Hi,World

// String 으로 변환
sb.toString(); // "Hi,World"

// 문자열 뒤집기
sb.reverse(); // dlroW,iH

StringBuider


  • StringBuffer 와 동일한 기능
  • 하지만 차이점은 단일 스레드 환경에서 사용
  • 성능이 가장 빠름

CharSequence


  • CharSequenceString, StringBuilder, StringBuffer 등 모든 문자열 클래스들의 공통 조상인 인터페이스이다.
  • Integer.parseInt 등의 메서드에 인자 타입으로 보통 사용된다.