[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
메서드
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
CharSequence는String,StringBuilder,StringBuffer등 모든 문자열 클래스들의 공통 조상인 인터페이스이다.Integer.parseInt등의 메서드에 인자 타입으로 보통 사용된다.
