루비(Ruby)의 심볼이란? 프로그래밍

새로 산 책에서 루비의 심볼이 무엇인가 설명이 간략해서 인터넷에 찾다가 영문 사이트를 대충 번역해봤습니다.

루비의 심볼은 수수께끼 같다. 쓰기는 하지만 정확히는 잘 모른다.

그럼 심볼이란?

쉽게 말하면, 심볼은 이름이나 문자열을 대신하는 것이다. 이것은, 각각 이름을 붙일 때마다 문자열을 넣을 공간을 절약하는 대신 효과적으로 기술하는 이름을 갖는 것으로 귀결된다.

존스 박사의 경우

존스 박사는 심리학자이다. 그는 정기적으로 단어 연상 테스트를 진단 목적으로 시행하는데, 모든 걸 추적하기 위해 루비를 사용한다. 첫 환자 'Why'가 단계적 테스트를 받았다.

Dr J: Red
Why : Ruby
Dr J: Transportation
Why : Rails
Dr J: Chunky
Why : Bacon

저장하기 위해 해쉬를 사용했다.

why = {"red" => "ruby", "transportation" => "rails", "chunky" => "bacon"}

두번째 환자 Bob도 조사를 받아서 해쉬로 저장했다.

bob = {"red" => "paint", "transportation" => "car", "chunky" => "fat"}

문제점

수백명의 단어 연상 테스트를 하자, 메모리가 꽉 차버렸다! 존스 박사는 irb에서 테스트를 돌렸다.

> patient1 = { "ruby" => "red" }
> patient2 = { "ruby" => "programming" }
> patient1.each_key {|key| puts key.object_id.to_s}
211006
> patient2.each_key {|key| puts key.object_id.to_s}
203536

잘 보세요! 해쉬를 새로 만들 때마다 루비는 각각의 키( 박사가 테스트에서 묻는 Ruby, Rails 같은 단어 )에 대해 새 문자열을 생성해서 다른 기억 장소에 저장한다. 다행히 대체 수단이 있다.

심볼 구조대

문자열과 달리 같은 이름들에 대한 심볼은 루비 세션마다 오직 한번 메모리에 생성 존재한다. 심볼이 가장 유용한 경우는 다른 데 쓰인 문자열을을 재사용할 때이다. 존스 박사의 테스트를 다시 만들어보자.

> patient1 = { :ruby => "red" }
> patient2 = { :ruby => "programming" }
> patient1.each_key {|key| puts key.object_id.to_s}
3918094
> patient2.each_key {|key| puts key.object_id.to_s}
3918094

심볼의 사용으로 Ruby란 단어를 표현하는데 한 개의 기억 장소만 쓸 수 있다. 시간이 갈수록 많은 공간을 절약할 수 있다.

기타 사용법

그것이 해쉬의 키라든지 http 질의 함수라든지 상관 없이 기타 다른 것을 거듭 재사용하는 어느 때나 심볼은 유용하다.  예를 들어 최신, 최고의 웹 프레임 워크인 루비 온 레일스는 경로와 링크를 다룰 때 심볼을 쓴다. 웹 페이지를 렌더링하기 전에 프레임 워크 안에서 기능하는 콘트롤러의 동작을 레일스가 정의할 때, 레일스 내의 링키는 다음과 같을 것이다.

link_to("View Article", :controller => "articles", :action => "show"

응용 프로그램이 수백개의 링크를 갖거나, 각기 다른 동작과 콘트롤러에 대한 최소 수백개의 참조를 갖는다면, 일반 문자열을 쓰는 것보다 심볼을 쓰는 게 훨씬 더 효과적이다.

결국, 심볼의 유용성을 해쉬의 키에 한정하지 않는 게 중요하다. 예를 들어, http 클라이언트나 서버 프로그램을 작성한다면 GET과 POST 를 여러차례 써야 하는데, 심볼의 사용이 알맞을 것이다.

  do_this if query == :get

  ...
  send_message_to_server(:post,filename)

문자열이 누적돼 사용되는 어느 경우라도 심볼은 훌륭한 대안의 하나가 될 것이다.












덧글

  • CoolJY 2014/07/09 15:33 # 삭제 답글

    쉬운설명 잘 봤습니다
  • 뽀도르 2014/07/10 09:09 #

    도움이 됐다면 다행입니다^_^)
  • 나그네 2014/10/25 17:05 # 삭제 답글

    좋은 글 감사합니다.
    ':' 기호가 루비에서 자주 보이길래 뭘까 싶었는데, 심볼이란 것이었군요.
    이때까지 궁금해 하면서도 특수문자라 검색이 안 되서 그냥 모른 채로 살고 있었습니다...
  • 뽀도르 2014/10/27 14:06 #

    도움이 돼서 다행입니다^_^)
  • 피카츄 2015/11/10 12:46 # 삭제 답글

    헷갈렸었는데 많은 도움 되었습니다. ^^
  • 뽀도르 2015/11/10 13:34 #

    다행입니다^_^)
댓글 입력 영역