객체지향 언어에서는 클래스 내에서 어떤 프로퍼티나 메서드에 접근할 수 있는 지 접근 제한자, 접근 제어기능을 제공하는 경우가 많음
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); // ! 상속된 클래스에서도 접근할 수 없음
}
}
class Player {
constructor (
private firstName: string,
private lastName: string,
public nickName: string
) {}
}
const kyoorim = new Player("kyoorim", "lee", "kyoo");
kyoorim.firstName // 접근 불가능
kyoorim.nickName // 접근 가능
다른 클래스가 상속받을 수 있는 클래스. 새로운 인스턴스는 만들 수 없음
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()
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()
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")