[노마드코더스] Typescript - classes

Kyoorim LEE·2022년 11월 23일
0

스스로TIL

목록 보기
5/34

객체지향 언어에서는 클래스 내에서 어떤 프로퍼티나 메서드에 접근할 수 있는 지 접근 제한자, 접근 제어기능을 제공하는 경우가 많음

Javascript의 디폴트값은 public 상태이다. 누구나 접근할 수 있는 상태이며 기본적으로 모든 프로퍼티와 메서드는 public 상태라고 보면 된다.

private으로 관리하게 되면 해당 클래스에서만 해당 값에 직접 접근할 수 있게 된다. 상속된 클래스에서도 접근할 수 없다.

protected 해당 필드가 외부로부터는 보호되지만 다른 자식 클래스에서는 사용될 수 있음

class Base {
  private num = 0;
  accessNum() {
    console.log(this.num); // 접근 가능
  }
}
const base = new Base();
console.log(base.num); // ! 외부에선 접근할 수 없음
class Derived extends Base {
  logNum() {
    console.log(this.num); // ! 상속된 클래스에서도 접근할 수 없음
  }
}

[참고 링크] : https://medium.com/hcleedev/web-typescript%EC%9D%98-public-protected-private-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-31e16bc11d32

public & private

class Player {
	constructor (
  		private firstName: string,
        private lastName: string,
        public nickName: string
  ) {}
}

const kyoorim = new Player("kyoorim", "lee", "kyoo");

kyoorim.firstName // 접근 불가능
kyoorim.nickName // 접근 가능

추상 클래스

다른 클래스가 상속받을 수 있는 클래스. 새로운 인스턴스는 만들 수 없음

private & public

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

class Player extends User { // Player가 User을 상속함
}

const kyoorim = new Player("kyoorim", "lee", "kyoo");

kyoorim.nickName // 접근 가능
kyoorim.getFullName() 

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) // protected인 경우 상속된 클래스에서는 접근 가능!
    }
}

const kyoorim = new Player("kyoorim", "lee", "kyoo");

kyoorim.nickName // 접근 가능
kyoorim.firstName // 접근 불가능 - protected도 클래스 밖에서는 접근할 수 없음
kyoorim.getFullName() 

recap

type Words = {
	[key:string] : string
}

class Dict {
	private words: Words // initializer 없이 선언하고
  	constructor () {
    	this.words = {} // constructor에서 수동으로 초기화시켜줌
    }
  	add(word:Word){
    	if(this.words[word.term]=== undefined) { // 해당 단어가 아직 사전에 존재하지 않으면
        	this.words[word.term] = word.def;
        }
    }
  	def(term:string) { // 용어의 def를 찾을 수 있게 함
    	return this.words[term]
    }
}

class Word {
	constructor (
  		public term: string, // public 이지만 수정을 못하게 하려면 => public readonly term: string
        public def : string
  ) {}
}

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

const dict = new Dict()

dict.add(kimchi)
dict.def("kimchi")
profile
oneThing

0개의 댓글