의도: 타입스크립트를 사용해 봤는지 확인하는 질문
팁: 자바스크립트를 사용하면서 느꼈던 단점을 타입스크립트가 해소시켜줬다는 표현을 사용해도 좋다.
나의 답안
타입스크립트를 사용하면서 느낀 장점은, 코드의 안정성과 가독성이 높아진다는 점입니다.
컴파일 단계에서 타입 오류를 미리 잡을 수 있어서 런타임 에러를 크게 줄일 수 있었고,
IDE 자동완성이나 타입 추론 덕분에 유지보수도 훨씬 쉬워졌습니다.
또한 팀 프로젝트에서는 각 함수의 입력과 출력 타입이 명확히 정의되기 때문에, 협업 시 의사소통 비용이 줄어드는 효과가 있었습니다.단점으로는, 초기 설정이 다소 번거롭고, 복잡한 제네릭이나 유니온 타입을 다루다 보면 코드가 길어지고 난해해지는 경우가 있었습니다.
또한 라이브러리 타입 정의 파일(@types/)이 미흡하거나 잘못된 경우엔 직접 수정해야 하는 번거로움도 있었습니다.하지만 전체적으로 보면, 프로젝트 규모가 커질수록 TypeScript의 장점이 훨씬 크다고 느꼈습니다.
그래서 이후에는 개인 프로젝트나 협업 환경에서도 기본적으로 타입스크립트를 도입하고 있습니다.
주어진 답안 (모범 답안)
자바스크립트를 사용하면서 느꼈던 가장 큰 단점은 바로 동적 타이핑을 지원하는 언어라는 점입니다.
이러한 특징 때문에 버그를 찾기도 힘들고 자동 완성도 부족하여 견고한 애플리케이션을 만드는 데에 어려움이 많았습니다.허나 타입스크립트의 정적 타이핑 기능을 통해 이러한 어려움이 말끔하게 해소되었습니다.
모든 변수와 객체에 타이핑을 하게 되어 굳이 직접 실행하지 않고도 컴파일 시점에 오류를 체크할 수가 있었고, 제가 좋아하는 자동 완성을 십분 활용하여 오타로 인한 실수도 현저히 줄일 수 있었습니다.
덕분에 견고하고 든든한 애플리케이션을 작성할 수 있었고, 저는 타입스크립트를 사용한 뒤로는 자바스크립트를 사용해 프로젝트를 진행한 적이 한 번도 없을 정도입니다.다만 타입스크립트의 큰 단점도 빼놓을 수 없는데요, 바로 러닝 커브(Learning Curve)가 가파르다는 것입니다.
실제로 저도 항상 타입스크립트의 업데이트 내역을 확인하고, 여러 유틸리티 타입이나 동적으로 타입을 연결하는 방법을 꾸준히 공부하고 있기에 가장 크게 느끼는 단점입니다.
타입스크립트(TypeScript, TS)는 마이크로소프트가 개발한 오픈소스 프로그래밍 언어로, 자바스크립트(JavaScript, JS)에 정적 타입 시스템과 최신 ECMAScript 기능을 추가한 상위 집합(Superset)이다.
즉, 타입스크립트로 작성된 코드는 자바스크립트로 변환(트랜스파일)되어 실행된다.
타입스크립트의 장점과 단점을 알아보자.
function add(a: number, b: number): number {
return a + b;
}
console.log(add(10, "20")); // [에러] 타입 오류 발생 (JS에서는 런타임에 오류 발생)b에 문자열 "20"을 전달하면 타입스크립트는 오류를 감지하지만, 자바스크립트에서는 런타임까지 버그가 드러나지 않는다.interface User {
id: number;
name: string;
}
const user: User = { id: 1, name: "Kim" };
console.log(user.email); // [에러] email 프로퍼티가 존재하지 않음undefined가 발생하지만, 타입스크립트에서는 코드를 작성하는 순간 오류를 감지할 수 있다.function greet(name: string): string {
return `Hello, ${name}!`;
}
console.log(greet(123)); // [에러] 타입 오류name의 타입이 명확히 지정되어 있어, 잘못된 데이터 유형이 들어오는 것을 방지할 수 있다.객체 지향 프로그래밍(OOP) 지원 강화
타입스크립트는 인터페이스, 제네릭, 접근 제한자(public, private, protected) 등을 지원한다.
이를 통해 OOP 패턴을 쉽게 적용할 수 있으며, 대규모 프로젝트에서도 강력한 설계를 가능하게 한다.
예제 (클래스 & 인터페이스)
interface Animal {
name: string;
makeSound(): void;
}
class Dog implements Animal {
name: string;
constructor(name: string) {
this.name = name;
}
makeSound(): void {
console.log("Woof!");
}
}
const myDog = new Dog("Buddy");
myDog.makeSound(); // "Woof!"
Dog 클래스는 Animal 인터페이스를 구현하여 구조적 일관성을 유지할 수 있다.const sum = (a: number, b: number): number => a + b;
console.log(sum(5, 10));function identity<T>(arg: T): T {
return arg;
}
console.log(identity<string>("Hello")); // "Hello"tsc(TypeScript Compiler) 또는 webpack, Babel 등의 도구를 추가로 설정해야 한다.let value: any = "Hello";
value = 42; // any 타입이므로 허용
let value2: string = "Hello";
value2 = 42; // [에러] 타입 오류@types/*)가 필요하다.import * as moment from "moment"; // 타입 정의 필요
const now = moment(); // 일부 라이브러리는 @types/moment 설치 필요any 타입을 쓰거나 직접 타입을 정의해야 하므로 번거롭다.