[TypeScript] Class
class
class Car {
constructor(color) {
this.color = color; // Property 'color' does not exist on type 'Car'
}
}
TS에서 class 사용시 멤버변수는 미리 선언해줘야 한다.
class Car {
color: string;
constructor(color: string) {
this.color = color;
}
start() {
console.log("go");
}
}
const bmw = new Car("red");
접근 제한자(Access modifier)
- public
- private
- protected
멤버변수를 먼저 선언하지 않아도 된다.
class Car {
constructor(public color: string) {
this.color = color;
}
start() {
console.log("go");
}
}
const bmw = new Car("red");
혹은 readonly 를 사용할 수도 있다.
public
자식 클래스나 클래스 인스턴스에서 접근 가능함.
아무것도 표기하지 않고 작성하면 모두 public
class Car {
name: string = "car"; // public이 적용되고 있는 상태
color: string;
constructor(color: string) {
this.color = color;
}
start() {
console.log("go");
}
}
class Bmw extends Car {
constructor(color: string) {
super(color); // super가 아니면 err
}
showName() {
console.log(super.name);
}
}
private
class Car {
private name: string = "car"; // 부모 클래스의 맴버변수에 private를 붙이면
color: string;
constructor(color: string) {
this.color = color;
}
start() {
console.log("go");
// 여기서만 사용 가능
}
}
class Bmw extends Car {
constructor(color: string) {
super(color);
}
showName() {
console.log(super.name); // err - 자식 클래스 내부에서 사용할 수 없게 된다.
}
}
부모 클래스의 맴버변수에 private를 붙이면 자식 클래스 내부에서 사용할 수 없게 된다.
#을 붙여서 사용할 수도 있다. ex) #name, this.#name
protected
자식 클래스 내부에서 참조가능, 클래스 인스턴스로는 불가능
class Car {
protected name: string = "car";
color: string;
constructor(color: string) {
this.color = color;
}
start() {
console.log("go");
}
}
class Bmw extends Car {
constructor(color: string) {
super(color);
}
showName() {
console.log(super.name);
}
}
const z4 = new Bmw("black");
console.log(z4.name); // err - Property 'name' is protected and only accessible within class 'Car' and its subclasses
Static Property
정적 멤버 변수를 만들 수 있다.
class Car {
name: string = "car";
color: string;
static wheels = 4;
constructor(color: string) {
this.color = color;
}
start() {
console.log("go");
console.log(this.wheels); // err -> console.log(Car.wheels);
}
}
class Bmw extends Car {
constructor(color: string) {
super(color);
}
showName() {
console.log(super.name);
}
}
const z4 = new Bmw("black");
console.log(z4.wheels); // err -> console.log(Car.wheels);
static으로 선언한 정적 멤버변수나 메서드는 클래스명을 넣어주어야 한다.
추상 클래스(abstract)
abstract class Car {
name: string = "car";
color: string;
constructor(color: string) {
this.color = color;
}
start() {
console.log("go");
}
}
const car = new Car("red"); // err
class Bmw extends Car {
constructor(color: string) {
super(color);
}
}
new를 통해서 객채를 만들 수 없고 상속을 통해서만 사용이 가능하다
abstract class Car {
name: string = "car";
color: string;
constructor(color: string) {
this.color = color;
}
start() {
console.log("go");
}
abstract doSomething(): void;
}
class Bmw extends Car {
constructor(color: string) {
super(color);
}
doSomething() {
alert(3);
}
}
추상 클래스 내부의 추상 메소드는 반드시 상속받은 쪽에서 구체적인 구현을 해주어야 한다.
추상 클래스는 프로퍼티나 메서드의 이름만 선언해주고 구체적인 기능은 상속받는 쪽에서 구현을 해주도록 한다.
댓글남기기