도입
이 글은 정적 타입 객체 지향 언어에서 타입 어노테이션이 가지는 역할과 그 한계에 대해 논하며, 궁극적으로 타입 어노테이션이 없는 언어의 가능성을 탐구합니다. 자바와 같은 언어에서 타입 어노테이션은 코드의 성능과 안정성을 확보하는 데 필수적이지만, 저자는 완벽한 객체 지향 언어에서는 모든 변수 타입이 추론 가능해야 한다고 주장합니다. 이는 컴파일러와 프로그래머의 개선을 통해 달성될 수 있으며, 언어 설계 자체의 변화가 필요함을 역설합니다.
타입 어노테이션은 컴파일러의 정적 호출 최적화와 프로그래머의 런타임 오류 방지에 기여하지만, 완벽한 타입 추론을 통해 이를 제거할 수 있습니다.
컴파일러의 타입 추론 한계
- 부분적 추론: 자바 10의
var 키워드처럼 일부 지역 변수 타입은 추론 가능합니다.
- 결정 불가능성: 그러나 제네릭, 메서드 오버로딩, 리플렉션, 그리고 언어의 복잡성으로 인해 자바 프로그램에서 모든 타입 추론은 일반적으로 결정 불가능합니다. 파일 단위 컴파일 방식도 이를 제한합니다.
프로그래머의 기여를 통한 타입 추론 개선프로그래머는 다음을 통해 컴파일러의 타입 추론을 도울 수 있습니다.
- 제네릭, 메서드 오버로딩, 리플렉션 사용 지양:
List<Book> 대신 구체적인 Library 사용, print(String x) 대신 printString(x) 사용 등은 타입 추론을 용이하게 합니다. 이러한 변화는 코드를 간결하게 하고 가독성을 높입니다.
타입 어노테이션 없는 언어의 제안하스켈, ML 계열 언어도 완전한 타입 추론을 달성하지 못합니다. 저자는 제네릭, 오버로딩, 리플렉션 등 100% 타입 추론을 방해하는 모든 기능을 제거하고, 전체 프로그램을 컴파일하는 새로운 언어를 제안합니다. 이 언어에서는 타입 추론이 불가능하면 컴파일이 실패하며, 이는 프로그래머가 작은 모듈을 작성하고 IPC를 통해 소통하도록 유도합니다. EOLANG이 이러한 접근 방식을 실험 중입니다.
결론
결론적으로, 타입 어노테이션은 현재 정적 타입 언어에서 중요한 역할을 하지만, 저자는 완벽한 타입 추론을 목표로 하는 언어 설계를 통해 이를 완전히 제거할 수 있다고 주장합니다. 이는 컴파일러의 분석 능력 향상과 프로그래머의 코드 작성 습관 변화를 통해 부분적으로 달성될 수 있으며, 궁극적으로는 제네릭, 오버로딩, 리플렉션과 같은 기능을 배제하고 전체 프로그램 단위로 컴파일하는 새로운 언어의 등장을 통해 실현될 수 있습니다. 이러한 변화는 코드 가독성을 극대화하고, 개발자가 더욱 응집력 있는 작은 모듈을 설계하도록 유도하여 소프트웨어 아키텍처에도 긍정적인 영향을 미칠 것입니다.