본문 바로가기

JavaScript/JavaScript기초

[Javascript] private, protected

내부, 외부 인터페이스

객체지향 프로그래밍을 할 시에는 외부인터페이스와 내부인터페이스를 구분하는것이 필요함

내부인터페이스는 외부에서 접근이 불가능해야하고 오로지 외부인터페이스를 통해서만 외부에서 접근해야 함

  • 내부 인터페이스(internal interface) : 동일한 클래스 내의 다른 메서드에선 접근할 수 있지만, 클래스 밖에선 접근할 수 없는 프로퍼티와 메서드
  • 외부 인터페이스(external interface) : 클래스 밖에서도 접근 가능한 프로퍼티와 메서드

 

자바스크립트에서는 아래와 같은 2가지 타입의 객체필드가 있음

  • public : 어디에서든지 접근이 가능하고 외부 인터페이스를 구성하는데 사용됨 접근 필드를 명시하지 않을시 디폴트
  • private : 클래스 내부에서만 사용 가능하고 내부 인터페이스를 구성

자바스크립트 이외의 프로그래밍 언어에서는 'protected' 라는 필드를 지원함.

 

protected는 private과 마찬가지로 외부에서 접근이 불가능하지만 private는 자손 클래스에서도 접근이 불가능한 반면 protected는 자손 클래스에서 접근이 가능함.

 

자바스크립트는 protected 필드를 지원하지 않지만, protected를 사용하면 편리한 점이 많기 때문에 이를 모방해서 사용하는 경우가 많음.

 

protect를 사용하여 프로퍼티 보호하기

자바스크립트의 공식적인 문법은 아니지만 외부에서 접근하면 안되는 프로퍼티, 즉 protected 프로퍼티를 만들때 변수명 앞에 '_' 를 붙여서 사용함

class Account{
	
    _amount = 0;
    
    constructor(){}
    
    //getter, setter를 이용하여 _amount를 외부에서 직접 참조하지 않을 수 있음
    setAmount(val){
    	this._amount += val;
    }
    getAmount(){
    	return this._amount;
    }
}

 

읽기전용 프로퍼티 생성

class Account{
	
    //객체 생성 시 한번만 _amount의 값을 초기화
    constructor(val){
    	this._amount = val;
    }
    
    //setter가 없기 때문에 amount의 값을 변경할 수 없음
    getAmount(){
    	return this._amount;
    }
}

let myAccount = new Account(10000);

//amount 의 setter 가 없으므로 error 발생
myAccount.amount = 1000;

 

private

private 프로퍼티나 메서드는 앞에 '#' 을 붙여주어 생성함

class Infomation{
	
    #name ='';
    #number = 0;
    constructor(name,number){
    	this.#name= name;
        this.#number = number;
    }
    
    getName(){
    	return this.#name;
    }
    
    getNumber(){
    	return this.#number;
    }
}

let myInfo = new Infomation("lee",1552);

//getter를 이용하여 private인 #name 값을 호출
console.log(myInfo.getName())

//private프로퍼티를 직접참조할 수 없음
console.log(myInfo.#name);

 

결과

 

private 필드는 자손 클래스에서 직접 참조할 수 없음

 

protect와 private 필드를 가지고 있는 클래스와 그 자손클래스 생성

class Infomation{
	
    //protect 필드
    _name ='park';
    //private 필드
    #number = 1000;
    
}

class MyInfomation extends Infomation{
	
    getParentName(){
		//부모의 _name 프로퍼티 참조
        return this._name;
    }
}

//protect를 참조했을 때는 오류없음
let myInfo = MyInfomation();

 

자손 클래스에서 private 참조

class Infomation{
	
    //protect 필드
    _name ='park';
    //private 필드
    #number = 1000;
    
}

class MyInfomation extends Infomation{
	
    getParentName(){
		//부모의 #name 프로퍼티 참조
        return this.#name;
    }
}

//private를 참조했을 때는 오류발생
let myInfo = MyInfomation();

 

결과

 

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

'JavaScript > JavaScript기초' 카테고리의 다른 글

[Javascript] 콜백  (0) 2021.10.21
[Javascript] Javascript 내장 클래스 확장  (0) 2021.10.18
[Javascript] static 메서드와 프로퍼티  (0) 2021.10.05
[Javascript] 클래스 상속  (0) 2021.10.01
[Javascript] 클래스  (0) 2021.09.30