icon

클래스 기본 문법


 타입스크립트에서 클래스는 객체 지향 프로그래밍의 핵심 요소입니다.

 자바스크립트의 클래스 기능을 확장하여 더 강력한 타입 체크와 추가적인 기능을 제공합니다.

 이 절에서는 타입스크립트의 클래스 기본 문법과 주요 특징을 살펴보겠습니다.

클래스 정의와 자바스크립트와의 차이

 타입스크립트 클래스 기본 구조

class Person {
    name: string;
    age: number;
 
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
 
    greet() {
        console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
    }
}

 주요 차이점

  • 멤버 변수의 타입을 명시적으로 선언
  • 접근 제어자 (public, private, protected) 지원
  • 읽기 전용 속성 (readonly) 지원

클래스 멤버 변수

 멤버 변수 선언과 초기화

class Example {
    public name: string;
    private age: number = 0;
    readonly id: number;
 
    constructor(name: string, id: number) {
        this.name = name;
        this.id = id;
    }
}

생성자 메서드와 매개변수 프로퍼티

 매개변수 프로퍼티를 사용한 간결한 초기화

class Person {
    constructor(public name: string, private age: number) {}
 
    greet() {
        console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
    }
}

메서드 정의와 this 사용

 일반 메서드와 화살표 함수 메서드

class Example {
    value: number = 0;
 
    increment() {
        this.value++;
    }
 
    decrement = () => {
        this.value--;
    }
}

 화살표 함수 메서드의 장점

  • this 바인딩 문제 해결

 단점

  • 인스턴스마다 새로운 함수 객체 생성

Getter와 Setter

class Circle {
    private _radius: number = 0;
 
    get radius(): number {
        return this._radius;
    }
 
    set radius(value: number) {
        if (value >= 0) {
            this._radius = value;
        }
    }
 
    get area(): number {
        return Math.PI * this._radius ** 2;
    }
}

정적 프로퍼티와 메서드

class MathOperations {
    static PI: number = 3.14159;
 
    static square(x: number): number {
        return x * x;
    }
}
 
console.log(MathOperations.PI);
console.log(MathOperations.square(5));

추상 클래스

abstract class Animal {
    abstract makeSound(): void;
 
    move(): void {
        console.log("Moving...");
    }
}
 
class Dog extends Animal {
    makeSound(): void {
        console.log("Woof!");
    }
}

 추상 클래스 vs 인터페이스

  • 추상 클래스 : 일부 구현을 포함할 수 있음
  • 인터페이스 : 순수한 추상화, 다중 구현 가능

클래스 상속

class Animal {
    constructor(public name: string) {}
 
    move(distance: number = 0) {
        console.log(`${this.name} moved ${distance}m.`);
    }
}
 
class Snake extends Animal {
    move(distance: number = 5) {
        console.log("Slithering...");
        super.move(distance);
    }
}

 super 키워드 : 부모 클래스의 메서드 호출에 사용

타입스크립트 클래스의 자바스크립트 변환

 타입스크립트 클래스는 자바스크립트의 프로토타입 기반 상속을 사용하여 구현됩니다.

 컴파일 후

  • 클래스는 함수로 변환
  • 정적 멤버는 함수의 프로퍼티로 추가
  • 인스턴스 멤버는 프로토타입에 추가

 성능 고려사항

  • 타입 정보는 런타임에 제거되므로 성능에 영향 없음
  • 클래스 구조는 기존 자바스크립트 엔진에 최적화되어 있음

Best Practices와 디자인 패턴

 1. 단일 책임 원칙 준수

class UserManager {
    private users: User[] = [];
 
    addUser(user: User): void { /* ... */ }
    removeUser(userId: string): void { /* ... */ }
    findUser(userId: string): User | undefined { /* ... */ }
}

 2. 팩토리 패턴

class Car {
    constructor(public make: string, public model: string) {}
}
 
class CarFactory {
    static createCar(make: string, model: string): Car {
        // 여기서 Car 생성 전 추가적인 로직 수행 가능
        return new Car(make, model);
    }
}

 3. 싱글톤 패턴

