티스토리 뷰

#1> 개요


코틀린에서는 문자열 템플릿(String Template)이라는 식(Expression)을 통해 자바 스타일의 코드보다 간편하게 원하는 문자열을 생성할 수 있습니다. 이 문자열 템플릿이 강력한 이유는 말 그대로 식을 포함할 수 있기 때문입니다. 이게 무슨 의미일까요? 저와 같이 아래 내용을 살펴보시면 이해하실 수 있을 겁니다.

 

실제 프로젝트를 진행하면서 문자열을 출력하는 경우는 크게 아래와 같이 3가지 경우로 나눌 수 있습니다.

  1. 디버깅을 위한 로그 출력
  2. 사용자에게 보여지는 View에 의미있는 정보 출력
  3. Json과 같은 xml 포멧을 가진 프로토콜을 사용하는 데이터 통신

위와같은 Case에서 우리는 원하는 문자열을 생성하기 위해 여러 방법을 사용합니다. 우선 자바 스타일의 문자열 생성 방식에 대해 살펴보고 본문의 주제인 코틀린의 문자열 템플릿의 활용법과 장점을 알아보겠습니다.

 

까쯔아!!!.gif

 

 

#2> Java Style의 문자열 생성


보통 자바에서 문자열을 생성하는 경우는 아래와 같은 방식을 사용합니다.

package com.tistory.manorgass;

import java.util.Locale;

public class StringTemplate {
    private static final String TAG = "StringTemplate";

    public static void main(String[] args) {
        int size = 30;
        String method_1 = "" + size;
        String method_2 = Integer.toString(size);
        String method_3 = String.format(Locale.KOREA, "%d", size);
        System.out.println(TAG + " :: method_1 : " + method_1);
        System.out.println(TAG + " :: method_2 : " + method_2);
        System.out.println(TAG + " :: method_3 : " + method_3);
    }
}

> method_1

형 변환을 사용한 트릭입니다. String Type이 아닌 변수 앞에 쌍따옴표 ("") 를 입력해 강제로 타입을 변환해 문자열을 생성합니다. 간단한 숫자와 같은 데이터를 문자열로 생성할 때 자주 사용합니다.

 

> method_2

원시타입의 Class의 Parser를 이용한 방식입니다. 본 예제에서는 size 변수가 int 타입이기 때문에 Integer Class의 toString 메서드를 사용했으나, double이나 float인 경우는 Double.toString 혹은 Float.toString 메서드를 사용해야 합니다.

 

> method_3

String.format 메서드를 활용한 방식입니다. 쌍따옴표 안에 %conversion 형태로 해당 위치에 올 변수 표현방식을 나타내며 conversion에는 s(String: 문자열), d(int: 정수), x(hex: 16진수), o(octet: 8진수), f(실수) 등이 있습니다. 이 방식은 복잡한 식이나 변수가 많은 경우 편리합니다. 또한 위 예제의 첫번째 parameter인 Locale(Option) 을 통해 지역에 따른 올바른 표기법으로 자동으로 바꿔준다는 장점이 있습니다.

 

위 3가지 메서드의 출력 결과는 아래와 같습니다.

StringTemplate :: method_1 : 30
StringTemplate :: method_2 : 30
StringTemplate :: method_3 : 30

위와 같은 방식으로 우리는 얼마든지 원하는 문자열을 만들어 낼 수 있습니다. 하지만 코틀린은 보다 세련된 방법을 제시합니다.

 

 

#3> Kotlin String Template


#2 섹션에서 말씀드린 이런 편리한 자바 스타일의 문자열 생성 방식에도 불편함을 느낀 사람이 하나 둘 생겨났습니다. 하지만,우리는 답을 찾아냅니다. 늘 그랬듯이.

출처: 영화 인터스텔라

 

> 표현식의 시작을 알리는 달러기호 $

문자열 템플릿의 표현식은 달러 기호로 시작합니다. 쌍 따옴표("") 안에서 이 기호로 시작하는 식이나 변수는 자동으로 문자열과 연결됩니다.

package com.tistory.manorgass

const val TAG = "StringTemplate"

fun main() {
    val size = 30
    println(TAG + " :: java style " + size)
    println("$TAG :: kotlin style $size")
}

위 코드는 자바 스타일과 코틀린 문자열 템플릿을 비교한 예제입니다. dollar sign이 들어간 표현식은 IntelliJ IDE가 자동으로 캐치해 하이라이트 처리를 해주기 때문에 가독성 면에서도 꽤 괜찮습니다.

단, 여기서 주의해야 할 점은 $(dollar sign) 뒤에 바로 문자(character)를 입력하는 경우 점(.)이나 쉼표(,) 같은 기호나 공백이 나오기 전 까지는 변수 이름으로 처리한다는 점입니다. 

val size = 30
println("$TAG :: 크기는 $size입니다")
println("${TAG} :: 크기는 ${size}입니다")

이런 경우를 대비해 표현식은 중괄호로 감싸주는 습관을 들이는 것이 좋습니다. 위 코드 스니펫에 오류가 없어 보일지 모르지만, 실제 IDE에서는  size입니다  를 변수 이름으로 처리해 애러가 발생합니다.

IntelliJ IDE 에서 오류를 뱉는 모습 (퉤)

 

> 식(expression)의 활용

문자열 템플릿의 가장 멋진점은 바로 식(expression)이라는 점입니다. 즉, 중괄호 안에 입력한 연산을 수행함은 물론이고, 함수 호출까지 가능하기 때문입니다.

const val TAG = "StringTemplate"

fun main() {
    val radius = 23
    println("반지름이 ${radius}인 원의 지름은 ${radius * 2}이고, 넓이는 ${evalCircleArea(radius)}입니다")
    //반지름이 23인 원의 지름은 46이고, 넓이는 1661.9025137490005입니다
}

fun evalCircleArea(radius: Int) = radius * radius * Math.PI

어떤가요? Java Style의 문자열 생성방식보다 훨씬 가독성이 좋지요? 알면 알수록 코틀린은 참 편리하고 세련됬다는 생각이 듭니다.

 

> dollar sign 자체를 표현하는 방법 : escape 문자 활용

달러 기호는 문자열 템플릿 식의 접두어(prefix)로 인식하기 때문에 출력되지 않습니다. 그럼 금액을 표현하기 위해 $기호를 문자열에 포함되게 하려면 어떻게 해야할까요? 아래 2가지 방법이 있습니다.

val method_1 = "\$9,000" // $9,000
val method_2 = "${"$9,000"}" // $9,000

첫번째 방법과 같이 escape 문자인 역슬래시를 사용해 prefix가 아닌 달러기호 자체로 인식하게 하거나, 두번째 방법처럼 표현식 안에 문자열을 넣는 형태로 $ 기호 자체를 표현할 수 있습니다.

 

 

#4 > 마치며


이번 포스팅에서는 코틀린이라는 젊은 언어에서 제공하는 문자열 템플릿에 대해 살펴보았습니다. 문자열은, 당연하게도, 정말 자주 사용되는 데이터 타입입니다. 문자열 템플릿 이라는 옵션을 통해 상황에 따라 적합한 형태로 문자열을 생성할 수 있다는 점이 상당히 매력적인 것 같습니다. 글 끝까지 읽어주셔서 감사합니다.

 

요즘 코로나 때문에 전국적으로 상황이 안좋습니다. 다들 건강 유의하세요!

 

코틀린 기초 시리즈는 도서 『Kotlin in Action, Svetlana Isakova』을 참고해 작성되었습니다.

 


 

광고 클릭, 하트, 댓글은 필자에게 큰 힘이 됩니다!

 

댓글