본문 바로가기

자바스크립트

[Javascript] - private, protected

 

실생활 예제

 

- 커피 머신을 예로 들어보자 외형은 굉장히 심플하다.

 

 

 

 

- 하지만 내부를 들여다보면 디테일한 것들이 많다 하지만 이 모든 것들을 알지 못해도 커피 머신을 사용하는데 지장이 없다.

 

- 외형은 단순하지만 커피 머신을 신뢰할 수 있는 이유는 모든 세부 요소들이 기계 내부에 잘 정리되어 숨겨져 있기 때문이다 만약 커피 머신에서 보호 커버를 제거하면 사용법이 훨씬 복잡해지고 위험한 상황이 생길 수 있다 어디를 눌러야 할지 모르고 감전이 될 수 있기 때문이다.

 

- 프로그래밍에서 객체는 커피 머신과 같다.

- 프로그래밍에서 보호 커버를 사용하는 대신 특별한 문법과 컨벤션을 사용해 안쪽 세부 사항을 숨긴다는 점이 다르다

 

내부 인터페이스와 외부 인터페이스

 

- 객체 지향 프로그래밍에서 프로퍼티와 메서드는 두 그룹으로 분류된다

 

1. 내부 인터페이스: 동일한 클래스 내의 다른 메서드에선 접근할 수 있지만 클래스 밖에선 접그할 수 없는 프로퍼티와 메서드

 

2. 외부 인터페이스: 클래스 밖에서도 접근 가능한 프로퍼티와 메서드

 

- 내부 인터페이스의 세부 사항들은 서로의 정보를 이용하여 객체를 동작시킨다

 

- 커피 머신은 보호 커버에 둘러싸여 있기 때문에 보호커버를 벗기지 않고는 커피 머신 외부에서 내부로 접근할 수 없다 밖에선 세부 요소를 알 수 없고 접근도 불가능하다 내부 인터페이스의 기능은 외부 인터페이스를 통해야만 사용할 수 있다

 

- 이런 특징 때문에 외부 인터페이스만 알아도 객체를 가지고 무언가를 할 수 있다 객체안이 어떻게 동작하는지 알지 못해도 괜찮다는 점은 큰 장점으로 작용한다.

 

public과 private

 

- 자바스크립트에서는 public private 두 가지 타입의 객체 필드가 있다.

 

1 public : 어디서든지 접근할 수 있으며 외부 인터페이스를 구성한다.

 

2 private: 클래스 내부에서만 접근할 수 있으며 내부 인터페이스를 구성할 때 쓰인다.

 

- 자바스크립트 이외의 다수 언어에서 클래스 자신과 자식 클래스에서만 접근을 허용하는 Protected 필드를 지원한다

 

- protected 필드는 private와 비슷하지만 자식 클래스에서도 접근이 가능하다는 점이 다르다 protected필드도 내부 인터페이스를 만들 때 유용하다 자식 클래스의 필드에 접근해야 하는 경우가 많기 때문에 protected필드는 private필드보다 조금 더 광범위하게 사용한다 

 

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

 

프로퍼티 보호하기 

 

 

- 간단한 커피 머신 클래스를 만들었다.

 

- 현재 프로퍼티 waterAmount 와 power는 public이다 손쉽게 waterAmount와  power를 읽고 원하는 값으로 변경하기 쉬운 상태이다.

 

- 이러한 waterAmount를 protected로 바꿔서 waterAmount를 통제해보자

- 자바스크립트에서 강제한 사항은 아니지만 밑줄은 프로그래머들 사이에서 외부 ㅈ버근이 불가능한 프로퍼티나 메서드를 나타낼 때 쓰인다.

 

-어제 물의 양을 0미만으로 설정하면 실패한다.

 

읽기 전용 프로퍼티

 

- 위 예제에서 power 프로퍼티를 읽기만 가능하도록 만들어보자 프로퍼티를 생성할 때만 값을 할당할 수 있고 구 이후에는 값을 절대 수정하지 말아야하는 경우가 종종 있는데 이럴 때 읽기 전용 프로퍼티를 활용할 수 있다.

 

 

 

- 읽기 전용 프로퍼티를 만들려면 setter는 만들지 말고 getter만 만들면 된다.

 

getter와 setter

 

 

지금까지 예제에서 get set 문법을 사용해서 getter와 setter 함수를 만들었다 하지만 대부분은 위와 같이 get.../ set... 형식의 함수가 선호된다 

 

- 다소 길어 보이지만 이렇게 함수를 선언하면 다수의 인자를 받을 수 있기 때문에 좀 더 유연하다 

 

- 반면 get set 문법을 사용하면 코드가 짧아진다는 장점이 있다 어떤 걸 사용해야 한다는 규칙은 없기 때문에 원하는 

방식을 선택하면 된다.

 

*protected 필드는 상속된다

 

 

- class MegaMachine extends CoffeeMachine 으로 클래스를 상속받으면 새로운 클래스의 메서드에서 this...waterAmount나 this.power를 사용해 프로퍼티에 접근할 수 있다.

 

private 프로퍼티

 

- private 프로퍼티와 메서드는 #으로 시작한다 #이 붙으면 클래스 안에서만 접근할 수 있다.

 

 

 

- #은 자바스크립트에서 지원하는 문법으로 private 필드를 의미한다 private 필드는 클래스 외부나 자식 클래스에서 접근할 수 없다.

 

-  private 필드는 public 필드와 상충하지 않는다 private 프로퍼티 #waterAmount와 public 프로퍼티 waterAmount를 동시에 가질 수 있다.

 

 

- protected 필드와 달리 private 필드는 언어 자체에 의해 강제된다는 점이 장점이다

 

- 그런데 CoffeeMachine을 상속받는 클래스에선 #waterAmount에 접근할 수 없다 #waterAmount에 접근하려면 waterAmount와 getter와 setter를 통해야 한다.

 

 

 

- 다양한 시나리오에서 이런 제약은 엄격하다 CoffeeMachine을 상속받는 클래스에선 CoffeeMachine의 내부에 접근해야 하는 정당한 사유가 있을 수 있기 때문이다 언어 차원에서 protected 필드를 지원하지 않아도 더 자주 쓰이는 이유가 바로 여기에 있다.

 

 

- 추가적으로 private 필드는 특별하다 알다시피 보통은 this[name] 을 사용해 필드에 접근할 수 있다.

- 하지만 private 필드는 this[name]으로 접근할 수 없다 이런 문법적 제약은 필드의 보은을 강화하기 위해 만들어졌다.