심볼

심볼 에서 Ruby

1개의 연습 문제

심볼 소개

심볼은 값을 가리키는 데 사용할 수 있는 이름 붙은 식별자예요. 심볼은 이름 앞에 : 문자를 붙이는 심볼 리터럴로 만들어요. 예를 들어 :foo처럼요. 따옴표로 감싸서 쓸 수도 있는데, 예를 들어 :"foo"처럼 쓰면 이름에 공백을 넣을 수 있어요.

:foo # => :foo
:"foo boo" # => :"foo boo"

심볼은 해시의 키를 비롯해 메서드 이름과 변수 이름을 나타내는 등 언어 곳곳에서 사용돼요.

식별자

심볼이 문자열과 다른 점은 심볼이 식별자이며, 데이터나 텍스트를 나타내지 않는다는 거예요. 따라서 이름이 같은 두 심볼은 항상 같은 객체예요.

"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748

심볼 수정하기

심볼은 불변이어서 수정할 수 없어요. 그래서 심볼을 "수정"한다고 해도 실제로는 새로운 심볼을 만드는 거예요. 심볼을 다루는 데 사용할 수 있는 메서드가 몇 가지 있는데, 모두 새로운 심볼을 반환해요. 모든 메서드는 Symbol API에서 확인할 수 있어요.

:foo.upcase # => :FOO

:foo.object_id # => 1086748
:foo.upcase.object_id # => 60

심볼이 불변이라는 점의 장점은 문자열보다 메모리를 효율적으로 사용하면서도 식별자로 쓰기에 더 안전하다는 거예요.

변환

심볼은 문자열로 변환할 수 있고, 그 반대도 가능해요. 심볼을 수정하고 싶거나 심볼을 문자열처럼 사용하고 싶을 때 유용해요. 문자열을 심볼로 바꾸려면 String#to_sym 메서드를, 반대로 심볼을 문자열로 바꾸려면 Symbol#to_s 메서드를 사용해요. 심볼이 가진 메서드가 제한적이라서, 새로운 심볼이 필요할 때는 심볼을 문자열로 변환해 문자열 메서드를 사용하면 유용해요.

:foo.to_s # => "foo"
"foo".to_sym # => :foo

스코프에서 이름 가져오기

Ruby에서는 상수, 메서드, 변수의 이름을 가져오는 여러 메서드를 사용해 스코프 안의 이름을 얻을 수 있어요. 이런 메서드들은 심볼 배열을 반환해요.

그중에는 Module#constants, Module#instance_methods, Module#class_variables, global_variables, local_variables 같은 메서드가 있어요.

module Foo
  BAR = 1
  def self.baz; end
end

a = 1

Foo.constants # => [:BAR]
Foo.instance_methods # => [:baz]

local_variables # => [:a]

모든 메서드는 Kernel API와 Module API에서 확인할 수 있어요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요

심볼 배우기