logo

줄리아에서 ==과 ===의 차이점 📂줄리아

줄리아에서 ==과 ===의 차이점

코드 1

==는 값이 같은지를 비교하고, ===는 비교할 값이 가변mutable인지 아닌지에 따라 다르게 작동한다.

  • Mutable: 두 항이 같은 오브젝트인지 확인한다. 다시 말해, 프로그래밍적으로 두 변수가 구분될 수 있는지 없는지를 리턴한다.
  • Immutable:
    • 두 항의 타입이 같은지 체크하고,
    • 두 항의 스트럭쳐가 같은지 체크하고,
    • 그 각각의 요소가 ==하게 같은지 재귀적으로 체크한다.
julia> X = 1; Y = 1;

julia> X == Y
true

julia> X === Y
true

julia> X = [1]; Y = [1];

julia> X == Y
true

julia> X === Y
false

예로써 파이썬에서 흔히 볼 수 있는 위의 실행결과를 살펴보자. 정수 1은 Immutable하고 프로그래밍적으로 구분할 수 없어서 =====이 마찬가지로 참을 반환했지만, 1만을 포함한 배열로 보았을 땐 X에 새로운 원소가 추가된다고 했을 때 XY가 달라질 수 있기mutable에 단순히 값을 비교한 ==은 참을 반환하고 객체 자체를 비교한 ===은 거짓을 반환했다.

객체가 무슨 말인지 잘 몰라도 이 용법만 이해하면 충분하다.

최적화

객체지향성이 약한 줄리아에서 이러한 차이는 크게 와닿지 않는다. 코드 최적화의 측면에서 보았을 때 =====는 싱글톤singtone의 비교에서 다음과 같은 정도의 성능 차이가 난다.

N = 10^7
x = rand(0:9, N)

julia> @time for t ∈ 1:N
           x[t] == 0
       end
  1.292501 seconds (30.00 M allocations: 610.336 MiB, 2.63% gc time)

julia> @time for t ∈ 1:N
           x[t] === 0
       end
  1.016211 seconds (30.00 M allocations: 610.336 MiB, 2.77% gc time)

하나의 값은 보통 Immutable이기 때문에 ==보다 ===이 빠른 것으로 이해하면 된다.

이 정도 차이는 대부분의 경우 별로 크지 않을 수 있다. 당연하지만 반복적iterative이지 않은 작업은 다음과 같은 벡터 연산이 훨씬 빠르며, 이 때의 속도 차이는 없거나 무의미하다.

julia> @time x .== 0;
  0.009509 seconds (6 allocations: 1.196 MiB)

julia> @time x .=== 0;
  0.009478 seconds (6 allocations: 1.196 MiB)

환경

  • OS: Windows
  • julia: v1.6.1