프로그래밍/Ruby

Ruby: Symbols

choidacheeze 2020. 9. 24. 16:47

심볼(Symbols)

:class
:lvar
:method!
:andthisis?
:$gvar
:@ivar
:@@cvar
:+

Symbol클래스의 인스턴스. 문자열과 Symbol오브젝트는 일대일 대응한다.
:의 뒤에는 식별자, 메소드명(접미사에 !, ? =포함), 변수명(접두사에$포함), 지정의 가능한 연산자 몇 개가 올 수 있다.

Ruby의 내부에서는 메소드명이나 변수명, 상수명, 클래스명 등의 이름을 상수로 관리하고 있는데, 이 상수를 Ruby코드 상에서 표현한 것이 Symbol이다. Symbol은 소스코드상에서 문자열처럼 보이며, 내부에서는 상수로서 처리되어 양자간의 매개체 역할을 한다.

Symbole은 변경불가능한 immutable한 객체, 한 번 값이 assign되고 나면 값을 변경하는 것이 불가능하다. (정확히 말하면 객체가 갖고 있는 값을 변경할 수는 없지만 덮어쓰기할 수는 있다는 의미). 문자열과 달리 같은 값을 갖고 있다면 같은 객체

p "abc" == "abc" #=> true
p "abc".equal?("abc") #=> false
p :abc == :abc #=> true
p :abc.equal?(:abc) #=> true

심볼은 immutable하기 때문에 한번 heap메모리상에 생성되고 나면 동일한 객체로 재사용이 가능
문자열에 비해(문자열 객체는 동일한 문자열도 다른 메모리값을 갖으므로) 메모리 효율성이나 성능측면에서 유리하다. 이러한 이유로 hash의 키 등으로 문자열을 사용하는 것보다 심볼을 사용하는 것이 좋다.

인스턴스메소드

self <=> other -> -1 | 0 | 1**

self와 other의 symbol에 대응하는 문자열의 ASCII코드 순으로 비교하여 self가 큰 경우 1, 동등한 경우 0, 작은 경우 -1을 반환

p :aaa <=> :xxx  # => -1
p :aaa <=> :aaa  # => 0
p :xxx <=> :aaa  # => 1

self == other -> true | false**

두 symbol이 같은 값을 갖는지 확인

:aaa == :aaa    #=> true
:aaa == :xxx    #=> false

self =~ other -> Integer | nil**

정규표현의 other와 매치되는지 판정, 매치된다면 매치된 위치의 인덱스를, 아니라면 nil을 반환
(self.to_s =~ other과 같음)

p :foo =~ /foo/    # => 0
p :foobar =~ /bar/ # => 3
p :foo =~ /bar/    # => nil

id2name

symbol에 대응하는 문자열을 반환, 반대로 문자열에 대응하는 symbol을 얻을 때는 intern을 사용

p :foo.id2name  # => "foo"
p :foo.id2name.intern == :foo  # => true

'프로그래밍 > Ruby' 카테고리의 다른 글

Ruby : Literals(Booleans, Numbers, String)  (0) 2020.09.20
Ruby(변수와 상수)  (0) 2020.09.15
Ruby설치하기(Mac)  (0) 2020.09.14
Ruby Programing(Intro)  (0) 2020.09.14