시작하기 전에 편의를 위한 함수 하나 정의

타입 인자의 서브타입들을 어레이 안에 넣어 출력하는 기존 내장함수인 subtypes에서 좀 더 보기좋게 인덴트를 추가하고 서브의 서브까지 뺑뺑뺑 뺑이로 전부 보여주도록 개조함

어떤 책에서 알려줌

여담으로 줄리아에서 인덴트는 가독성 용일 뿐 문법적 요소는 아니다











타입은 필드가 없고 타입 트리를 위해서만 쓰이는 abstract type 과

필드가 있을 수 있는 concrete type 으로 구분되며 각각 선언 방식은




그냥 독립적인 타입일 수도 있고 subtype 관계를 표기할 땐 저렇게

불변이면 struct, 가변이면 mutable struct




위 Number 타입 트리 사진에서 끝단이 아닌 타입은 전부 abstract type이다


그러니까 Real은 abstract고 Int 류는 concrete 다





줄리아에서 함수를 선언할 때 타입이 명시되지 않은 모든 인자는 'Any' 라는 타입으로 지정된다




와 동치이다

타입을 명시할 땐 뒤에 ::를 붙여서 타입을 명시한다



Any는 모든 타입의 supertype이다 전체 타입 트리에서 맨 위에 있는 단 하나의 타입이다

여기선 안할거지만 subtypetree(Any) 를 쳤다간 repl 에 몇 초 간 줄리아에 존재하는 모든 타입들이 출력되는걸 볼 수 있다





위에서 함수를 정의했을 때 'generic function with 1 method' 와 같은 문구를 볼 수 있는데 만약 위 정의 이후로 추가로 Int의 타입에 대해서


라고 정의를 했다면 메소드가 하나 추가된다


줄리아에서는 타입에 따라 동명의 함수를 또 만든다는 오버로딩의 개념보다는 함수의 이름은 하나고 타입에 따른 메소드를 여러개 가질 수 있는 그런 개념이다


함수를 인자로 받아 해당 함수가 가진 메소드를 보여주는 내장함수 methods() 를 쓰면


와 같이 나오는걸 볼 수 있다



?? 오버로딩이나 이거나 그게 그거 아닌가??

그게 그거 같다고 느껴지니까 줄린이다


흔히 줄리아 하면 가장 크게 홍보하는 개념이 multiple dispatch인데 이게 뭐 줄리아만이 가능한 전매특허 기능도 아니고 다른 언어에도 다 제각각 구현이 되어 있다


아무튼 문어발 마냥 하나의 함수 이름에 대하여 여러 타입에 대한 메소드를 제각각 지닐 수 있고 이후 호출할때 해당 타입의 아규먼트가 들어가면 해당 타입 메소드를 찾아서 불러오는데 이걸 dispatch 라고 일컫는다


여기서 인자가 하나가 아닌 여러개라면 그 여러개에 대하여 독립적으로 각각 dispatch를 한다

인자가 여러개여도 맨 앞 첫 인자에 대해서만 dispatch하는 언어가 single dispatch 고 줄리아는 multiple dispatch다


예를 들어 타입이 3개 있고 함수의 인자 갯수가 4개라면 가능한 모든 메소드의 가짓수는 3의 4승이다 (포지셔널 아규먼트면 순서가 구분된다)









만약 함수에 해당 타입에 대한 메소드가 없다면 줄리아는 해당 타입으로부터 위로 올라가면서 맞는 메소드를 찾는다


예를 들어 위 Number 사진에서 Int64 <: Signed <: Integer <: Real <: Number 인데,



Signed 타입의 메소드에 걸린걸 볼 수 있다



Real의 subtype이지만 Integer의 subtype은 아닌 Float64 을 넣는다면 Real 타입의 메소드에 걸릴 것이다


인자가 여러개면 각 인자에 대해 이 짓을 하고 그게 multiple dispatch 다



sex2 함수의 경우 sex 함수와 달리 타입 명시 없이 따로 정의하지 않았기 때문에 (다시 말해 모든 타입에 대해 정의하지 않았기 때문에)

위 메소드의 타입의 서브타입에도 해당되지 않는 완전 바깥의 타입을 넣을 경우 매칭되는 메소드가 없다고 에러가 뜬다










함수도 당연히 타입이 있고 'typeof(함수명)' 의 고유한 타입을 갖으며




바로 위 supertype 으로 Function 타입이 있다

Function 타입은 모든 함수의 supertype이다



여기서 <: 은 subtype인지 확인하고 boolean 뱉는 연산자고 자매품으로 isa 도 있다 이건 그냥 타입체킹









어쨌건 함수도 타입이니까 함수의 인자로 함수 타입을 집어넣을 수 있고 줄리아에서 함수는 퍼스트 클래스다