class Singleton {
    private static instance: Singleton;
 
    private constructor() {}
 
    static getInstance(): Singleton {
        if (!Singleton.instance) {
            Singleton.instance = new Singleton();
        }
        return Singleton.instance;
    }
}

 4. 접근 제어자 적절히 사용

  • private로 내부 상태 보호
  • public 메서드로 인터페이스 제공

 5. 인터페이스 구현을 통한 유연성 확보

interface Printable {
    print(): void;
}
 
class Document implements Printable {
    print() {
        console.log("Printing document...");
    }
}

 타입스크립트의 클래스는 객체 지향 프로그래밍의 핵심 개념을 구현하는 강력한 도구입니다. 자바스크립트의 클래스 기능을 기반으로 하되, 정적 타입 시스템과 추가적인 기능을 제공하여 더욱 안전하고 표현력 있는 코드 작성을 가능하게 합니다.

 클래스 멤버 변수는 클래스 내부에서 명시적으로 선언되며, 타입을 지정할 수 있습니다. 이는 자바스크립트와의 주요 차이점 중 하나로, 코드의 가독성과 타입 안정성을 높입니다. 또한, public, private, protected 같은 접근 제어자와 readonly 키워드를 사용하여 멤버의 가시성과 변경 가능성을 제어할 수 있습니다.

 생성자 메서드는 클래스의 인스턴스를 초기화하는 데 사용됩니다. 타입스크립트에서는 매개변수 프로퍼티라는 특별한 문법을 제공하여 생성자 매개변수를 통해 클래스 프로퍼티를 간결하게 선언하고 초기화할 수 있습니다.

 메서드 정의에 있어 타입스크립트는 일반 함수와 화살표 함수 두 가지 방식을 모두 지원합니다. 화살표 함수를 사용하면 this 바인딩 문제를 해결할 수 있지만, 각 인스턴스마다 새로운 함수 객체가 생성되어 메모리 사용량이 증가할 수 있다는 점을 고려해야 합니다.

 getter와 setter를 사용하면 프로퍼티에 대한 접근을 제어하고 추가적인 로직을 삽입할 수 있습니다. 이는 캡슐화를 구현하고 객체의 내부 상태를 보호하는 데 유용합니다.

 정적 프로퍼티와 메서드는 클래스의 인스턴스가 아닌 클래스 자체에 속합니다. 이들은 유틸리티 함수나 공유 상수를 정의하는 데 유용하게 사용됩니다.

 추상 클래스는 다른 클래스들이 공통으로 가져야 할 기본적인 틀을 제공합니다. 이는 인터페이스와 유사하지만, 일부 구현을 포함할 수 있다는 점에서 차이가 있습니다.

 클래스 상속을 통해 코드 재사용성을 높이고 계층 구조를 만들 수 있습니다. super 키워드를 사용하여 부모 클래스의 메서드를 호출할 수 있으며, 메서드 오버라이딩을 통해 자식 클래스에서 부모 클래스의 동작을 재정의할 수 있습니다.

 타입스크립트 컴파일러는 클래스를 자바스크립트의 프로토타입 기반 상속으로 변환합니다. 이 과정에서 타입 정보는 제거되므로 런타임 성능에는 영향을 미치지 않습니다.

 클래스를 효과적으로 사용하기 위해서는 몇 가지 Best Practices를 따르는 것이 좋습니다. 단일 책임 원칙을 준수하고, 팩토리 패턴이나 싱글톤 패턴 같은 디자인 패턴을 적절히 활용하며, 접근 제어자를 통해 내부 상태를 보호하고 인터페이스를 통해 유연성을 확보하는 것이 중요합니다.

 결론적으로, 타입스크립트의 클래스는 객체 지향 프로그래밍의 강력한 도구로, 타입 안정성과 풍부한 기능을 통해 더 견고하고 유지보수가 용이한 코드를 작성할 수 있게 해줍니다. 이를 효과적으로 활용하면 대규모 애플리케이션 개발에서 큰 이점을 얻을 수 있습니다.