본문 바로가기

Front End/Javascript

[JavaScript] 템플릿 리터럴(Template literals)

템플릿 리터럴은 내장된 표현식을 허용하는 문자열 리터럴입니다. 
여러 줄로 이뤄진 문자열과 문자 보간기능을 사용할 수 있습니다. 
이전 버전의 ES2015사양 명세에서는 "template strings" (템플릿 문자열) 라고 불려 왔습니다.
템플릿 리터럴은 이중 따옴표 나 작은 따옴표 대신 백틱(` `) 을 이용합니다.

 

여러줄의 문자열 사용하기

예전에는 여러 줄의 내용을 입력하려면 newline characters(\n)를 사용하여 입력하거나 +(문자열 결합 연산자)를 이용하여 사용했었습니다.

let multiLine1= "첫번째줄\n두번째줄\n세번째줄";
let multiLine2 = "첫번째줄\n";
multiLine2 += "두번째줄\n";
multiLine2 += "세번째줄\n";
 
하지만 템플릿 문자열을 사용하면 편리하게 입력이 가능합니다. 주의할 사항은 새로운 줄에 들여쓰기를 하면 들여쓰기까지 적용이 된다는것 입니다.
 
let multiLine= `첫번째줄
두번째줄
세번째줄
`;

 

template_literals_ex01.html 파일을 다음과 같이 만듭니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Template literals</title>
    <script>
        // `(BackTick, 백틱) 사용
        console.log(`\`` === "`"); // --> true
        console.log('-'.repeat(50));
 
        let line1 = '첫번째줄\n두번째줄\n세번째줄';
        let line2 = `첫번째줄
두번째줄
세번째줄
`;
        console.log(line1)
        console.log('-'.repeat(50));
        console.log(line2)
 
        document.write(line1);
        document.write(`<hr>`);
        document.write(line2);
        document.write(`<hr>`);
        document.write(line2.replaceAll('\n','<br>'));
 
    </script>
</head>
<body>
</body>
</html>
cs

 

실행 결과 입니다.

 

 

자바스크립트 표현식 사용

템플릿 리터럴은 이중 따옴표 나 작은 따옴표 대신 백틱(``) 을 이용합니다. 
템플릿 리터럴은 또한 플레이스 홀더를 이용하여 표현식을 넣을 수 있는데, 이는 $와 중괄호( $ {expression} ) 로 표기할 수 있습니다. 모든 표현 가능한 자바스크립트 코드를 사용가능합니다.

 

