Scala

Scala와 Java의 String interpolation(문자열 덧붙이기)

partner_jun 2017. 5. 27. 15:13

String Interpolation은 자주 쓰이고 유용한 구문이다. 대부분의 뷰 템플릿 엔진에서는 지원하고 있고, 당연하게 쓰이고 있다. 간단하게 설명하자면 문자열을 출력하거나 선언할 때 중간중간 다른 변수를 끼워넣는 구문이다. 


간단하게 예를 들자면 JSP에서

1
2
3
4
5
6
<% 
  String str1 = "Hello";
  String str2 = "World";
 %>
 
<span><%=str1%> <%=str2%></span>
cs

<%=변수명%> 으로 쓰는 바로 그 기능이다.



1. 스칼라에서의 String interpolation

val str1 = "Hello"
val str2 = "World"
val int1 = 100

val string = s"$str1 $str2 - $int1"

println(string) // Hello World - 100
// 값으로 선언해 사용할 수 있다.

println(s"${str1} World!") // Hello World!
// {}로 덧붙일 문자열을 구분할 수 있다.

println(s"$int1-$str2") // 100-World
// 타입 상관없이 사용할 수 있다.

스칼라의 String interpolation은 언어 자체에서 지원하는 기능으로 최근 사용되는 대부분의 뷰 템플릿 엔진에서처럼 $객체명 형식을 사용한다. 주의할 점은 s"..."로 문자열을 선언해야 한다는 점이다. 타입을 신경 쓰지 않아도 될 뿐더러, 같은 scope의 변수나 값을 쓸 때에는 {}를 생략하고 $ 기호만 사용하면 된다는 점은 아주 매력적이다.



2. 자바에서 String interpolation

자바의 String interpolation은 String.format() 메소드로 지원된다. 하지만 굉장히... 오래된 방식이다.

String str1 = "Hello";
String str2 = "World!";
int int1 = 2000;

String string = String.format("%s %s", str1, str2);
String string2 = String.format("%d-%s", int1, str2);

System.out.println(string); // Hello World!
System.out.println(string2); // 2000-World!

System.out.printf("%s%n%s%n", str1, str2); // Hello
// World!
// 줄 바꿈을 하려면 %n을 사용한다.
String ordString = String.format("%2$s %1$s", str1, str2); // 덧붙여질 문자열의 순서도 지정할 수 있다.
System.out.println(ordString); // World! Hello

String.format() 메소드로 새로운 문자열을 선언하거나, printf() 메소드로 콘솔에 출력할 수 있다.


타입을 신경써야 한다는 점과 사용할 변수를 파라미터로 주르륵 나열해야 한다는 점은 굉장히 불편하다. 덧붙일 문자열의 수가 많아졌을 때 순서를 신경써야 하기 때문이다. 개인적으로는 차라리 StringBuilder를 쓰는게 더 나은 경우가 많다고 생각한다.


안드로이드 역시 자바 기반이기 때문에, 위와 같은 방법으로 String interpolation을 지원한다. 조금 다른 점이라면 앱의 다양한 언어 지원을 위해 최대한 하드코딩을 지양하고(물론 어떤 프로그래밍 언어든 그렇게 하는게 좋지만) string.xml에 준비해둔 문자열을 사용한다는 것이다.