[TIL] 캡슐화와 정보은닉

Kangsick·2022년 1월 19일
0

QnA

목록 보기
2/2

캡슐화

  • 캡슐화(encapsulation)는 객체의 상태(state)를 나타내는 프러퍼티와 프로퍼티를 참조하고 동작할수 있는 동작(behavior)인 메서드를 하나로 묶는 것을 의미
  • 정보은닉(information hiding): 객체의 특정 프로퍼티나 메서드를 감출 목적으로 사용하는 것
    • 외부에 공개할 필요가 없는 구현의 일부를 외부에 공개되지 않도록 참추어 적절치 못한 접근으로 부터 객체의 상태가 변경되는 것을 방지해 정보를 보호, 객체 간의 상호 의존성인 결합도(coupling)를 낮추는 효과가 있음
  • JS에서는 접근 제한자를 제공하지 않고 객체의 모든 프로퍼티와 메서드는 기본적으로 외부에 공개되어 있음(= public)
function Person(name, age) {
  this.name = name; // public
  let _age = age;   // private
  // 인스턴스 메서드
  this.sayHi = function () {
    console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
  };
}
const me = new Person('Yoo', 25);
me.sayHi(); // Hi! My name is Yoo. I am 25.
console.log(me.name); // Yoo
console.log(me._age); // undefined
const you = new Person('Kim', 20);
you.sayHi(); // Hi! My name is Kim. I am 20.
console.log(you.name); // Kim
console.log(you._age); // undefined

name 프로퍼티는 public으로 자유롭게 참조하거나 변경할 수 있지만, _age 변수는 Person 생성자 함수의 지역 변수이므로 Person생성자 외부에서 참조하거나 변경할 수 없는 private이다.

  • 프로토타입 메서드로 변경하여 중복 생성 방지하는 방법
function Person(name, age) {
  this.name = name; // public
  let _age = age;   // private
}
// 프로토타입 메서드
Person.prototype.sayHi = function () {
  // Person 생성자 함수의 지역 변수 _age를 참조할 수 없다
  console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};

지역 변수 _age가 private로 선언되어있어 외부에서 참조하지 못하지는 문제가 발생한다.

  • 프로토타입 메서드를 사용하고, private가 된 변수를 참조 하는 법 =즉시 실행 함수 사용
    • 즉시 실행 함수: 함수 정의와 동시에 즉시 호출되는 함수를 의미
    • 반드시 그룹 연산자 (...)로 감싸야 함
    • (function (){
      var a = 2;
      var b = 5;
      return a*b;
      }());
const Person = (function () {
  let _age = 0; // private
  // 생성자 함수
  function Person(name, age) {
    this.name = name; // public
    _age = age;
  }
  // 프로토타입 메서드
  Person.prototype.sayHi = function () {
    console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
  };
  // 생성자 함수를 반환
  return Person;
}());
const me = new Person('Yoo', 25);
me.sayHi(); // Hi! My name is Yoo. I am 25.
console.log(me.name); // Yoo
console.log(me._age); // undefined
const you = new Person('Kim', 20);
you.sayHi(); // Hi! My name is Kim. I am 20.
console.log(you.name); // Kim
console.log(you._age); // undefined

즉시 실행 함수가 반환하는 Person 생성자 함수와 Person 생성자 함수의 인스턴스가 상속받아 호출할 Person.prototype.sayHi 메서드는 즉시 실행 함수가 끝나고 호출됨

  • Person 생성ㅈㅏ 함수가 여러 개의 인스턴스를 생성할 경우, _age변수의 상태가 유지되지않음
const me = new Person('Yoo', 25);
me.sayHi(); // Hi! My name is Yoo. I am 25.
const you = new Person('Kim', 20);
you.sayHi(); // Hi! My name is Kim. I am 20.
// _age 변수 값이 변경됨
me.sayHi(); // Hi! My name is Kim. I am 20.

프로토타입 메서드가 단 한번 생성되는 클로저이기 때문에 이런 현상이 발생

  • JS는 정보은닉을 완전하게 지원하지않으며, private를 유사하게 사용하여 정보 은닉을 비슷하게 할 수 있지만, 프로토타입 메서드를 사용하면 불가능해짐.
profile
성장하는 프론트엔드 개발자의 길

0개의 댓글