동적으로 유형이 지정된 시스템에서 값은 런타임시 유형을 갖지만 변수와 함수는 유형이 없습니다. 정적으로 유형이 지정된 시스템에서 변수와 함수에는 컴파일 타임에 알려진 유형과 확인 된 유형이 있습니다. 예를 들어 파이썬 x에서는 무엇이든 될 수 있습니다 . 런타임에 1숫자이면 숫자이고 "foo"문자열 이면 문자열입니다. x런타임에 어떤 유형인지 알 수 있으며 프로그램을 실행할 때마다 유형 이 다를 수 있습니다. Java와 같은 언어에서는 숫자를 사용해야하는 int x경우 x를 작성 하고 컴파일 타임에는 x항상이어야하는 것을 알 수 있습니다 int.
"명시 적"및 "내재적"유형은 모두 정적 유형 시스템을 나타냅니다. 정적 시스템의 특징은 컴파일 타임에 형식이 알려져 있지만 반드시 형식을 작성해야하는 것은 아니라는 것입니다. Java에서는 유형이 명시 적이므로이를 작성해야합니다. 따라서 Java에서 메소드는 다음과 같습니다.
public int foo(String bar, Object baz) { ... }
유형은 컴파일 타임 (정적) 과 기록 (명시 적)으로 알려져 있습니다. 그러나 형식을 쓰도록 강요 하지 않는 언어도 있습니다 . 그것들은 그것의 몸에서 함수의 타입과 그것이 어떻게 사용되는지 추론 할 수 있습니다 . 예를 들어 다음과 같이 작성할 수있는 OCaml이 있습니다.
let foo x = x + 1
를 사용했기 때문에 +OCaml은 그 자체 x가 int전부 인지 알아낼 수 있습니다 . 그래서의 종류는 foo( foo : int -> int) 입니다 단지 자바 예제와 같이, 컴파일시에 알려져 있습니다. 완전히 정적입니다. 그러나 컴파일러는 유형 자체가 무엇인지 파악할 수 있으므로 직접 작성할 필요는 없습니다. 암시 적입니다.
간단히 말해서 유형 시스템이 명시 적이든 암시 적이든 정적 시스템 의 속성입니다 . 타입 시스템이 동적인지 정적인지와는 완전히 다른 질문입니다.
종종 때로는 명시 적이거나 암시적인 유형 시스템이 있습니다.
예를 들어 C #에서는 var키워드를 사용하여 유형을 유추 할 수 있다고 생각 합니다. 그래서 쓰는 대신 int x = 10, 당신은 쓸 수 var x = 10및 그 밖의 컴파일러 수치는 x을 수있다 int. C ++는와 비슷한 작업을 수행 auto합니다. 이러한 시스템은 일반적으로 명시 적이지만 약간의 추론이 있습니다.
반대로, 일반적으로 암시 적이지만 때로는 유형 서명을 작성해야하는 시스템이 있습니다. 하스켈이 좋은 예입니다. 대부분의 경우 Haskell은 유형을 유추 할 수 있습니다. 그러나 때때로 show . readHaskell이 자체적으로 유형을 파악할 수없는 모호한 코드를 작성할 수 있습니다. 이 경우 show또는 의 유형을 명시 적으로 지정해야합니다 read. 또한 순위 시스템의 다형성과 같은 형식 시스템의 일부 고급 기능으로 인해 추론을 결정할 수 없습니다. 즉, 중지되지는 않습니다. 즉,이 기능을 사용하는 코드에는 종종 명시적인 유형 서명이 필요합니다.