줄리아에서의 심볼

줄리아에서의 심볼

Sysbols in julia

개요

줄리아를 처음 접하면서 적잖이 당황할 수 있는 것이 바로 심볼Symbol 자료형이다. 심볼은 맨 앞에 :을 붙여서 사용하며, 어떤 내부 데이터도 없이 그 이름 그 자체로써 기능한다. 주로 이름이나 라벨, 딕셔너리 키 등으로 사용된다.1

설명

여타 프로그래밍 언어에서는 함수에 옵션을 줄 때 숫자로 주거나 의미를 정확히 하기 위해 문자열로 주곤 한다. 가령 다음과 같은 두 함수가 그러하다.

julia> function foo0(x, option = 0)
           if option == 0
               return string(x)
           elseif option == 1
               return Int(x)
           else
               error("wrong")
           end
       end
foo0 (generic function with 2 methods)

julia> foo0(3.0, 0)
"3.0"

julia> foo0(3.0, 1)
3

julia> function foo1(x, option = "string")
           if option == "string"
               return string(x)
           elseif option == "Int"
               return Int(x)
           else
               error("wrong")
           end
       end
foo1 (generic function with 2 methods)

julia> foo1(3.0, "string")
"3.0"

julia> foo1(3.0, "Int")
3

반면 다음은 심볼을 사용한 정의다. 언뜻 보아서는 위 두 함수와 차이가 없어보인다.

julia> function foo2(x, option = :string)
           if option == :string
               return string(x)
           elseif option == :Int
               return Int(x)
           else
               error("wrong")
           end
       end
foo2 (generic function with 2 methods)

julia> foo2(3.0, :string)
"3.0"

julia> foo2(3.0, :Int)
3

심볼을 사용하는 이유를 쉽게 설명하자면 프로그램 중간에 변할 일이 없어서다. 때로는 이 점이 불편함으로 다가올 수도 있지만, 정수나 문자열과 달리 예상치 못한 곳에서 변화할 가능성이 전혀 없다.

또한 심볼은 진정한 의미에서의 지정, 명령이기도 하다. 인터페이스적인 관점에선 문자열이나 심볼이나 마찬가지지만, 위 예시에서 "Int" 이라는 문자열을 받고 그 문자열을 준 것이 정수를 반환하라는 의미이기 때문에 정수형으로 반환하는 것과 심볼 자체가 :Int 로 왔으니 묻거나 따지지 않고 정수형으로 반환하는 것 정도의 차이다. 이 차이가 와닿지 않는다고 해도 억지로 공감할 필요는 없다.

그 외에 심볼을 사용하는 경우는 데이터프레임의 칼럼명과 같이 문자열로 표현되기엔 변수와 구분하기 힘든, 혹은 하고 싶지 않은 경우 등이 있다. 낯선 표기법을 사용하기 때문에 어려워 보일수도 있겠지만 용도와 차이점을 생각해보면 별 거 없다는 점만 알고 넘어가면 된다.


  1. https://docs.julialang.org/en/v1/base/base/#Core.Symbol ↩︎

댓글