클래스 (접근 제어자, static/readonly)

2022. 12. 26. 18:27프로그래밍/TypeScript

    목차

접근 제어자 (Access Modifiers)

클래스 멤버에서 사용 가능 (속성, 메서드)
클래스/메서드/기타 멤버의 접근 가능성을 설정하는 객체 지향 언어 키워드

 

접근 제어자 의미 범위
public 어디서나 자유롭게 접근 가능
생략 가능
속성, 메서드
protected 자신과 파생된 후손 클래스 안에서 접근 가능 속성, 메서드
private 자신의 클래스 안에서만 접근 가능 속성, 메서드

 

public

class Animal {
  // public 수식어 사용(생략 가능)
  public name: string;
  constructor(name: string) {
    this.name = name;
  }
}

class Cat extends Animal {
  getName(): string {
    return `Cat name is ${this.name}.`;
  }
}

let cat = new Cat('Lucy');
console.log(cat.getName()); // Cat name is Lucy.

 

protected

class Animal {
  // protected 수식어 사용
  protected name: string;
  constructor(name: string) {
    this.name = name;
  }
}

class Cat extends Animal {
  getName(): string {
    return `Cat name is ${this.name}.`;
  }
}

let cat = new Cat('Lucy');
console.log(cat.getName()); // Cat name is Lucy.
console.log(cat.name) // Error. 자신과 파생된 후손 클래스 안에서만 접근 가능

 

private

class Animal {
  // private 수식어 사용
  private name: string;
  constructor(name: string) {
    this.name = name;
  }
}
class Cat extends Animal {
  getName(): string {
    return `Cat name is ${this.name}.`; // Error. 자신의 클래스 안에서만 접근 가능
  }
}
let cat = new Cat('Lucy');
console.log(cat.getName());
console.log(cat.name); // Error. 자신의 클래스 안에서만 접근 가능

 

생성자 메소드에서
인수 타입 선언 + 접근 제어자 사용 시 바로 속성 멤버로 정의 가능
이때 접근 제어자 생략 불가능
class Cat {
  // 생성자 메서드
  // 인수 타입 선언 + 접근 제어자 사용
  constructor(public name: string, protected age: number) {
    // ... 
  }
  getName() {
    return this.name;
  }
  getAge() {
    return this.age;
  }
}

const cat = new Cat('Neo', 2);
console.log(cat.getName()); // Neo
console.log(cat.getAge()); // 2

 

Static / Readonly 키워드

접근 제어자와 함께 사용 가능
단, 접근 제어자를 먼저 작성해야 함
정적 메서드/속성 모두 static사용 가능

 

키워드 의미 범위
static 정적으로 사용 속성, 일반 메서드
readonly 읽기 전용으로 사용 속성

 

static

class Cat {
  // static 속성
  static legs: number = 4;
}
console.log(Cat.legs); // 4

class Dog {
  // static 메서드
  static getLegs() {
    return 4;
  }
}
console.log(Dog.getLegs()); // 4

 

readonly

class Animal {
  readonly name: string;
  constructor(n: string) {
    this.name = n;
  }
}

let dog = new Animal('Charlie');
console.log(dog.name); // Charlie
dog.name = 'Tiger'; // Error. 읽기전용 속성이므로 할당 불가능
// 접근제어자 + static/readonly
// 접근제어자를 먼저 작성해야 함
class Cat {
  protected static eyes = 2;
  constructor(public readonly name: string) {
    //
  }
  private static getLegs() {
    return 4;
  }
}