TypeScript 강의 요약
컴파일러와 tsc 개요
컴파일러는 프로그래밍 언어가 정적 언어로서의 특성을 유지할 수 있도록 돕는 도구입니다. 여기서는 컴파일러의 기본 역할과 TypeScript 컴파일러인 tsc에 대해 설명합니다.
1. 컴파일러의 기본 역할
타입 검사: TypeScript 컴파일러는 소스 코드의 정적 타입 검사를 진행하여 타입 관련 오류를 미리 발견하게 도와줍니다.
코드 변환: 컴파일러는 TypeScript를 JavaScript로, C 언어를 기계어로 변환합니다. 이러한 이해는 코드 실행 예측과 디버깅에 유용합니다.
2. 컴파일러의 중요성
에러 메시지 해석: 컴파일러가 생성한 에러 메시지를 이해하면 문제 해결이 빨라집니다.
최적화: 코드가 최적화되면 실행 속도가 빨라지고, 이는 특히 대규모 어플리케이션에서 중요합니다.
3. 컴파일러의 필요성
컴퓨터는 기계어로만 이해하므로, 높은 수준의 프로그래밍 언어는 이를 변환하기 위한 컴파일러가 필요합니다.
4. TypeScript 컴파일러(tsc)
JavaScript 변환: TypeScript는 동적 언어인 JavaScript로 변환되며, 별도의 기계어 변환이 필요 없습니다.
명령어 예시:
tsc --init: tsconfig.json 파일 생성
tsc index.ts: index.ts 파일을 컴파일
5. compilerOptions 설명
target: TypeScript 코드를 어떤 JavaScript 버전으로 변환할 지 설정합니다.
module: 생성되는 JavaScript 모듈의 형식을 지정합니다.
outDir: 컴파일된 파일이 저장될 디렉터리를 지정합니다.
strict: 엄격한 타입 검사를 활성화해 코드 실수를 미리 찾아냅니다.
sourceMap: 소스 맵을 생성하여 디버깅을 용이하게 합니다.
include/exclude: 컴파일 시 포함하거나 제외할 파일 및 디렉터리를 지정합니다.
6. .d.ts 파일 이해하기
.d.ts 파일은 TypeScript에서 외부 JavaScript 라이브러리의 타입 정보를 제공하는 타입 정의 파일입니다. 이를 통해 TypeScript 개발자는 JavaScript 라이브러리를 호환성 있게 활용할 수 있습니다.
타입의 중요성과 기본 타입 개요
타입의 중요성:
변수는 데이터를 저장하는 공간으로, 다양한 타입(숫자, 문자열, 배열 등)을 가질 수 있습니다. 올바른 타입 사용은 코드의 가독성과 안정성을 높입니다.
잘못된 타입 사용은 실행 중 오류를 초래할 수 있으며, 이를 방지하기 위해 타입을 제대로 이해하는 것이 중요합니다.
타입 안정성은 코드 품질을 보장하고, 협업 시 가독성을 높여 유지보수를 용이하게 합니다.
기본 타입 소개:
boolean: 참(true) 또는 거짓(false) 값을 나타냅니다.
number: 모든 숫자를 표현하며, 정수와 실수, 2진수 등을 포함합니다.
string: 텍스트 데이터를 나타내며, 다양한 방법으로 문자열을 생성할 수 있습니다.
배열: 기본 타입에 []를 붙여 여러 값을 저장하는 형태입니다. 튜플은 서로 다른 타입의 원소를 가질 수 있습니다.
enum: 관련된 상수 값을 그룹화하여 사용합니다.
상수와 불변성:
const: 상수를 정의하며, 변경할 수 없습니다.
readonly: 객체의 속성을 불변으로 만듭니다.
기타 타입:
any: 모든 타입을 허용하지만, 타입 안정성을 저해할 수 있어 사용을 지양해야 합니다.
unknown: 모든 타입을 허용하되, 타입 확인이 필요합니다.
union: 여러 타입 중 하나를 허용하는 타입으로, | 연산자를 사용하여 정의할 수 있습니다.
TypeScript를 쓰면서 여러 타입을 하나의 변수로 해결하겠다는 생각은 가급적 지양하기
클래스:
클래스는 객체를 생성하기 위한 틀로, 공통 속성(attribute)과 메서드(method)를 정의합니다. 속성은 객체의 성질을, 메서드는 기능을 제공합니다.
객체:
객체는 클래스의 인스턴스로, 클래스의 속성과 메서드를 활용할 수 있습니다.
클래스 정의:
TypeScript에서 class 키워드를 사용해 클래스를 정의하고, new 키워드로 객체를 생성합니다. 생성자(constructor)는 객체 초기화에 사용됩니다.
접근 제한자:
public: 클래스 외부에서 접근 가능.
private: 클래스 내부에서만 접근 가능.
protected: 클래스 내부와 자식 클래스에서 접근 가능.
상속:
상속은 클래스 간의 관계를 정의하며, 기존 클래스의 속성과 메서드를 물려받아 새로운 클래스를 정의합니다. extends 키워드를 사용합니다.
upcasting과 downcasting:
upcasting: 서브타입을 슈퍼타입으로 변환하는 과정으로, 암시적 변환이 이루어집니다.
downcasting: 슈퍼타입을 서브타입으로 변환하는 과정으로, 명시적 타입 변환이 필요합니다.
추상 클래스:
추상 클래스는 인스턴스화할 수 없으며, 자식 클래스에서 메서드 구현을 강제합니다. abstract 키워드를 사용합니다.
인터페이스:
인터페이스는 객체가 가져야 하는 속성과 메서드를 정의하며, 구현한 객체는 이를 준수해야 합니다. 기본 구현은 제공하지 않습니다.
S.O.L.I.D 원칙:
S: 단일 책임 원칙(SRP) - 클래스는 하나의 책임만 가져야 함.
O: 개방 폐쇄 원칙(OCP) - 기존 코드를 수정하지 않고 기능을 확장할 수 있어야 함.
L: 리스코프 치환 원칙(LSP) - 서브타입이 슈퍼타입을 대체할 수 있어야 함.
I: 인터페이스 분리 원칙(ISP) - 클래스는 필요하지 않은 인터페이스의 영향을 받지 않아야 함.
D: 의존성 역전 원칙(DIP) - 상위 수준 모듈에 의존해야 함.