본문 바로가기

Javascript/TypeScript

[타입스크립트] public, private 키워드를 사용하는 방법

타입스크립트의 장점은 무엇일까? 타입을 지정할 수 있다는 장점이외에도,

자바스크립트에서 쓸 수 없는 문법을 쓸 수 있는 장점이 있다. 어떤 문법을 말하는 것일까? 

자바스크립트에는 존재하지 않는 public, private, protected, static 등등의 키워드들을 사용할 수 있다. 

 

class를 만들어서 개발을 하는 경우가 많다면,

이런 네개의 키워드를 활용해서 더욱 객체지향적인 코드를 짤 수 있다. 


public키워드 사용법 : 

먼저 public에 대해서 알아보자. 

class User {
public name : string

constructor(){
this.name = 'kim'
}

}

이렇게 필드의 값에 public 키워드를 붙일 수가 있다. 

이것을 붙이면 어떤 효과가 있느냐?

이 name 속성을 모든 자식들이 사용할 수 있다. 

let 유저1 = new User('park')
유저1.name = '안뇽';

사실은 이 public키워드는 필드값을 생성할 때, 숨겨져있다. 

그래서 쓰지 않아도 모두 사용되고 있는 기능이라고 생각하면 된다. 

항상 생략이 가능하다는 것을 기억하자. 


private키워드 사용법 : 

이제 중요한 것은 private이다. 

이 private를 붙이면, 자식들은 수정이 불가능해진다. 

class User {
private name : string

constructor(){
this.name = 'kim'
}
}

let 유저1 = new User();
유저.name

이렇게 필드에 생성한 name 속성을 private으로 등록하고나서,

자식이 사용하려고 하면 에러를 내뱉는다. 자식은 사용이 불가능하다. 

class안에서만 수정, 이용 가능하다고 생각하면 된다. 


private 키워드 사용하는 예시를 살펴보자 :

class User{
name : string
private familyName : string = 'kim'

constructor(a){
this.name = this.familyName + a
}
}


let 유저1 = new User('민수')
console.log(유저1)

우리는 통상 본인의 이름을 변경할 수 있지만, 성은 바꾸지 않는다. 그렇기 때문에 familyName에는 private을 걸어두었다. 

그렇기 때문에 여기에 private를 붙이면 된다. 

 

private을 수정하고 싶다면, class안에서만 수정이 가능하다는 점을 명심하자. 

그렇지만 만약에 class 밖에서 수정가능하게 하고 싶다면? 자식들이 familyName을 바꾸고 싶으면? 

그렇게 하고 싶다면, 이름변경함수를 프로토타입으로 생성해두면 된다. 

class User{
name : string
private familyName : string = 'kim'

constructor(a){
this.name = this.familyName + a
}

이름변경함수(){
this.familyName = 'park'
}
}


let 유저1 = new User('민수')
console.log(유저1)

이렇게 프로토타입에 familyName을 수정할 수 있는 메서드를 등록해두었다. 

이렇게한 후 이 함수를 실행하면 familyName을 수정할 수 있다. 

 

이 private키워드는 외부로부터 데이터를 보호하고 싶은 경우가 있다면 유용하게 이용 가능하다. 


public키워드를 사용하는 또 다른 방법 :

본래 constructor안에 속성을 생성하려면, 필드에 값을 만들고, 

constructor안에 속성을 생성해야 한다. 

그런데 public을 사용하면 이 과정을 축약할 수 있다. 

class Person {

constuctor(public name : string){
}

}

let 자식 = new Person ('kim')
console.log(자식) //{name : 'kim'}

위의 코드와 같이 파라미터에 public 키워드를 넣으면 기존에 사용하던 constructor 이용법보다 더 축약된 버전으로 만들 수 있다.