
이유 3가지
| 특성 | JavaScript | TypeScript |
|---|---|---|
| 타입 지정 | 동적 타입 지정 | 정적 타입 지정 |
| 컴파일 | 인터프리터 방식, 별도의 컴파일 단계 없음 | JavaScript로 컴파일 |
| ES6 기능 지원 | ES6 기능을 기본적으로 지원 | 트랜스파일을 통해 ES6 기능 지원 |
| 객체지향 프로그래밍 지원 | 객체지향 프로그래밍 지원 (강제되지 않음) | 클래스와 인터페이스를 통한 객체지향 프로그래밍 |
| 정적 타입 체크 | 없음 | 컴파일 시 정적 타입 체크 |
| 커뮤니티 | 큰 커뮤니티, 다양한 자료 | 성장 중인 커뮤니티, Microsoft의 지원 |
| 특성 | 인터프리터 | 컴파일러 |
|---|---|---|
| 번역 및 실행 방식 | 코드 한 줄씩 번역하고 즉시 실행 | 전체 코드를 한 번에 번역하여 목적 프로그램을 생성한 후 실행 |
| 실행 파일 생성 여부 | 없음 | 있음 |
| 프로그램 실행 속도 | 실행 시마다 번역을 하므로 느림 | 한 번 번역한 후 실행하므로 빠름 |
| 개발 편의성 | 코드 변경 후 즉시 실행 결과를 확인할 수 있어 편리 | 코드 변경 후 다시 컴파일하고 실행해야 하므로 번거로움 |
| 오류 발견 시점 | 실행 시점에서 오류 발견 가능 | 컴파일 시점에서 대부분의 오류 발견 가능 |
| CPU 사용 시간 | 매번 번역하여 실행하므로 CPU 사용 시간이 많음 | 한 번 번역한 후 실행하므로 CPU 사용 시간이 적음 |
| 사용 예 | JavaScript, Python, Ruby 등 | C, C++, Java, FORTRAN, COBOL 등 |
정적 타입을 지원하여 변수, 함수, 객체 등의 타입을 명시적으로 선언할 수 있다. 이는 코드 작성 시점에 타입 오류를 발견할 수 있게 해주므로 코드의 안정성을 높인다.
예를 들어 숫자형 변수를 문자열로 잘못 사용하는 경우, 컴파일 시점에 오류를 감지할 수 있다.
타입을 명확하게 정의함으로써 많은 예외 상황을 컴파일 단계에서 제거할 수 있다. 이는 개발자가 코드에서 타입 관련 예외 처리를 수동으로 추가할 필요성을 줄여준다. 잘못된 타입의 값을 방지하면 가독성과 유지보수성이 증가한다.
js엔진은 자주 호출되는 함수를 최적화한다. ( *hot function )
이렇게 최적화한 함수의 인자의 타입이 변화하면 최적화가 해제되고 다시 최적화를 실행하게 된다. 타입을 지정하면 최적화를 계속 유지하여 성능이 증가한다.
반복 호출 감지: 엔진은 특정 함수가 자주 호출된다는 것을 감지
최적화 적용: 반복적인 호출 패턴을 기반으로 해당 함수를 더 빠르게 실행할 수 있도록 최적화
예를 들어, 다음 함수가 자주 호출된다면
let add = (a, b) => a + b;
만약 이 함수가 항상 정수 인자를 받는다면, 엔진은 이를 기반으로 최적화를 수행한다. 그러나 갑자기 문자열이 인자로 들어오면 최적화가 해체되어 성능이 저하된다. TypeScript에서는 함수의 인자 타입을 명시적으로 지정함으로써 이러한 문제를 방지할 수 있다.
function add(a: number, b: number): number {
return a + b;
}
이렇게 하면 타입 안정성을 확보하고, 자바스크립트 엔진이 최적화를 더 효과적으로 유지할 수 있다.
참고자료 : 블로그