Class는 ES6에서 JavaScript 생태계에서 공식적으로 도입되었다. Class는 객체지향 프로그래밍의 그 자체이다.
객체지향 프로그래밍은 커다란 문제를 Class로 나누고, Class간의 관게를 추가하면서 코드 중복을 최소화하는 개발 방식이다. 클래스 간의 관계는 상속이나 포함 관계를 고려하여 추가한다.
Interface는 ES6가 지원하지 않는 TypeScript만의 특징이다. Interface는 타입이며, Javascript로 컴파일 후 사라진다.
추상 클래스는 선언과 구현이 모두 존재하지만 Interface는 선언만 존재하며, 멤버 변수와 멤버 메서드를 선언할 수 있지만 접근 제한자는 설정할 수 없다.
Class와 다르게 Interface는 TypeScript의 컨텍스트 내에서만 존재하는 가상 구조다. TypeScript 컴파일러는 Type 체크 목적으로 Interface를 사용한다.
(JavaScript로 트랜스 파일되면 Interface는 제거됨.)
커스텀 타입으로 사용된다. Interface는 필수 항목으로 사용할 프로퍼티를 선언해서, 함수에 전달하는 인자 형식을 고정할 수 있다. 이 경우에는 Interface를 인자로 받는 함수가 실행되면 TypeScript 컴파일러가 인자의 유효성을 먼저 검사한다.
추상 클래스로 사용된다. 메소드의 형태만 선언해서 Interface를 정의하며, 이후 Class에 정의될 때 implements 키워드를 사용하면서 해당 Interface를 지정하면 해당 Class는 추상 함수로 선언된 메소드의 몸체를 받아들여야 한다.
객체 팩토리로 사용된다. Class는 객체 모양과 동작에 대한 청사진을 정의한 후 Class 속성을 초기화하고, 메소드를 정의한다. 따라서 Class의 인스턴스를 만들 때 실행 가능한 함수와 정의된 프로퍼티를 가진 객체를 얻는다.