typescript - classes

wj·2023년 6월 30일
0
  • 객체지향 프로그래밍 언어

  • 필드의 보호 등급은 typescript에서만 사용되고 js에서는 보이지 않음

    • public property: 해당 클래스의 프로퍼티를 외부 모든 곳에서 접근이 가능(public 생략 가능)
      (private @@@:string;
      =this.@@@ = @@@;
      인스턴스 밖에서 접근 불가, 다른 자식 클래스에서 접근 불가(상속받더라도)
  • private: 해당 클래스 내에서만 접근 가능

  • protected: 해당 클래스를 상속받은 클래스에서만 프로퍼티에 접근 가능

  • abstract classes(추상 클래스)
    :추상 클래스는 다른 클래스가 상속받을 수 있는 클래스이다.
    하지만 직접 새로운 인스턴스를 만들 수는 없다.(new @@@=)
    abstract 를 사용하면 상속받을 class에 'extends' 를 꼭 추가해주기!
    추상클래스 안에 메소드는 적을 수 없고 call signature만 적어야 함
    자바스크립와 달리 필드가 어떠한 보호 등급인지(접근 제어자), 이름, 그리고 타입을 써주면 compile해줌

ts에선 추상 클래스로 새로운 인스턴스 생성이 불가능 하지만
js에선 에러 없이 생성이 가능하다는 문제가 있다.

추상 클래스에서 위와 같이 메소드를 구현하면 상속받은 클래스는 해당 메소드를 호출할 수 있다.

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

class Player extends User{
// 추상 메서드는 추상 클래스를 상속받는 클래스들이 반드시 구현(implement)해야하는 메서드이다.
    getNickName(){
        console.log(this.nickName)
    }
}

const nico = new Player("nico", "las", "니꼬");

nico.getFullName()
nico.nickName

// new User("nico","las")
  • abstract method(추상 메서드)
    : abstract class에서 상속 받는 모든 것을 구현해야함
    구현이 되어 있지 않은(코드가 없는)메소드
    call signature만 가지고 있고, 함수의 이름과 argument를 안 받을 때도 있지만 argument를 받을 경우 arg의 이름과 타입, 함수의 리턴타입을 정의함
    property를 private으로 만들면 클래스를 상속받더라도 해당 프로퍼티에 접근이 불가능하다.

  • 해시맵 만들기

type Words = {
    //Words타입이 string만을 property로 가지는 오브젝트임을 정의
    //제한된양의 property 혹은 key를 가지는 타입을 정의해주는 방법
    //property의 이름은 모르지만 type을 알고 있을 때 사용가능
    [key: string]: string
}

class Dict {
    private words: Words
    //constructor에서 수동으로 초기화
    constructor(){
        this.words = {}
    }
    // private words: Words = {}; 이렇게 작성하면 constructor필요 없음
    //Word 클래스를 타입으로 사용
    //word는 add 메소드의 파라미터로 전달
    add(word:Word){
    //객체 내의 프로퍼티에 접근 []
        if(this.words[word.term] === undefined){
            this.words[word.term] = word.def;
        }
    }
    //term은 def 메소드의 파라미터로 전달
    //term으로 def를 받아오는 메소드
    def(term:string){
        return this.words[term]
    }
}

class Word {
    constructor(
        public term:string,
        public def :string
    ){}
}

const kimchi = new Word("kimchi","한국의 음식");

const dict = new Dict()

dict.add(kimchi);
dict.def("kimchi")
profile
tistory로 옮겼습니다

0개의 댓글