본문 바로가기
Android/Android Core

[Android/Kotlin]문자열 리소스 포맷(%s, %d, %1$s) 사용하기

by quessr 2026. 2. 3.

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는 인자의 순서와 타입을 명시합니다.
반응형