public,private,protected,static

|

코딩애플강의를 보고 정리했습니다.

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

public, private, protected, static

public

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

class User {
  public name: string;

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

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

참고로, public는 붙이든 안붙이든 똑같다. 필드값을 그냥 만들면 public가 자동으로 부여되기 때문이다.

private

무조건 class{}중괄호 안에서만 수정 및 사용가능하게 만들어준다.
심지어 class로 부터 생산된 자식 object에서도 private이 붙은건 사용불가능하다.(class 중괄호 내부가 아니기 때문)

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; //에러남

그럼 private이 부여된 속성을 class 밖에서 수정해야할 경우 어떻게해야할까?

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()        //가능

class 안에 private이 부여된 속성을 변경해주는 함수를 하나 만들면된다.

protected

private랑 똑같지만(보안), extends된 class안에서도 사용가능하게 약간 보안을 풀어준다.

EX)

// 에러 안남
class User {
  protected x = 10;
}

class NewUser extends User {
  doThis(){
    this.x = 20;
  }
}

class 여러개 만들 때 class끼리 공유할 수 있는 속성을 만들고싶다면 protected를,

class 하나 안에서만 쓸 수 있는 속성을 만들고 싶으면 private를 쓰자.

static

class에 직접 변수나 함수를 부여하고 싶을때 사용

Ex)

class User {
  x = 10;
  y = 20;
}

let john = new User();

john.x; //가능
User.x; //불가능

x와 y같은 변수들은 User로부터 생성된 object들만 사용이 가능하지만, static키워드를 붙이면

class User {
  static x = 10;
  y = 20;
}

let john = new User();

john.x; //불가능
User.x; //가능

john은 사용이 불가능하게되고,
User는 직접 사용이 가능하게된다.

참고로

  • 함수도 static키워드 붙일 수 있다.
  • extends로 class를 복사할 경우 static 붙은 것들도 따라온다.
  • static는 private와 protected,public 키워드와 동시에 사용이 가능하다.
    EX)
class User {
  private static x = 10;
}

static은 언제 쓰일까?

  • class안에 간단한 메모를 할 때
  • 기본 설정 값을 입력할 때
  • class로부터 생성되는 object가 사용할 필요가 없는 변수들을 만들어놓고 싶을 때 등등…

예시)

class User {
  static skill = 'js';
  intro = User.skill + '전문가입니다';
}
var 철수 = new User();
console.log(철수);
  1. User 클래스를 만들고,
  2. 자식들에게 intro를 복사해주고 싶음
  3. js라는 단어가 중요해보여서 static skill 이곳에다가 메모 해놓고 사용
  4. 이제 자식들은 철수.intro 이렇게 사용할때 마다 ‘js 전문가입니다~’를 출력해둔다.

위에선 예시로 static을 사용했지만, constructor()를 사용하는게 더 효율적으로 보인다.