타입스크립트-public, private, protected 접근제어자

Array.prototype·2022년 11월 30일
0

타입스크립트

목록 보기
3/4

클래스는 다른 클래스를 상속받아 새로운 클래스를 만들어 낼 수 있다. 클래스간 부모, 자식관계의 형성이다.

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 자식클래스에서 접근이 가능하지만 인스턴스에서는 접근할 수 없다.

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키워드가 없기 떄문에 컴파일 단계에서 이 키워드를 삭제한다. 접근제어자는 개발편의성의 목적이다.

클래스의 프로퍼티 선언 2가지 방식

// 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;
}());

명식적으로 프로퍼티를 선언해주는 부분은 초기화를 한후에 인스턴스 생성시의 인자를 재할당하는 부분이 다르다. 이 부분을 염두에 두고 코드를 짜면 좋을 것 같다.

profile
frontend developer

0개의 댓글