실생활 예제
- 커피 머신을 예로 들어보자 외형은 굉장히 심플하다.
- 하지만 내부를 들여다보면 디테일한 것들이 많다 하지만 이 모든 것들을 알지 못해도 커피 머신을 사용하는데 지장이 없다.
- 외형은 단순하지만 커피 머신을 신뢰할 수 있는 이유는 모든 세부 요소들이 기계 내부에 잘 정리되어 숨겨져 있기 때문이다 만약 커피 머신에서 보호 커버를 제거하면 사용법이 훨씬 복잡해지고 위험한 상황이 생길 수 있다 어디를 눌러야 할지 모르고 감전이 될 수 있기 때문이다.
- 프로그래밍에서 객체는 커피 머신과 같다.
- 프로그래밍에서 보호 커버를 사용하는 대신 특별한 문법과 컨벤션을 사용해 안쪽 세부 사항을 숨긴다는 점이 다르다
내부 인터페이스와 외부 인터페이스
- 객체 지향 프로그래밍에서 프로퍼티와 메서드는 두 그룹으로 분류된다
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]으로 접근할 수 없다 이런 문법적 제약은 필드의 보은을 강화하기 위해 만들어졌다.
'자바스크립트' 카테고리의 다른 글
[Javascript] - instaceof로 클래스 확인하기 (0) | 2022.10.17 |
---|---|
[Javascript] - require vs import (0) | 2022.10.08 |
[Javascript] - 클래스 상속 (0) | 2022.09.29 |
[Javascript] - 프로토타입 메서드와 __proto__ 가 없는 객체 (0) | 2022.09.06 |
[Javascript] - 네이티브 프로토타입 (0) | 2022.09.04 |