기록

[GPT가 알려주는] Kotlin CharSequence | String | CharArray 본문

잡동사니/GPT가 알려주는

[GPT가 알려주는] Kotlin CharSequence | String | CharArray

heylo 2025. 10. 21. 14:41

짧게 정리해볼게요.

한눈 요약

구분 정체 가변성 대표 구현/예시 주요 용도

CharSequence “문자 시퀀스” 인터페이스 구현체 따라 다름 String, StringBuilder, SpannableString, Editable(EditText) 파라미터 타입으로 범용 수용
String 불변 텍스트 클래스 불변(immutable) "Hello", name.toString() 일반 텍스트 데이터, Map key 등
CharArray 가변 문자 배열 가변(mutable) charArrayOf('A','B') 비밀번호 등 민감정보, 버퍼

핵심 차이

  1. 타입 성격
  • CharSequence: 길이/인덱스/부분시퀀스 같은 공통 연산만 약속하는 인터페이스.
    → Android의 EditText.getText()가 돌려주는 Editable도 CharSequence.
  • String: CharSequence의 대표 구현. 불변이라 스레드 안전하고 Map 키에 좋음.
  • CharArray: 배열(원시 타입 배열). CharSequence 아님. 인덱스 수정 가능.
  1. 가변성 & 안전성
  • String: 변경 불가 → 참조 공유/캐시/키로 안전.
  • CharArray: 값 덮어쓰기 가능 → 비밀번호처럼 사용 후 fill('*')로 지워 보안에 유리.
  • CharSequence: 구현체에 따라 다름 (String=불변, Editable/StringBuilder=가변).
  1. API 호환
  • 대부분의 “텍스트를 받는” API는 CharSequence 파라미터를 받음 → String, Editable, Spannable 등 모두 전달 가능.
  • 보관/저장은 보통 String으로 스냅샷(toString()) 떠서 저장.
  • 배열 연산/버퍼링은 CharArray.
  1. 연산 메서드
  • CharSequence: length, get(index), subSequence(start,end).
    Kotlin 확장으로 substring, isNullOrBlank 같은 함수도 많이 지원(반환은 보통 String).
  • String: substring, replace, split, toInt() 등 풍부한 텍스트 유틸.
  • CharArray: 배열 연산(size, 인덱스 할당, copyOf, sliceArray). substring 없음.
  1. 성능/메모리 팁
  • 많은 연결(+)은 StringBuilder(CharSequence 구현)로 누적 후 toString().
  • CharArray는 중간 버퍼로 효율적이고, 종료 시 덮어쓰기 가능.
  • String은 한 번 만들면 내용 변경 불가(쓰레드 안전, GC 시까지 남아 있을 수 있음).
  1. 동등성 비교(==) 함정
  • Kotlin에서 String의 ==는 내용 비교(OK).
  • CharArray의 ==는 참조 비교 → 내용 비교는 contentEquals(otherArray) 사용.
  • CharSequence끼리의 equals는 구현체에 따라 다를 수 있음 → 문자열 비교는 toString() 후 비교가 안전.

실제 개발에서 어떻게 쓰나

  • 함수 파라미터: 다양한 구현을 받고 싶다면 CharSequence로 받기
  • fun parseHex(input: CharSequence?): Int? = input?.toString()?.toIntOrNull(16)
  • 모델에 저장: 보통 String으로 저장 (스냅샷)
  • val s: String = editText.text.toString() // Editable(가변) → String(불변)
  • 민감 정보(비번, 토큰): CharArray
  • val pwd: CharArray = textInput.toCharArray() try { // 사용 } finally { pwd.fill('\u0000') // 메모리 덮어쓰기 }

변환 치트시트

// CharSequence ↔ String
val cs: CharSequence = editText.text      // Editable implements CharSequence
val s: String = cs.toString()

// String ↔ CharArray
val arr: CharArray = s.toCharArray()
val s2: String = String(arr)

// CharArray 내용 비교
if (arr.contentEquals(other)) { /* equal */ }

Android 맥락 팁

  • TextWatcher/doAfterTextChanged의 콜백 인자 s: Editable? → CharSequence.
    저장·파싱 전에는 toString() 해서 스냅샷을 만들 것.
  • SpannableString/SpannedString/Editable 모두 CharSequence.
    **스타일(span)**을 유지하려면 CharSequence로 다루고, 값만 필요하면 toString().

필요하면 네 코드 베이스의 함수 시그니처(파라미터/리턴)를 올려주면, 어디를 CharSequence, 어디를 String으로 둘지 구체적으로 정리해줄게!