클래스는 다른 클래스를 상속받아 새로운 클래스를 만들어 낼 수 있다. 클래스간 부모, 자식관계의 형성이다.
class Parent {
name = '';
}
class Child extends Parent {
count = 0;
}
const a = new Child()
a.name // 가능하다.
이때 자식클래스는 상속받은 부모클래스의 멤버(변수, 메서드)에 접근해서 사용할 수가 있다. 이를 제한하는 것이 접근제어자 public
private
protected
이다.
위 예제에서 부모클래스의 멤버변수인 name
에 접근제어자 private
을 붙인다면 어떻게 될까?
class Parent {
private name = '';
}
class Child extends Parent {
count = 0;
}
const a = new Child()
a.name
이렇게 private
한 부모클래스의 멤버에 접근하게 될 때는
Property 'name' is private and only accessible within class 'Parent'.
이런 경고문구를 볼 수 있다.
private
Parant 클래스에서만 접근가능하다. public
타입스크립트의 기본적인 모든 멤버의 접근권한protected
자식클래스에서 접근이 가능하지만 인스턴스에서는 접근할 수 없다.class Parent {
protected name = '';
}
class Child extends Parent {
count = 0;
changeName() {
this.name = 'aaa'
}
}
const a = new Child()
a.name
// 인스턴스에서 접근한 것이므로 protected에 접근불가
// Property 'name' is protected and only accessible within class 'Parent' and its subclasses. 라는 오류를 표시함
a.changeName() // name은 'aaa'로 바뀐다
자바스크립트는 private, protected키워드가 없기 떄문에 컴파일 단계에서 이 키워드를 삭제한다. 접근제어자는 개발편의성의 목적이다.
// Version 1
class Person {
name = '';
private age = 0;
constructor(name: string, age: number) {
this.name = name;
this.age = age
}
}
// Version 2
class Person2 {
constructor(public name:string, private age: number){}
}
명식적으로 선언해주느냐 암시적으로 선언해주느냐의 차이인데 약간의 차이는 있는게 이 타입스크립트 코드를 컴파일해보면
var Person = /** @class */ (function () {
function Person(name, age) {
this.name = '';
this.age = 0;
this.name = name;
this.age = age;
}
return Person;
}());
var Person2 = /** @class */ (function () {
function Person2(name, age) {
this.name = name;
this.age = age;
}
return Person2;
}());
명식적으로 프로퍼티를 선언해주는 부분은 초기화를 한후에 인스턴스 생성시의 인자를 재할당하는 부분이 다르다. 이 부분을 염두에 두고 코드를 짜면 좋을 것 같다.