TypeScript는 JavaScript 클래스에 접근 제어자(Access Modifier), readonly, 추상 클래스(Abstract Class), 생성자 매개변수 프로퍼티(Parameter Properties) 같은 타입 수준 문법을 더한다. 이들은 컴파일 때 검사에만 쓰이고, 출력 JS에서는 대부분 사라진다.
abstract class Department {
protected employees: string[] = []
static fiscalYear = 2026
constructor(private readonly id: string, public name: string) {} // 선언+초기화 한 번에
abstract describe(): void // 자식이 반드시 구현
}
class ITDepartment extends Department {
describe() { console.log(`IT ${this.name}`) }
}public(기본) /private(선언한 클래스 안에서만) /protected(자식 클래스까지). TS의private은 컴파일 타임 검사일 뿐이다. 런타임까지 숨기려면 JS의#field를 쓴다readonly는 초기화 후 재할당을 막는다. 안쪽 객체의 내용까지 막지는 않는다- getter/setter로 private 필드 접근에 검증 로직을 넣는다. 변수·컬렉션 캡슐화과 같은 목적이다
static멤버는 인스턴스가 아니라 클래스로 접근한다(Department.fiscalYear)abstract클래스는 인스턴스로 만들 수 없고, 추상 메서드의 구현을 자식에게 강제한다. 흐름은 부모가, 단계는 자식이 정하면 템플릿 메서드가 된다- 생성자를
private으로 막고static getInstance()로만 만들면 싱글턴이다 implements로 interface 모양을 지키는지 검사할 수 있다(type과 interface). 클래스 상속이 깊어지면 상속보다 위임를 떠올린다