Crystal에는 텍스트를 나타내는 데 사용하는 String이라는 타입이 있어요.
Crystal의 문자열은 유니코드 문자의 시퀀스예요.
문자열은 불변이에요. 즉, 한 번 만들면 바꿀 수 없어요.
그래서 문자열을 수정할 때마다 새로운 문자열이 만들어지고, 원본 문자열은 수정되지 않아요.
문자열을 정의할 때는 큰따옴표 "를 사용해요.
"Hello World"
두 문자열을 연결하려면 + 연산자를 사용해요.
+ 연산자는 두 문자열을 합친 새로운 문자열을 반환해요.
hello = "Hello"
hello + " World"
# => "Hello World"
to_i 메서드는 문자열을 정수로 변환해요.
또는 to_f 메서드로 실수를 반환받을 수도 있어요.
문자열을 숫자로 변환할 수 없으면 ArgumentError가 발생해요.
"1".to_i
# => 1
"1.0".to_f
# => 1.0
"Hello".to_i
# => ArgumentError: Invalid integer: Hello
정수나 실수는 to_s 메서드로 문자열로 변환할 수 있어요.
1.to_s
# => "1"
1.0.to_s
# => "1.0"
보간은 문자열을 합치고 문자열 안에 표현식을 넣는 편리한 방법이에요.
문자열을 보간하려면 # 문자 뒤에 중괄호 {}를 쓰고, 중괄호 안에 표현식을 넣어요.
name = "World"
"Hello #{name}!"
# => "Hello World!"
Crystal은 표현식의 결과를 자동으로 문자열로 변환해요.
"Hello #{1 + 1}!"
# => "Hello 2!"
문자열의 문자 수를 알아야 할 때는 size 메서드를 사용할 수 있는데, 이 메서드는 문자열의 길이를 정수로 반환해요.
문자열의 크기는 문자열에 저장된 속성이기 때문에, 메서드를 호출할 때마다 크기를 계산할 필요가 없어서 아주 빨라요.
"Hello World".size
# => 11
인덱싱은 문자열에서 특정 문자를 가져오고 싶을 때 사용해요.
String에서 문자를 가져오려면 익숙한 대괄호 표기법을 사용할 수 있어요.
[]는 String 인스턴스 메서드로 구현되어 있고, 인덱스가 이 메서드의 인자예요.
문자열의 첫 번째 문자는 인덱스 0에 있어요.
"Hello World"[0]
# => 'H'
"Hello World"[6]
# => 'W'
문자열의 끝에서 문자를 가져오려면, 문자열의 길이에서 1을 빼서 마지막 문자의 인덱스를 구할 수 있어요. 끝에서 두 번째 문자는 문자열의 길이에서 2를 빼면 되고, 이런 식이에요. 이걸 더 간단히 하는 방법도 있는데, 바로 음수 인덱스를 쓰는 거예요. 마지막 문자가 인덱스 -1이고, 끝에서 두 번째 문자가 인덱스 -2인 식이에요.
name = "Hello World"
name[name.size - 1]
# => 'd'
name[-1]
# => 'd'
어떤 문자는 문자열에 그대로 쓸 수 없어서 이스케이프 시퀀스를 사용해야 해요.
예를 들어 문자열 안에서 큰따옴표를 쓰고 싶다면, 큰따옴표를 이스케이프해야 해요.
\ 문자 뒤에 이스케이프할 문자를 붙여서 이스케이프 시퀀스를 쓸 수 있어요.
Crystal의 특수 문자는 다음과 같아요:
| 값 | 설명 |
|---|---|
\a |
경고음 |
\b |
백스페이스 |
\e |
이스케이프 |
\f |
폼 피드 |
\n |
줄 바꿈(새 줄) |
\r |
캐리지 리턴 |
\t |
가로 탭 |
\v |
세로 탭 |
\\ |
역슬래시 |
\' |
작은따옴표 |
\" |
큰따옴표 |
\377 |
8진수 ASCII 문자 |
\xFF |
16진수 ASCII 문자 |
\uFFFF |
16진수 유니코드 문자 |
puts "Hello \"World\""
# => Hello "World"
puts "Hello \nWorld"
# => Hello
# => World
여러 줄 문자열을 쓰려면 한 줄 문자열과 같은 문법을 사용하되, 문자열에 넣고 싶은 각 줄마다 줄을 바꿔 주면 돼요.
"Hello
World"
# => "Hello\nWorld"
옛날에 창문에 창살이 달린 이상한 집에 사는 별난 프로그래머가 있었어요. 어느 날 그는 온라인 구인 게시판에서 파티 로봇을 만드는 일을 맡았어요. 이 로봇은 사람들을 맞이하고 자리로 안내해야 해요. 첫 번째 버전은 매우 기술적이어서 프로그래머가 인간적인 상호작용에 서툴다는 점이 그대로 드러났어요. 그중 일부는 다음 버전에도 그대로 남았어요.
주어진 이름으로 환영 메시지를 반환하는 welcome 메서드를 구현해요:
PartyRobot.welcome("Christiane")
# => Welcome to my party, Christiane!
주어진 이름과 나이로 생일 메시지를 반환하는 happy_birthday 메서드를 구현해요.
아쉽게도 프로그래머가 허풍을 좀 떠는 편이라, 로봇은 모든 손님의 생일을 알고 있다는 걸 꼭 보여줘야 해요.
PartyRobot.happy_birthday("Frank", 58)
# => Happy birthday Frank! You are now 58 years old!
길을 안내하는 assign_table 함수를 구현해요.
이 함수는 매개변수 5개를 받아요.
String)Int)String)String)Float64)정확한 결과 형식은 아래 예시에서 볼 수 있어요.
옆자리 사람의 이름은 이름의 첫 글자와 마지막 글자로 줄여야 해요. Frank는 Fk, Christian은 Cn 이런 식이에요.
로봇은 테이블 번호를 알려줘요. 테이블까지의 거리도 알려주는데, 다행히도 정밀도는 소수점 한 자리로 제한돼요.
PartyRobot.assign_table("Christiane", "on the left", 27, 23.7834298, "Frank")
# =>
# Welcome to my party, Christiane!
# You have been assigned to table 27. Your table is on the left, exactly 23.8 meters from here.
# You will be sitting next to Fk.
Exercism에 가입하고 Crystal 트랙을 개념 26개연습 문제 142개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.