런타임에 다운캐스팅을 수행한다거나 하는 상황을 마주하면 자바는 런타임에 타입 체크를 해야합니다. 이런 이유로 자바가 동적타입이고, 이때 발생하는게 예외죠
근본적으로 이 간극이 없다면 예외를 예외라고 부를 필요가 없습니다. throw는 throw하는 객체를 전역변수에 담아두고 goto하는 패턴의 문법설탕이 되겠죠
말씀하신것과 유사하게 타입체크를 런타임에 수행하는 언어를 동적타입이라 부릅니다. 하지만 이건 프로그램에서 다뤄지는 모든 값에 대한 얘기입니다. 자바 글이니 자바를 예로 들면, 자바 코드는 컴파일타임에 타입체크 되지만 이건 그 변수에 대응될 값이 변수의 타입과 일치해야한다는 중요한 암시를 내포하고 있습니다.
타입체크를 런타임에 한다고 동적타입이면 C도 동적타입 언어 인가요? void포인터라는 개념이 있는걸로 아는데 둘간의 어떤 차이가 있는지요
타입체크를 런타임에 한다고 동적타입이면 C도 동적타입 언어 인가요?
네 C가 타입체크를 런타임에 하면 동적타입 언어입니다.
그렇지 않기 때문에 정적 타입입니다.
void 포인터는 그냥 원래 자료형을 알 수 없는 raw 포인터입니다. 해당 포인터가 가르키는 주소에 어떤 타입이 있는지는 알 수 없습니다.
말씀하신 예외의 의미가 너무 넓게 와닿는데 조금만 자세히 설명해주실 수 있을까요?
제가 아는 정적/동적 타입 언어의 정의는 변수의 타입이 컴파일 타임에 정해져있고 그걸 바꿀때 명시적으로 해야하면 정적 타입 언어이고, 동적 타입 언어는 런타임 시점에 얼마든지 변수의 타입을 정할 수도 있고 암시적으로 바꿀 수도 있는 언어였습니다.