UI를 구현하다 보면 초기에는 화면을 빠르게 구성하는 데 집중하게 됩니다.
하지만 점차 가독성, 유지보수성, 그리고 다국어 대응까지 고려하게 되면서 문자열 처리 방식도 함께 정리할 필요가 있습니다.
이 글에서는 Text를 여러 개 사용하던 초기 구현에서
stringResource와 포맷 문자열을 활용하는 방식으로 개선한 과정을 정리합니다.
초기 구현: Text를 분리하여 문자열 구성
처음에는 아래와 같이 문자열과 숫자를 각각 Text로 나누어 표시하였습니다.
Row(modifier = Modifier.padding(8.dp)) {
Text(
text = "투입박스 ",
color = Color.White,
fontWeight = FontWeight.Bold,
fontSize = 18.sp,
)
Text(
text = toteNumber.toString(),
color = Color.White,
fontWeight = FontWeight.Bold,
fontSize = 18.sp,
)
}
한계점
- 문자열이 코드에 하드코딩되어 있습니다.
- 동일한 스타일의 Text가 반복됩니다.
- 다국어 대응이 어렵습니다.
- 표시해야 할 값이 늘어날수록 UI 코드가 복잡해집니다.
간단한 화면에서는 문제가 없지만,
실무 환경에서는 유지보수 측면에서 부담이 되는 구조입니다.
개선: stringResource와 포맷 문자열 사용
문자열을 strings.xml로 분리하고,
동적인 값은 포맷 문자열을 통해 전달하도록 구조를 변경하였습니다.
strings.xml
<string name="picking_input_box_with_tote_number">
투입박스 %1$s %2$d
</string>
Compose 코드
Row(modifier = Modifier.padding(8.dp)) {
Text(
text = stringResource(
R.string.picking_input_box_with_tote_number,
"test",
toteNumber
),
color = Color.White,
fontWeight = FontWeight.Bold,
fontSize = 18.sp,
)
}
출력 결과는 다음과 같습니다.
투입박스 test 3
%s와 %d의 의미
포맷 문자열에서 % 뒤의 문자는 전달받을 값의 타입을 의미합니다.
| 포맷 | 의미 | 예시 |
| %s | String(문자열) | "test", "ABC" |
| %d | Int(정수) | 1, 10, 100 |
| %f | Float / Double | 3.14 |
- %s는 문자열을 의미합니다.
- %d는 정수를 의미합니다.
타입이 일치하지 않을 경우 런타임 에러가 발생할 수 있으므로 주의가 필요합니다.
%1$s, %2$d의 의미
투입박스 %1$s %2$d
여기서 숫자는 전달되는 인자의 순서를 의미합니다.
- %1$s는 첫 번째 인자를 문자열로 사용합니다.
- %2$d는 두 번째 인자를 정수로 사용합니다.
stringResource(
R.string.picking_input_box_with_tote_number,
"test", // 첫 번째 인자 → %1$s
toteNumber // 두 번째 인자 → %2$d
)
인덱스를 명시해서 사용하는 이유
아래와 같이 인덱스를 생략하여 사용할 수도 있습니다.
투입박스 %s %d
그러나 실무에서는 인덱스를 명시하는 방식이 더 권장됩니다.
가독성 측면
문자열이 길어질수록 각 인자가 어디에 사용되는지 명확하게 파악할 수 있습니다.
다국어 대응 측면
언어에 따라 문장 구조와 단어 순서가 달라질 수 있습니다.
<!-- 한국어 -->
투입박스 %1$s %2$d
<!-- 영어 -->
Input box %2$d (%1$s)
같은 인자를 사용하면서도 언어별로 문자열 구조를 자유롭게 변경할 수 있습니다.
정리
- 초기에는 여러 개의 Text를 사용하여 문자열을 구성하였습니다.
- stringResource와 포맷 문자열을 사용하면서
- 코드가 간결해졌고
- 다국어 대응이 쉬워졌으며
- 유지보수성이 향상되었습니다.
핵심 내용은 다음과 같습니다.
- %s는 문자열을 의미합니다.
- %d는 정수를 의미합니다.
- %1$s, %2$d는 인자의 순서와 타입을 명시합니다.
반응형
'Android > Android Core' 카테고리의 다른 글
| [Android] 자주 사용하는 adb 명령어 정리 (0) | 2026.02.06 |
|---|---|
| [Android/Kotlin] Retrofit에서 인터페이스를 활용한 API 요청 처리 원리 (0) | 2025.03.12 |
| [Android/Kotlin] ViewModel 개념과 ViewModelStore를 통한 구성 변경 시 상태 유지 원리 (0) | 2025.03.10 |
| [Android] Activity 생명주기 정리 (0) | 2025.02.24 |
| [Android/Kotlin] 비상 사운드 효과 구현: 강제 볼륨 조절 (0) | 2024.12.13 |