all is well!!

17. [Ts] Abstract class 본문

[Nextjs + Typescript] velog 클론코딩/[ Nextjs + Typescript ] 나를 위한 기록

17. [Ts] Abstract class

tnqlscho 95 2023. 3. 13. 20:58

Abstract class (추상클래스)

Typescript 객체지향 프로그램에서의 추상클래스

abstract class User{
    constructor(
      private firstName: string,  
      private lastName: string,  
      Public nickname: string,  
    ){}
}

class Player extends User{}

const subin = new Player(‘subin’, ‘las’, ‘bin’)

추상클래스는 오직 다른 클래스가 상속받을수 있는 class

직접적으로 extends를 만들지 못한다.

 

만약에

const subin = new User(‘subin’, ‘las’, ‘bin’)

바로 Player 아닌 User 가져오면 에러가 난다.

 

 

Abstract method (추상메소드)

getFullName이라는 method 만들게되면

abstract class User{
    constructor(
      private firstName: string,  
      private lastName: string,  
      Public nickname: string,  
    ){}
    getFullName(){
        return `${this.firstName} ${this.lastName}`
    }
}

class Player extends User{}

const subin = new Player(‘subin’, ‘las’, ‘bin’)

Player은 User에서 getFullName이라는 메소드를 상속받았기 때문에 적용할 수 있다.

 

Abstract method를 만들기 위해서는 method를 추상클래스 안에서 구현하지 않고

Abstract method call signature 적용한다.

 

abstract class User{
    constructor(
      private firstName: string,  
      private lastName: string,  
      Public nickname: string,  
    ){}
    abstract getNickName() : void // 1. 이렇게 Abstract method의 call signature을 만들면
    getFullName(){
        return `${this.firstName} ${this.lastName}`
    }
}

class Player extends User{}// 2. Player에는 getFullName method를 구현해야 한다고 에러가 뜬다.

const subin = new Player(‘subin’, ‘las’, ‘bin’)

그리고 Abstract method(추상메소드)는 Abstract class(추상 클래스)를

상속받는 모든 class들이 구현해야만 하는 method다.

 

그래서 class User로부터 상속받은 class Player안에 메소드를 구현해야 하는데

abstract class User{
    constructor(
      private firstName: string,  
      private lastName: string,  
      Public nickname: string,  
    ){}
    abstract getNickName() : void
    getFullName(){
        return `${this.firstName} ${this.lastName}`
    }
}

class Player extends User{
    getNickName(){
        console.log(this.nickname)
    }
} // private property를 접근했기 때문에 에러가 난다.

const subin = new Player(‘subin’, ‘las’, ‘bin’)

Abstract class에서 상속받은 class에서는 private property는 접근할 수 없다.

그래서 외부로부터 보호되지만 상속받은 class에서 사용하고 싶을때는 private 쓰지않고 protected 쓴다.

abstract class User{
    constructor(
      protected firstName: string,  
      protected lastName: string,  
      protected nickname: string,  
    ){}
    abstract getNickName() : void
    getFullName(){
        return `${this.firstName} ${this.lastName}`
    }
}

class Player extends User{
    getNickName(){
        console.log(this.nickname) // 1. protected property는 상속받은 class안에서 접근가능하다.
    }
}

const subin = new Player(‘subin’, ‘las’, ‘bin’)

subin.getFullName()
subin.firstName // 2. protected property는 class 밖에서는 접근할 수 없다. 그래서 이렇게쓰면 에러가 난다.

 

 

 

 

 

*출처 [노마드코더 ts 강의]

https://nomadcoders.co/typescript-for-beginners/lectures/3679

https://nomadcoders.co/typescript-for-beginners/lectures/3678

 

Comments