String s = "hello";
s = s + " world"; // 새 String 객체 생성
StringBuilder sb = new StringBuilder();
sb.append("hello");
sb.append(" world");
String result = sb.toString();
CharSequence는 char 값들의 읽기 전용 시퀀스. char 타입 및 Character 객체는 유니코드 기반. 유니코드는 16비트의 고정된 길이의 문자를 정의.U+0000 ~ U+10FFFF. char에 의존 중. 확장 코드를 지원하는 방법이 필요하여 보조 문자 + 서로게이트 페어 도입. 즉, char 값은 BMP(Basic Multilingual Plane)에 속한 문자이거나 서로게이트(surrogate)를 나타냄.U+0000 ~ U+FFFF 범위를 가지며 char 하나 = 문자 하나. 대부분의 일반 문자 포함U+10000 이상. 이모지 대부분, 특수 기호 등이 포함. char[], String, StringBuffer 에서 UTF-16 인코딩을 사용. char 하나로는 표현 불가. char 두 개(서로게이트 페어)로 표현. 첫 번째상위 서로게이트 (\uD800 ~ \uDBFF), 두 번째 하위 서로게이트 (\uDC00 ~ \uDFFF). char)은 2개임. 상위 서로게이트와 하위 서로게이트 (Low Surrogate)가 순서대로 붙어야 하나의 문자가 됨//high나 low 단독으로는 의미 없음
//UTF-16 파서가 BMP 문자가 아니라 보조 문자의 일부임을 즉시 파악 가능하기 때문
String s = "😀";
char high = s.charAt(0);
char low = s.charAt(1);
char은 BMP 문자 또는 서로게이트 코드 유닛을 표현하는 UTF-16의 코드 유닛. char만 받는 메서드는 보조 문자를 지원하지 않음, 서로게이트 값은 정의되지 않은 문자로 처리. //단독으로는 의미 없고, 문자열에서 하위 서로게이트와 쌍을 이뤄야 실제 문자가 됨
Character.isLetter('\uD840') // false
U+10FFFF까지)//실제로 하나의 문자를 의미
Character.isLetter(0x2F81A) // true
equals와 hashCode 메서드의 일반적인 계약을 정의하거나 보장하지 않음CharSequence를 구현한 두 객체를 비교했을 때의 결과는 일반적으로 정의되어 있지 않음CharSequence를 구현했을 수 있고 각 클래스가 서로 다른 구현체 간의 동등성 비교를 지원한다는 보장이 없기 때문CharSequence 객체를 Set의 요소나 Map의 key로 사용하는 것은 부적절CharSequence의 char 값들을 그대로 int로 변환해서 스트림으로 반환. 각 요소 = UTF-16 코드 유닛. 서로게이트도 그냥 char 하나로 처리되어 보조 문자 분해됨.
String s = "A😀B";
[A][\uD83D][\uDE00][B]
s.chars() 결과로는
65
55357 (상위 서로게이트)
56832 (하위 서로게이트)
66
즉, 이모지가 둘로 쪼개짐. 서로게이트 값이어도 그냥 그대로 넘겨서 보조 문자로 합치지 않음. 스트림 생성 시점이 아니라 최종 연산(forEach 등) 시작 시점에 실제 데이터에 연결됨. mutable한 경우 도중 변경하면 결과 정의 안 됨
CharSequence의 실제 유니 코드 포인트 단위로 스트림을 반환함. 서로게이트 페어를 만나면 Character.toCodePoint()처럼 합쳐서 하나로 처리
String s = "A😀B";
s.codePoints() 결과로는
65
128512 (😀)
66
즉, 위+하위가 연속되면 합쳐서 하나의 코드 포인트로 만듦. BMP 문자, 짝 없는 서로게이트, 이상한 값은 그냥 int로 변환하여 넘김. 스트림 생성 시점이 아니라 최종 연산(forEach 등) 시작 시점에 실제 데이터에 연결됨. mutable한 경우 도중 변경하면 결과 정의 안 됨
chars()codePoints()setText(CharSequence text)가 있다면 호출하는 쪽에서 String, StringBuilder, SpannableString 중 어떤 걸 넘겨도 됨. API 확장성 증가
안드로이드 UI 텍스트는 스타일 정보 포함 가능. 예시로 글자색 일부만 변경, 클릭 가능한 텍스트, 굵기/밑줄/이미지 포함. String으로는 처리 불가능하고 SpannableString 같은 CharSequence 구현체로 처리함.
TextView.setText(CharSequence text)
이미 CharSequence인 데이터를 굳이 toString()으로 복사하지 않아도 됨.
메모리 절약되고 GC 부담이 감소되는데 이는 안드로이드에서 중요.
StringStringBuilderStringBuffer| 항목 | String | StringBuilder | CharSequence |
|---|---|---|---|
| 타입 | 클래스 | 클래스 | 인터페이스 |
| 변경 가능 | 불가 | 가능 | 구현체에 따라 다름 |
| 성능 | 읽기 좋음 | 수정 빠름 | 목적 아님 |
| 안드로이드 핵심 | 기본 텍스트 | 문자열 조립 | UI 텍스트 표준 |
StringStringBuilderCharSequence참고: Chat GPT, https://developer.android.com/