ProgrammingLang/typescript

[typescript] 10. class 접근 제한자, super VS this, setter/ getter

jinkwon.kim 2019. 5. 4. 20:12
728x90
반응형

[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 + "개 입니다");
    }
}

 

728x90
반응형