줄리아의 타입과 애노테이션

줄리아의 타입과 애노테이션

Type and annotation in julia

코드

julia> typeof(0)
Int64

julia> typeof(0.0)
Float64

julia> typeof(0 == 0.0)
Bool

julia> typeof(Bool)
DataType

julia> typeof(NaN)
Float64

julia> typeof(Inf)
Float64

julia> typeof('O')
Char

julia> typeof("Ohmygirl")
String

julia> typeof("O")
String

줄리아에는 온갖 타입들이 구현되어있다. $0$ 과 $0.0$ 은 같은 $0$ 이지만 다른 타입을 가지며, 보다시피 타입인 Bool조차 DataType이라는 타입을 갖는다. C 언어처럼 StringChar의 배열이며, 위와 같이 큰 따옴표인가 작은 따옴표인가로 구분된다.

julia> supertype(Int64)
Signed

julia> supertype(Signed)
Integer

julia> supertype(Integer)
Real

julia> supertype(Real)
Number

julia> supertype(Number)
Any

julia> supertype(Any)
Any

위와 같이 supertype() 함수를 사용하면 타입의 상위 타입을 확인할 수 있다. 모든 타입은 Any 타입의 하위 타입이다. Any는 말그대로 모든 것을 포괄하기 때문에 편리하고 생산성이 높다.

julia> x = ["o", -1, [7,'m'],3.0]
4-element Array{Any,1}:
   "o"
 -1
   Any[7, 'm']
  3.0

julia> typeof(x)
Array{Any,1}

julia> x[2] = 1.2
1.2

julia> typeof(x)
Array{Any,1}

julia> y = [0,1,1]
3-element Array{Int64,1}:
 0
 1
 1

julia> typeof(y)
Array{Int64,1}

julia> y[2] = 1.2
ERROR: InexactError: Int64(1.2)
Stacktrace:
 [1] Int64 at .\float.jl:710 [inlined]
 [2] convert at .\number.jl:7 [inlined]
 [3] setindex!(::Array{Int64,1}, ::Float64, ::Int64) at .\array.jl:847
 [4] top-level scope at REPL[39]:1

julia> typeof(y)
Array{Int64,1}

Any로 만들어진 배열은 값이 대입이나 조작이 간단하게 이루어지지만, 정수의 배열로 정해진 경우엔 불가능하다. 줄리아는 강한 타입 언어로써, 이렇게 추론할 타입을 줌으로써 성능을 향상시키고 버그의 발생을 원천봉쇄 할 수 있다. 타입을 제한하는 것을 애노테이션이라 하며, 우선 프로그램이 구현되는지 확인한 뒤에는 반드시 최적화를 해주는 게 좋다. 보통 줄리아를 사용하는 가장 큰 이유는 속도기 때문이다.

julia> function add1(a,b)
           return a+b
       end
add1 (generic function with 1 method)

julia> add1(1,2)
3

julia> add(1,2.0)
ERROR: UndefVarError: add not defined
Stacktrace:
 [1] top-level scope at REPL[43]:1

julia> function add2(a::Int64, b::Float64)
           return a+b
       end
add2 (generic function with 1 method)

julia> add2(1,2)
ERROR: MethodError: no method matching add2(::Int64, ::Int64)
Closest candidates are:
  add2(::Int64, ::Float64) at REPL[44]:1
Stacktrace:
 [1] top-level scope at REPL[45]:1

julia> add2(1,2.0)
3.0

위와 같이 ::를 써서 변수가 구체적으로 무엇인지 알려주면 타입이 맞지 않을 때 에러를 내준다. 이렇게 애노테이션이 되어 있어서 타입을 체크하지 않아도 된다면 당연히 성능이 개선된다.

환경

  • OS: Windows
  • julia: v1.5.0
댓글