template_literals_ex02.html 파일을 다음과 같이 만듭니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Template literals</title>
    <script>
        let name='한사람';
        let age = 22;
        let gender = true;
 
        console.log(name + "(" + age + "세, " + (gender?"남자":"여자"+ ")");
        document.write(name + "(" + age + "세, " + (gender?"남자":"여자"+ ")<br>");
        console.log(`${name}(${age}세, ${gender ? "남자""여자"})`);
        document.write(`${name}(${age}세, ${gender ? "남자""여자"})<br>`);
        
    </script>
</head>
<body>
</body>
</html>
cs

 

실행 결과 입니다.

 

 

템플릿 문자열을 이용한 함수의 호출

백틱(`)은 함수를 호출할때도 쓰입니다. 
이전에는 함수를 호출할때 괄호( )를 이용해서 호출했습니다. 
함수를 호출할때 괄호 대신에 백틱을 사용해도 가능합니다. 
다만, 백틱(`)을 사용할 경우에는 매개변수가 문자열로 인식됩니다. 

 

template_literals_ex03.html 파일을 다음과 같이 만듭니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Template literals</title>
    <script>
        let fn = (x) => x + 1;
 
        console.log(fn(3));
        console.log(fn`3`);
        document.write(fn(3+ "<br>");
        document.write(fn`3+ "<br>");
 
        let isPositive = (x) => x == 0 ? '0' : x > 0 ? '양수' : '음수';
        console.log(isPositive(1));
        console.log(isPositive(0));
        console.log(isPositive(-1));
 
        document.write(`${isPositive`1`}<br>`);
        document.write(`${isPositive`0`}<br>`);
        document.write(`${isPositive`-1`}<br>`);
    </script>
</head>
<body>
</body>
</html>
cs

 

실행 결과 입니다.

 

()로 함수를 호출하면 숫자로 인식해서 "4"가 출력되는데 ``으로 호출하면 문자열로 인식해서 "31"이 출력됩니다.

템플릿 문자열 안의 표현식에서 `(backtick)을 사용해도 됩니다.

 

 

Nesting templates(템플릿의 중첩)

템플릿 리터럴을 중첩해서 사용이 가능합니다.
문자열을 중첩해서 사용하면 한결 처리가 쉽습니다.

 

template_literals_ex04.html 파일을 다음과 같이 만듭니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Template literals</title>
    <script>
        let isLargeScreen = false;
        let item = {}
        item.isCollapsed = true;
 
        // ES5
        let classes = "header ";
        classes += isLargeScreen
            ? ""
            : item.isCollapsed
                ? "icon-expander"
                : "icon-collapser";
 
        console.log(classes);
 
        // ES2015에서 중첩(nesting)없이 템플릿 리터럴 사용한 경우
        classes = `header ${isLargeScreen ? "" : item.isCollapsed ? "icon-expander" : "icon-collapser"}`;
        console.log(classes);
 
        // ES2015에서 중첩된(nested) 템플릿 리터럴을 사용한 경우
        item.isCollapsed = false;
        classes = `header ${isLargeScreen ? "" : `icon-${item.isCollapsed ? "expander" : "collapser"}`}`;
        console.log(classes);
    </script>
</head>
<body>
</body>
</html>
cs

 

실행 결과 입니다.

 

 

Tagged templates

template literals 의 더욱 발전된 한 형태는 tagged templates 입니다. 

템플릿문자열을 이용하여 함수를 호출하면 첫번째 매개변수에는 표현식이외의 문자열이 배열형태로 전달이되고 두번째부터의 매개변수에는 표현식들이 차례대로 전달이 됩니다. 

전개 연산자를 이용하여 표현식들을 배열로 받아도 됩니다.

 

template_literals_ex05.html 파일을 다음과 같이 만듭니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Template literals</title>
    <script>
        let person = '한사람';
        let age = 22;
        // 첫번째 매개변수에는 변수 이외의 값이 배열로 전달되고
        // 두번째 부터의 매개변수에는 템플릿 리터럴의 표현식이 차례로 전달됩니다. 
        function transform1(strings, personExp, ageExp) {
            console.log('-'.repeat(60));
            console.log(`strings[0] : [${strings[0]}]`);
            console.log(`strings[1] : [${strings[1]}]`);
            console.log(`strings[2] : [${strings[2]}]`);
            console.log(`personExp : [${personExp}]`);
            console.log(`ageExp : [${ageExp}]`);
            console.log('-'.repeat(60));
            return strings[0+ personExp + strings[1+ ageExp + strings[2]
        }
 
        let result = transform1`반갑습니다!! ${person}씨의 나이는 ${age}세입니다.`;
        console.log(`결과 : ${result}`);
        // 
        function transform2(staticData, ...dynamicData) {
            console.log('-'.repeat(60));
            console.log(`staticData : [${staticData}]`);
            console.log(`dynamicData : [${dynamicData}]`);
            console.log('-'.repeat(60));
            return staticData[0+ dynamicData[0+ staticData[1+ dynamicData[1+ staticData[2]
        }
        result = transform2`반갑습니다!! ${person}씨의 나이는 ${age}세입니다.`;
        console.log(`결과 : ${result}`);
    </script>
</head>
<body>
</body>
</html>
cs

 

실행 결과 입니다.

 

 

 

Raw strings

태그 지정된 템플릿의 첫 번째 함수 인수에서 사용할 수있는 특별한 raw property을 사용하면 
escape sequences 처리하지 않고 원시 문자열을 입력 한대로 액세스 할 수 있습니다.


let path = "c:\\path\\path2\\file.txt";


path = String.raw`c:\path\path2\file.txt`;

 

template_literals_ex06.html 파일을 다음과 같이 만듭니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Template literals</title>
    <script>
        let path = "c:\\path\\path2\\file.txt";
        console.log(path);
        path = String.raw`c:\path\path2\file.txt`;
        console.log(path);
    </script>
</head>
<body>
</body>
</html>
cs

 

실행 결과 입니다.