트랙
/
Ruby
Ruby
/
연습 문제
/
로그 라인 파서
로그 라인 파서

로그 라인 파서

학습 연습 문제

소개

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>".

로그 레벨은 세 가지가 있어요:

  • INFO
  • WARNING
  • ERROR

과제가 세 개 있고, 각 과제는 로그 라인을 받아서 무언가를 하도록 요청해요. 이 과제들을 푸는 방법은 다양해요. 위 예시에서 마음에 드는 방법을 골라서 어떻게 풀어낼 수 있을지 한번 해봐요.

1. 로그 라인에서 메시지 가져오기

로그 라인의 메시지를 반환하도록 LogLineParser#message 메서드를 구현해요:

LogLineParser.new('[ERROR]: Invalid operation').message
# => "Invalid operation"

앞뒤의 공백은 제거해야 해요:

LogLineParser.new("[WARNING]:  Disk almost full\r\n").message
# => "Disk almost full"

2. 로그 라인에서 로그 레벨 가져오기

로그 라인의 로그 레벨을 반환하도록 LogLineParser#log_level 메서드를 구현해요. 로그 레벨은 소문자로 반환해야 해요:

LogLineParser.new('[ERROR]: Invalid operation').log_level
# => "error"

3. 로그 라인 재구성하기

로그 라인을 재구성하도록 LogLineParser#reformat 메서드를 구현해요. 메시지를 앞에 두고 그 뒤에 로그 레벨을 괄호 안에 넣어요:

LogLineParser.new('[INFO]: Operation completed').reformat
# => "Operation completed (info)"
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Ruby Exercism

로그 라인 파서 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Ruby 트랙을 개념 21개연습 문제 121개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.