Programming/Javascript

[Javascript] protected와 private 멤버

Bam_t 2021. 11. 24. 15:29
728x90

예전에 클래스와 프로토타입을 설명할 때 간단하게 설명했었는데, 미흡한거같아서 추가적으로 포스팅하게 되었습니다.


1. protected와 private 멤버

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

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

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

 

 

 

2. 자바스크립트에서 protected 멤버 이용하기

자바스크립트가 문법적으로 protected 키워드를 지원하는 것은 아니지만 프로그래머들끼리 명시적인 암묵적 약속으로 정의할 수 있습니다. 다음과 같이 protected로 만들고 싶은 멤버앞에 언더 바(_)를 붙여서 이용합니다. 외부에서 접근할 때는 아래 예제와 같이 get/set 함수를 만들어서 접근합니다.

class Student {
    constructor(name, id) {
        this._name = name;
        this._id = id;
    }

    //public 멤버 함수
    getName() {
        return this._name;
    }
    
    //protected 멤버 함수
    _setName(name) {
        this._name = name;
    }
}

 

추가적으로 읽기전용으로만 만들고 싶다면 set메소드를 제외하고 get만 만들어서 이용하면 이 클래스는 읽기 전용이 됩니다.

 

 

3. private 멤버 이용하기

protected가 프로그래머 사이에서 명시를 해서 규칙을 정했다면 private는 정식으로 채택된 문법입니다. 즉, 이 문법이 등장하기 이전에는 protected방식을 private처럼 사용했었지만, 이제는 더 이상 그럴 필요가 없어졌습니다. 이렇게 사용함으로써 사실 마음만 먹으면 얼마든지 접근할 수 있게 만들어버릴 수 있는 protected와 달리 언어 자체에서 접근을 막으므로 더 안전한 private멤버의 선언이 가능해졌습니다.

private는 선언하고자 하는 멤버 앞에 샾(#)을 붙여서 표현합니다.

class Student {
    constructor(name, id) {
        this.#name = name;
        this.#id = id;
    }

    //public 멤버 함수
    getName() {
        return this.#name;
    }
    
    //privated 멤버 함수
    #setName(name) {
        this.#name = name;
    }
}

참조

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes/Private_class_fields

 

Private class fields - JavaScript | MDN

class 의 속성(property)들은 기본적으로 public 하며 class 외부에서 읽히고 수정될 수 있다. 하지만, ES2019 에서는 해쉬 # prefix 를 추가해 private class 필드를 선언할 수 있게 되었다.

developer.mozilla.org

https://ko.javascript.info/private-protected-properties-methods

 

private, protected 프로퍼티와 메서드

 

ko.javascript.info

728x90