본문 바로가기
TypeScript

[TypeScript] 타입스크립트 클래스

by 깅민 2025. 5. 26.

1. 접근제어자

타입스크립트의 클래스에서는 자바처럼 접근제어자를 사용할 수 있습니다.

 

public private protected
모든 범위에서 접근 클래스 내부에서만 접근 클래스 내부 + 자식  클래스 접근

 

1-1. public

class Bus {
  name: string;
  public age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}

const bus = new Bus("1", 10);

console.log(bus.name); // 1
console.log(bus.age); // 10

 

아무것도 작성하지 않으면 public 입니다.

1-2. private

class Bus {
  name: string;
  private age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}

const bus = new Bus("1", 10);

console.log(bus.name); // 1
console.log(bus.age); // 에러

 

진짜 실행되지 않는 건 아닙니다.

컴파일 시점에만 에러라고 표시해주죠.

 

자바스크립트로 컴파일하면 이렇게 바뀌기 때문입니다.

class Bus {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
}
const bus = new Bus("1", 10);
console.log(bus.name); // 1
console.log(bus.age); // 10
export {};

 

정말로 접근을 제한하고 싶다면 # 문법을 쓸 수 있습니다.

이건 정말로 에러가 납니다.

class Bus {
  name: string;
  #age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.#age = age;
  }
}

const bus = new Bus("1", 10);

console.log(bus.name); // 1
console.log(bus.#age); // 에러

 

1-3. protected

protected 는 자식클래스 외부에서 사용하려고 하면 에러가 발생합니다.

class Bus {
  name: string;
  protected age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}

class SeatedBus extends Bus {
  getAge() {
    return this.age;
  }
}

const bus = new SeatedBus("1", 10);

console.log(bus.name); // 1
console.log(bus.age); // 에러
console.log(bus.getAge()); // 10

 

1-4. 생성자의 접근제어자

생성자에 접근제어자를 사용할 수 있습니다.

하지만 생성자에 설정하면 동일한 필드를 만들어 주기 때문에

동일한 이름의 필드를 만들 수 없습니다.

이를 활용하여 다음과 같이 사용합니다.

 

class Bus {
  constructor(private name: string, public age: number) {}
}

const bus = new Bus("1", 10);

console.log(bus.age); // 10

 

2. 추상 클래스

추상 클래스는 abstract 키워드로 만들 수 있습니다.

추상 메서드는 구현부가 없습니다.

 

추상 메서드를 구현하지 않으면 에러가 납니다.

abstract class Logger {
  log(msg: string) {
    this.write(msg);
  }

  abstract write(msg: string): void;
}

class GeneralLog extends Logger {
  constructor() {
    super();
  }
  write(msg: string): void { // 구현하지 않으면 에러
    console.log("추상메서드", msg);
  }
}

const log = new GeneralLog();

log.write("test"); // 추상메서드 test

 

 

3. 인터페이스의 활용

인터페이스는 자바 처럼 필요한 것들을 만들어 두고

반드시 이 조건을 만족하는 객체들을 생성하게 할 수 있습니다.

클래스를 구현한다고 하죠.

 

extends가 아니라 implements를 사용합니다.

 

인터페이스는 public 접근제어자만 사용 가능합니다.

이 인터페이스를 구현한 클래스는 접근제어자를 맞춰줘야 합니다.

 

public name: string

private name: string으로 하면 에러가 발생합니다.

interface Vehicle {
  name: string;
  age: number;
}

class Bus implements Vehicle {
  constructor(public name: string, public age: number) {}
}

const bus: Bus = new Bus("좌석버스", 10);
console.log(bus.age); // 10