리터럴(Literal): Ruby에서 값을 그대로 쓰는 문법
리터럴(Literal): Ruby에서 값을 그대로 쓰는 문법
Ruby에서는 값 하나를 코드에 직접 적어 넣는 일이 아주 흔해요. 숫자, 문자열, 배열, 해시 같은 값을 소스 안에 문자 그대로 써 놓은 걸 리터럴(literal) 이라고 해요. 리터럴을 이해하면 '이 값은 코드에서 어떻게 표현되지?' 하는 궁금증이 대부분 풀려요. 이번에는 Ruby가 제공하는 주요 리터럴을 하나씩 살펴볼게요.
출처: 공식문서 - Literals
본문
불 값과 nil 리터럴
nil과 false는 둘 다 거짓 값이에요. nil은 주로 "값이 없다"거나 "모른다"는 뜻으로 쓰는데, 조건식 안에서는 false로 평가돼요. true는 참 값이고요, nil과 false를 제외한 모든 객체는 조건식에서 참으로 평가돼요.
if nil
puts "실행되지 않아요"
end
숫자 리터럴
정수 리터럴은 십진수뿐 아니라 여러 진법으로도 쓸 수 있어요. 아래 숫자들은 모두 십진수 170과 같은 값이에요.
0d170
0D170
0xaa
0xAa
0xAA
0Xaa
0XAa
0XaA
0252
0o252
0O252
0b10101010
0B10101010
자릿수를 읽기 쉽게 하려고 밑줄(_)을 쓰는 것도 가능해요.
부동소수점(실수) 리터럴도 다양한 표기법을 지원해요. 아래는 모두 같은 값 12.34예요.
12.34
1234e-2
1.234E1
유리수(rational) 리터럴은 r 접미사로 써요. 분모가 붙는 표기, 부호가 붙는 표기, 분수 부분이 붙는 표기, 밑줄이 섞인 표기까지 모두 가능하고, 자동으로 기약분수로 줄어들어요.
1r # => (1/1)
2/3r # => (2/3) # With denominator.
1.2r # => (6/5) # With fractional part.
2/4r # => (1/2) # Automatically reduced.
<rational-literal> = <numerator> ['/' <denominator>] 'r'
<numerator> = [<sign>] <digits> [<fractional-part>]
<fractional-part> = '.' <digits>
<denominator> = [sign] <digits>
<sign> = '-' | '+'
<digits> = <digit> { <digit> | '_' <digit> }
<digit> = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
문자열 리터럴
작은따옴표 문자열
작은따옴표(')로 감싼 문자열에서는 보간(interpolation)이 꺼져요. # 문자를 이스케이프하거나 작은따옴표를 쓰면 보간을 막을 수 있어요.
'#{1 + 1}' #=> "\#{1 + 1}"
작은따옴표 문자열은 보간을 끄는 것 외에도, 작은따옴표(\')와 백슬래시(\\)를 제외한 모든 이스케이프 시퀀스를 비활성화해요.
문자열 리터럴 연결
인접한 작은따옴표·큰따옴표·퍼센트 문자열은 이어 붙여 하나의 문자열이 돼요. 단, 마지막에 퍼센트 문자열이 오면 안 돼요.
%q{a} 'b' "c" #=> "abc"
"a" 'b' %q{c} #=> NoMethodError: undefined method 'q' for main
문자 리터럴
한 문자짜리 문자열을 표현하는 표기법도 있어요. 물음표(?) 뒤에 한 문자 또는 하나의 코드포인트에 대응하는 이스케이프 시퀀스를 쓰면 돼요.
이스케이프 시퀀스
큰따옴표 문자열, 문자 리터럴, 여러 문서(heredoc) 리터럴, 큰따옴표 심볼, 해시 리터럴의 큰따옴표 심볼 키, Regexp 리터럴, 그리고 %, %Q, %W, %I, %r 같은 여러 퍼센트 리터럴 안에서는 일부 문자를 이스케이프 시퀀스로 나타낼 수 있어요.
여러 문서(Here Document) 리터럴
긴 텍스트 덩어리를 쓸 때는 here document(줄여서 heredoc)를 이용해요. <<HEREDOC 다음 줄부터 시작해서, HEREDOC로 시작하는 다음 줄에서 끝나요. 결과에는 마지막 줄바꿈도 포함돼요.
expected_result = <<HEREDOC
This would contain specially formatted text.
That might span many lines
HEREDOC
식별자는 뭐든 쓸 수 있지만, 보통 전부 대문자를 써요. << 뒤에 -를 붙이면 끝나는 식별자를 들여 쓸 수 있어요.
expected_result = <<-INDENTED_HEREDOC
This would contain specially formatted text.
That might span many lines
INDENTED_HEREDOC
내용 자체도 들여 쓰고 싶다면 << 뒤에 ~를 쓰는 squiggly heredoc을 써요. 가장 덜 들여 쓴 줄의 들여쓰기를 기준으로 각 줄의 앞부분을 잘라내요.
expected_result = <<~SQUIGGLY_HEREDOC
This would contain specially formatted text.
That might span many lines
SQUIGGLY_HEREDOC
heredoc 안에서는 보간과 이스케이프 시퀀스가 동작해요. 여는 식별자를 작은따옴표로 감싸면 보간과 이스케이프를 꺼요.
expected_result = <<-'EXPECTED'
One plus one is #{1 + 1}
EXPECTED
p expected_result # prints: "One plus one is \#{1 + 1}\n"
여는 식별자 뒤에 메서드를 붙여서 heredoc의 결과를 바로 처리할 수도 있어요.
expected_result = <<-EXPECTED.chomp
One plus one is #{1 + 1}
EXPECTED
배열 리터럴
배열은 [와 ] 사이에 객체를 나열해서 만들어요. 배열 안에는 표현식도 들어갈 수 있어요.
[1, 2, 3]
[1, 1 + 1, 1 + 2]
[1, [1 + 1, [1 + 2]]]
해시 리터럴
해시는 {와 } 사이에 키-값 쌍을 나열해서 만들어요. 키와 값은 모두 어떤 객체든 될 수 있어요.
{"a" => 1, "b" => 2}
심볼 키를 쓰는 문법도 있어요. 괄호 안에서 { a: 1, b: 2 }처럼 쓰면 돼요. 이 표기법은 메서드의 키워드 인자에서도 그대로 쓰여요.
범위(Range) 리터럴
어떤 객체든 범위로 만들 수 있어요. Range 문서에서 필요한 메서드에 대한 설명을 확인해 보세요.
퍼센트 리터럴
이번 절에서 설명하는 각 리터럴은 정해진 구분자 쌍을 쓸 수 있어요.
[와].(와).{와}.<와>.- 위에 없는 비알파벳 ASCII 문자 하나를 시작과 끝 구분자로 쓰기.
%q: 보간 없는 String 리터럴
%q:foo bar baz: # => "foo bar baz" # Using two :.
%q(1 + 1 is #{1 + 1}) # => "1 + 1 is \#{1 + 1}" # No interpolation.
%q[foo[bar]baz] # => "foo[bar]baz" # brackets can be nested.
%q(foo(bar)baz) # => "foo(bar)baz" # parenthesis can be nested.
%w와 %W: 문자열 배열 리터럴
%w(#{1 + 1}) # => ["\#{1", "+", "1}"]
%W(#{1 + 1}) # => ["2"]
%i와 %I: 심볼 배열 리터럴
%i(#{1 + 1}) # => [:"\#{1", :+, :"1}"]
%I(#{1 + 1}) # => [:"2"]
%r: Regexp 리터럴
%r[foo] # => /foo/
%r{foo} # => /foo/
%r(foo) # => /foo/
%r<foo> # => /foo/
마지막 구분자 뒤에는 정규식의 모드를 설정하는 수식자 문자를 하나 이상 붙일 수 있어요. Regexp의 모드에 대한 자세한 내용은 관련 문서에서 확인해 보세요.