[Javascript] protected와 private 멤버 정의

Bam·2022년 3월 1일
0

Javascript

목록 보기
59/106
post-thumbnail

protected와 private

자바계열이나 C계열 언어(자바스크립트도 C계열이지만 예외입니다.)의 멤버들에게는 접근 지정자라고 하는 키워드가 있습니다. public, protected, private 세가지인데요. 이들은 객체 내부의 멤버에 대해서 외부에서 접근할 수 있는 권한을 부여하는 키워드입니다.

우리가 주목해야할 것은 ptrotected와 private인데요. private 멤버는 간단히 말해 클래스, 객체 내부에서만 접근할 수 있고 외부나 상속받은 객체에서는 접근을 불가능하게 만들어주는 요소입니다. 객체는 당연히 외부에서 쉽게 접근을 허용하면 안되기 때문에 일반적으로 대부분의 프로퍼티와 일부 메소드들은 private로 설정하는 편입니다. 그리고 protected는 상속받는 객체에서만 멤버에 접근할 수 있게 만들어주는 접근 지정자입니다. 참고로 public은 어디에서나 접근할 수 있는 접근 지정자입니다.

publicprotectedprivate
클래스 외부OXX
상속받은 클래스OOX
클래스 내부OOO

하지만 자바스크립트에는 이런 접근 지정자 키워드가 존재하지 않습니다. 이 말은 모든 멤버 변수와 함수가 기본값인 public으로 설정되어 있어 모두에게 공개되어있다라고 할 수 있습니다. 이것은 은닉성을 저해하고 코딩 과정에서 실수를 불러 일으킬 수 있기에 이 접근지정자에 대한 문법을 내게되었습니다.

protected 멤버 정의

그렇다면 자바스크립트에서 protected멤버는 어떻게 정의할까요?

자바스크립트에서 protected멤버를 정의하기 위해서 프로그래머 사이의 암묵적 약속을 이용합니다. 바로 protected멤버로 정의하고 싶은 프로퍼티, 메소드 앞에 언더바_를 붙이는 것 입니다. 외부에서 protected 프로퍼티에 접근할 때는 getter/setter를 통해 접근합니다.

class Student {
    constructor(name, id) {
        //protected 프로퍼티들
        this._name = name;  
        this._id = id;
    }

    //public 메소드
    getName() {
        return this._name;
    }
    
    //protected 메소드
    _setName(name) {
        this._name = name;
    }
}

이때 setter없이 getter만 만들어준다면, 해당 클래스를 읽기전용으로 만들 수 있습니다.

private 멤버 정의

앞에서본 언더바를 이용한 protected멤버는 정식 문법도 아니고, 프로그래머 사이의 암묵적 약속이라면, private 멤버는 정식 문법으로 지원하고 있습니다. 이 문법은 ES10에서 추가되었습니다. 그 전까지는 proteced멤버를 암묵적으로 private 멤버로 이용하고 있었습니다.

private 멤버 정의는 멤버 앞에 #을 붙여서 선언합니다.

class Student {
    constructor(name, id) {
        //private 프로퍼티들
        this.#name = name;
        this.#id = id;
    }

    //public 메소드
    getName() {
        return this.#name;
    }
    
    //private 메소드
    #setName(name) {
        this.#name = name;
    }
}

0개의 댓글