[TypeScript] class에서 사용가능한 public, private, protected, static

sangyong park·2023년 3월 26일
0
post-thumbnail

타입스크립트를 쓰면 자바스크립트에 없는 문법도 사용이 가능하다. 객체지향 언어에서 제공하는 Public, private, static, protected 와 같은 키워드가 사용이 가능하다.

public, private 키워드 사용제한두기

타입스크립트는 class 안에서 public 키워드를 사용가능하다.
원하는 속성 왼쪽에 붙이면 그 속성은 아무데서나 수정이 가능하다.

<script>
class User {
  public name: string;

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

let 유저1 = new User();
유저1.name = 'park';  //가능
</script>

public이 붙은 속성은 자식 object들이 마음대로 사용하고 수정이 가능하다. 사실 public을 붙이든 안붙이든 똑같다. 왜냐면 필드값 같은걸 그냥 만들면 public이 자동으로 왼쪽에 부여된다.

하지만 private 키워드를 붙이면 수정이 불가능해진다. 무조건 class {} 중괄호 안에서만 수정 및 사용이 가능하다. 심지어 class로 부터 생산된 자식 object에서도 private 키워드가 붙은건 사용 불가능하다.

<script>
class User {
  public name :string;
  private familyName :string;  

  constructor(){
    this.name = 'kim';
    let hello = this.familyName + '안뇽'; //가능
  }
}

let 유저1 = new User();
유저1.name = 'park';  //가능
유저1.familyName = 456; //에러남
</script>

private가 붙은 속성들은 오직 class {} 안에서만 수정이 가능하다. 이렇게 속성을 외부에서 숨기고 싶을 때 private 키워드를 이용한다. 오리지널 자바스크립트 문법에서도 #을 속성옆에 붙이면 private 속성이 된다.

private 키워드는 class 내의 함수에도 붙일 수 있다.

private 부여된 속성을 class 밖에서 수정해야 할 경우

<script>
class User {
  public name :string;
  private familyName :string;

  constructor(){
    this.name = 'kim';
    let hello = this.familyName + '안뇽';
  }
  changeSecret(){
    this.familyName = 'park';
  }
}

let 유저1 = new User();
유저1.familyName = 'park';  //에러남
유저1.changeSecret()        //가능
</script>

changeSecret() 함수를 class 안에 만들어준다. 이 함수는 familyName을 수정해주는 함수이다. 그러면 이제 class 바깥에서도 changeSecret() 함수를 이용하면 간접적으로 familyName을 수정 가능하다.

public, private 키워드의 쓰임

<script>
class Person { 
  name;
  constructor ( name :string ){  
    this.name = name;
  } 
}
let 사람1 = new Person('john')


class Person { 
  constructor ( public name :string ){  
  
  } 
}
let 사람1 = new Person('john')
</script>

위 두개의 코드는 같은 역할을 하는 코드이다. constructor 파라미터에 public을 붙이면 this.name = name이 생략이 가능하고, 이제 Person으로부터 새로 생산되는 object들은 name 속성을 가질 수 있다.

class 안에서 쓰는 protected 키워드

protected는 private랑 비슷한 키워드이고, private인데 약간 보안을 해제하고 싶을 때 사용한다. protected를 달아놓으면 private랑 똑같은데 extends 된 class 안에서도 사용이 가능하게 된다.

<script>
class User {
  protected x = 10;
}

class NewUser extends User {
  doThis(){
    this.x = 20;
  }
}
</script>

User를 extends 하는 NewUser class가 있다. NewUser가 x를 가져다 쓰려고 하면 x가 private 속성일 경우엔 에러가 나지만, x가 protected 속성일 경우엔 에러가 나지 않는다.

class를 여러개 만들 때 class 끼리 공유할 수 있는 속성을 만들 때 protected 키워드를 사용하고, class 하나 안에서만 쓸 수 있는 속성을 만들 땐 private 키워드를 사용한다.

class 안에서 쓰는 static 키워드

class 중괄호 안에 집어넣는 변수, 함수는 전부 class로 부터 새로 생산되는 object에 부여된다. 그런데 class에 직접 변수나 함수를 부여하고 싶으면 static 키워드를 왼쪽에 붙여주면 된다.

<script>
class User {
	x = 10;
    y = 20;
}

let yong = new User();
yong.x // 가능
User.x // 불가능
</script>

이런 x와 y같은 변수들은 User로 부터 생성된 object들만 사용 가능하다.

반대로 static 키워드를 사용하게 되면 yong은 사용 불가능하고 User는 직접 사용가능하다. 함수도 static 키워드를 사용이 가능하고 extends로 class를 복사할 경우 static 붙은 것들도 따라온다.

<script>
class User {
	static  x = 10;
    y = 20;
}

let yong = new User();
yong.x // 불가능
User.x // 가능
</script>
profile
Dreams don't run away It is always myself who runs away.

0개의 댓글