줄리아의 타입과 애노테이션
코드
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 언어처럼 String
은 Char
의 배열이며, 위와 같이 큰 따옴표인가 작은 따옴표인가로 구분된다.
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