[typescript] 10. class 접근 제한자
1. typescript에서 사용 가능한 접근 제한자
1) 개념
접근 제한자는 속성 또는 method를 사용하기 위한 접근을 제한하겠다는 의미입니다.
2) 사용 이유?
사용하는 이유는 프로그램의 버그를 줄이고자 사용한다고 볼 수 있습니다. 왜냐하면 개발자들이 다른 사람이 만든
class의 모든 것을 제어할 수 있으면 의도치 않게 버그가 발생할 수 있습니다. 그래서 접근 제한자를 사용하여
내가 만들 class를 다른 사람이 함부로 중요한 값을 수정하지 못하게 막는 것입니다.
3) 접근 제한자의 종류는 다음과 같습니다.
- 기본 접근 제한자는 public입니다.
접근 제한자 | 특징 | 상속 여부 | instance를 통한 접근 |
public | public으로 설정된 "속성, method"는 자식 class에서 접근 가능 | O | O |
protected | protected로 설정된 "속성, method"는 자식 class에서 접근 가능 | O | X |
private |
private로 설정된 "속성, method"는 현재 class에서만 접근 가능 자식 class에서는 접근 불 가능 |
X | X |
readonly |
읽기 전용으로 속성을 변경합니다. |
O | O |
2. 접근 제한자 사용법
- 모든 접근 제한자는 속성 및 method 그리고 생성자 함수의 매개변수 앞에서 사용 가능합니다
1) public
- public이 붙은 속성과 method는 자식 class와 부모 class에서 모두 사용할 수 있습니다.
- 자식 class의 instance는 부모와 자식 class의 모든 속성 및 method를 사용할 수 있습니다.
/**
* 부모 class
*/
class Gun {
public magazine: number; // 탄창
constructor() { this.magazine = 4; }
public shot() {
console.log("빵야!!!");
}
}
/**
* 자식 class
*/
class SniperGun extends Gun {
constructor() {
super();
}
public info () {
console.log("sniper의 탄창은 " + this.magazine + "개 입니다");
}
}
let snipergun = new SniperGun();
// 자식 method 사용 가능
snipergun.info();
// 부모 method사용
snipergun.shot();
2) protected
- protected가 붙은 속성과 method는 부모 class와 자식 class에서 사용 가능합니다.
- 자식 class의 instance는 부모 class의 속성과 method를 사용할 수 없습니다.
/**
* 부모 class
*/
class Gun {
public magazine: number; // 탄창
constructor() { this.magazine = 4; }
protected shot() {
console.log("빵야!!!");
}
}
/**
* 자식 class
*/
class SniperGun extends Gun {
constructor() {
super();
}
public info () {
console.log("sniper의 탄창은 " + this.magazine + "개 입니다");
}
}
let snipergun = new SniperGun();
// 자식 method 사용 가능
snipergun.info();
// 부모 method 사용 불가!!!
snipergun.shot();
3) private
- private 접근 제한가 붙은 속성과 method 해당 class에서만 사용 가능합니다.
/**
* 부모 class
*/
class Gun {
private magazine: number; // 탄창
constructor() { this.magazine = 4; }
private shot() {
console.log("빵야!!!");
}
}
/**
* 자식 class
*/
class SniperGun extends Gun {
constructor() {
super();
}
public info () {
console.log("sniper의 탄창은 " + this.magazine + "개 입니다");
}
}
let snipergun = new SniperGun();
// 자식 method 사용 가능
snipergun.info();
// 부모 method사용
snipergun.shot();
4) readonly
(1) 언제 사용?
- 변경되면 안 되는 속성 지정할 때 사용합니다.
(2) 특성 정리 (typescript Quick start 부분 정리)
특성 | const | readonly |
상수선언 | 가능 | 가능 |
초기화 강제성 | 있음 | 없음 |
값 재할당 | 불가능 |
초기화 및 생성자 함수에서만 가능함 그외에는 불가능 |
선언 가능한 대상 |
전역 변수, 클래스 메서드의 변수, 함수의 변수 |
interface의 멤버 변수, class의 속성, 객체 리터럴의 속성, 새롭게 정의하는 타입 |
선언 불가능한 대상 | interface의 멤버 변수, class의 속성, 객체 리터럴의 속성 |
전역 변수, 메서드의 변수, 함수의 변수 |
사용 용도 | 상수 | 일기 전용 속성 |
컴파일 후 선언의 유지 여부 | 유지됨(ES6인 경우) | 사라짐 |
지원 표준 | ES6 | 없음(typesecript 2.0에서 등장) |
- 다음 Code에서 readonly magazine 속성은 자식 class에서 속성 값 변경이 불 가능합니다.
/**
* 부모 class
*/
class Gun {
readonly magazine: number; // 탄창
constructor() { this.magazine = 4; }
public shot() {
console.log("빵야!!!");
}
}
/**
* 자식 class
*/
class SniperGun extends Gun {
constructor() {
super();
}
public info () {
this.magazine = 8; // 변경 불가
console.log("sniper의 탄창은 " + this.magazine + "개 입니다");
}
}
let snipergun = new SniperGun();
// 자식 method 사용 가능
snipergun.info();
// 부모 method사용
snipergun.shot();
3. 접근 제한자를 생성자 함수 매개 변수에 사용 시 나타는 효과
- 접근 제한자를 생성자 함수 매개 변수에 사용 시, 해당 매개 변수는 class의 속성이 됩니다.
- 다음 코드에서 magazine 속성을 선언한 적 없지만 public 접근 제한자를 사용하여 class의 속성으로 만들었습니다.
- protected, private, readonly 접근 제한도 동일한 효과를 냅니다.
/**
* 부모 class
*/
class Gun {
constructor(public magazine: number ) { this.magazine = 4; }
shot() {
console.log("빵야!!!");
}
}
/**
* 자식 class
*/
class SniperGun extends Gun {
constructor() {
super(4);
}
public info () {
console.log("sniper의 탄창은 " + this.magazine + "개 입니다");
}
}
[typescript] 10. super VS this, setter/ getter
1. this와 super의 차이
1) this
- 현재 class를 가리키는 참조 변수입니다.
- 현재 class 및 부모 class의 속성 및 method에 접근할 수 있습니다.
단, 부모 Class의 private 접근 제한자를 가진 속성 및 method는 사용할 수 없습니다.
2) super
- 부모 class를 가리키는 참조 변수입니다.
- public 또는 protected로 상속받은 method만을 사용할 수 있습니다. 속은 직접 적근이 불 가능합니다. 그래서
getter나 setter를 이용하여 속성을 제어해야 합니다. 다음 2번에서 getter와 setter를 설명하겠습니다.
- 사용 이유?
(1) 자식 , 부모 class의 속서 및 method 구분을 하는 데 사용합니다.
(2) overrding 할 때 편하게 하기 위해서 사용 가능합니다.
/**
* 부모 class
*/
class Gun {
constructor(public magazine: number ) { this.magazine = 4; }
shot() {
console.log("빵야!!!");
}
//setter
set magazineCount(value: number) { this.magazine = value; }
//getter
get magazineCount() { return this.magazine; }
}
/**
* 자식 class
*/
class SniperGun extends Gun {
constructor() {
super(4);
}
public info () {
console.log("sniper의 탄창은 " + this.magazine + "개 입니다");
super.magazineCount = 8;
console.log("sniper의 탄창은 " + super.magazineCount + "개 입니다");
}
}
let snipergun = new SniperGun();
// 자식 method 사용 가능
snipergun.info();
2. setter와 getter
1) 개념
setter와 getter은 자식 class에서 부모 class의 속성을 집접 접근을 막기 위해서 사용합니다. 즉, setter, getter 함수를
사용해서 변경할 수 있도록 하는 것입니다.
2) 사용 이유
class의 잘못된 사용을 막기 위한 수단으로 사용됩니다.
3) 사용 방법
- setter의 경우 함수명 앞에 set을 붙여주면서 특정 속성 한 개의 값을 변경시켜 줄 수 있게 해야 합니다.
- getter의 경우 함수명 앞에 get을 붙여주면서 특정 속성 한 개의 값을 반환하게 해 주면 됩니다.
(1) setter
A. 정의
set 함수명(vlaue: type) { this. 속성 = value; }
B. 사용법
- super. 함수명 = value;
- this. 함수명 = value;
(2) getter
A. 정의
get 함수명() { return this. 속성; }
B. 사용법
- super. 함수명;
- this. 함수명;
4) 예제 코드
/**
* 부모 class
*/
class Gun {
constructor(public magazine: number ) { this.magazine = 4; }
// setter 정의
set magazineCount(value: number) { this.magazine = value; }
// getter 정의
get magazineCount() { return this.magazine; }
}
/**
* 자식 class
*/
class SniperGun extends Gun {
constructor() {
super(4);
}
public info () {
// getter 사용
console.log("sniper의 탄창은 " + super.magazineCount + "개 입니다");
// settern 사용
super.magazineCount = 8;
// getter 사용
console.log("sniper의 탄창은 " + super.magazineCount + "개 입니다");
}
}
'ProgrammingLang > typescript' 카테고리의 다른 글
[typescript] 12. interface 와 추상 class 차이 (0) | 2019.05.06 |
---|---|
[typescript] 11. 오버라이딩과 오버로딩 그리고 추상 class (0) | 2019.05.05 |
[typescript] 9. class 상속과 포함 관계 (0) | 2019.05.01 |
[typescript] 8. class 와 instance (0) | 2019.05.01 |
[webpack] 에러 발 생시 해결 방법 (0) | 2019.04.21 |