→ 속성 또는 메소드로의 접근을 제한하기 위해 사용.
타입스크립트에는 3종류의 접근 제어자가 존재함.
public > protected > private
Java와 다르게 package 개념이 없어 default 접근 제어자는 존재하지 않음.
→ 프로그램 내에서 선언된 멤버들이 자유롭게 접근할 수 있음.
타입스크립트에서 멤버는 기본적으로 public
으로 선언됨.
명시적으로 멤버를 public
으로 표시할 수도 있음.
class Animal {
public name: string
constructor(theName: string) {
this.name = theName;
}
}
newAnimal("Cat").name;
→ 멤버가 포함된 클래스 외부에서의 접근을 막음.
class Animal {
private name: string
constructor(theName: string) {
this.name = theName;
}
}
newAnimal("Cat").name; // Error, name 필드는 private로 선언되었기 때문에 에러가 발생함.
→ 멤버가 포함된 클래스와 그 하위 클래스 외부에서의 접근을 막음.
class Animal {
protected name: string
constructor(theName: string) {
this.name = name;
}
}
class Employee extends Person {
private department: string;
constructor(name: string, department: string) {
super(name);
this.department = department;
}
public getElevatorPitch() {
return 'Hello, my name is ${this.name} and I work in ${this.department}.';
}
}
let howard = new Employee("Howard", "Sales");
console.log(howard.getElevatorPitch());
console.log(howard.name); // Error, name 필드는 protected로 선언되었기 때문에 에러가 발생함.
Employee
클래스는 Person
부모 클래스를 상속받았고 Person
클래스의 name
필드엔 protected
접근 제어자가 선언되어 있음. 따라서 Employee
자식 클래스는 this.name
연산자를 통해 Person
클래스의 name 필드를 재사용 할 수 있음. 하지만 protected
접근 제어자가 선언되었기 때문에 외부에서 직접적으로 접근할 시 에러가 발생함.→ OOP는 상속을 이용하여 존재하는 클래스를 확장해 새로운 클래스를 생성할 수 있음.
class Animal {
move(distanceInMeters: number) {
console.log('Animal moved ${distanceInMeters}m.');
}
class Dog extends Animal {
makeSound() {
console.log("멍멍!");
}
}
class Cat extends Animal {
makeSound() {
console.log("야옹!");
}
}
const dog = new Dog();
dog.move(10);
dog.makeSound();
const dog = new Cat();
cat.move(5);
cat.makeSound();
Animal
이라는 기초 클래스에서 Dog
클래스가 파생됨. Dog
, Cat
클래스는 Animal
클래스를 상속받았기 때문에 Animal
클래스의 move 메소드를 확장하여 재사용 할 수 있음.