Ruby에서는 모든 것이 그렇듯, String도 객체예요.
문자열은 임의의 바이트 시퀀스(보통은 문자)로 이루어져 있고, 다른 객체와 똑같이 초기화하고 다룰 수 있어요.
사실 Ruby의 가장 유용한 점 중 하나는 문자열(그리고 다른 객체)에서 호출할 수 있는 수많은 메서드 덕분에 코드를 작성하는 시간을 많이 아낄 수 있다는 거예요.
이 연습 문제에서는 그런 도우미 메서드 몇 가지를 살펴보고 직접 가지고 놀아볼 거예요.
String.new(...)로 문자열을 만들 수도 있지만, 훨씬 흔한 방법은 리터럴을 사용하는 거예요.
사용할 수 있는 리터럴은 아주 다양하고, 크게 두 가지로 나뉘어요. 보간을 허용하는 것과 그렇지 않은 것이에요.
가장 흔한 리터럴은 작은따옴표와 큰따옴표('...'와 "...")예요.
작은따옴표는 보간을 허용하지 않지만, 큰따옴표는 허용해요.
보간이란 #{} 문법을 사용해 한 문자열을 다른 문자열 안에 넣는 것을 말해요.
# Use single quotes when not interpolated
location = 'World'
# And double quotes when interpolated
puts "Hello, #{location}!" #=> "Hello, World!"
%{... }처럼 보간되는 문자열을 위한 리터럴이나 %q{...}처럼 보간되지 않는 문자열을 위한 리터럴도 사용할 수 있어요.
이런 리터럴은 문자열 안에 '나 " 문자가 들어 있을 때 유용해요.
참고: 문자열에 보간이 들어 있지 않다면 꼭 보간되지 않는 문자열을 써야 한다는 절대적인 규칙은 없어요.
Ruby의 문자열은 배열을 생각하는 방식과 비슷하게 생각하면 도움이 돼요.
문자열에는 크기가 있고, 각 문자에는 인덱스가 붙어 있어요(첫 번째 인덱스는 0이에요):
my_string = "Some string"
my_string.size #=> 11
my_string[0] #=> 'S'
my_string[1] #=> 'o'
my_string[-1] #=> 'g'
# Find the first index of a character
my_string.index('m') #=> 2
문자열의 일부분은 인덱스나 slice를 사용해 추출할 수 있어요:
my_string = "Some string"
# Find three characters starting with the second character (index 1)
my_string[1, 3] #=> "ome"
my_string.slice(1, 3) #=> "ome"
문자열의 실제 값도 다룰 수 있어요. Ruby 문서를 살펴보면서 모든 메서드를 익혀볼 만하지만, 여기 자주 쓰이는 몇 가지 예를 들어볼게요:
"hello".capitalize #=> "Hello"
"HELLO".downcase #=> "hello"
"hello".center(9) #=> " hello "
" hello ".strip #=> "hello"
"hello world".split(" ") #=> ["hello", "world"]
gsub 같은 메서드를 사용해 문자를 바꿀 수도 있어요:
# Replace one character with another
"noob".gsub("o","0") #=> "n00b"
# (Advanced) Replace a regular expression
"Ruby really rocks".gsub(/[aieou]/,'') #=> "Rby rlly rcks"
위의 모든 예에서는 새로운 String이 반환돼요.
하지만 많은 메서드에는 !로 끝나는, 문자열 자체를 실제로 수정하는 짝이 있어요.
# Use normal methods to return new strings
my_string = "hello"
my_string.capitalize #=> "Hello"
puts my_string #=> "hello"
# And bang-methods (...!) to modify the object
my_string = "hello"
my_string.capitalize! #=> "Hello"
puts my_string #=> "Hello"
이번 연습 문제에서는 로그 라인을 처리해요.
각 로그 라인은 다음과 같은 형식의 문자열이에요: "[<LEVEL>]: <MESSAGE>".
로그 레벨은 세 가지가 있어요:
INFOWARNINGERROR과제가 세 개 있고, 각 과제는 로그 라인을 받아서 무언가를 하도록 요청해요. 이 과제들을 푸는 방법은 다양해요. 위 예시에서 마음에 드는 방법을 골라서 어떻게 풀어낼 수 있을지 한번 해봐요.
로그 라인의 메시지를 반환하도록 LogLineParser#message 메서드를 구현해요:
LogLineParser.new('[ERROR]: Invalid operation').message
# => "Invalid operation"
앞뒤의 공백은 제거해야 해요:
LogLineParser.new("[WARNING]: Disk almost full\r\n").message
# => "Disk almost full"
로그 라인의 로그 레벨을 반환하도록 LogLineParser#log_level 메서드를 구현해요. 로그 레벨은 소문자로 반환해야 해요:
LogLineParser.new('[ERROR]: Invalid operation').log_level
# => "error"
로그 라인을 재구성하도록 LogLineParser#reformat 메서드를 구현해요. 메시지를 앞에 두고 그 뒤에 로그 레벨을 괄호 안에 넣어요:
LogLineParser.new('[INFO]: Operation completed').reformat
# => "Operation completed (info)"
Exercism에 가입하고 Ruby 트랙을 개념 21개연습 문제 121개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.