[하루 30분 모던 자바스크립트 딥 다이브] 클로저의 캡슐화와 정보은닉

🤔캡슐화? 정보은닉?

  • 캡슐화란 프로퍼티 메서드를 하나로 묵는 것이다.
  • 특정 프로퍼티나 메서드를 은닉하기 위한 목적이다.
  • 정보 은닉은 정보를 보호하고 결합도(coupling, 객체간의 상호 의존성)를 낮추는 효과가 있다.
  • 대부분의 객체 지향 프로그램에선 public, private, protected 같은 접근 제한자를 선언하여 공개 범위를 설정할 수 있다.
  • 자바스크립트에서의 프로퍼티와 메서드는 기본적으로 public상태이다.

🤨자바스크립트에서의 정보은닉

function Person(name, age){
	this.name = name;
	let _age = age;

	this.sayHi = function () {
		console.log(`Hi! My name is ${this.name}. I am ${_age}`)
	}
}

const me = new Person('Lee',20);
me.sayHi(); // Hi! My name is Lee. I am 20
console.log(me.name) // Lee
console.log(me._age) // undefined

const you = new Person('Kim',25);
you.sayHi(); // Hi! My name is Kim. I am 25
console.log(you.name) // Kim
console.log(you._age) // undefined

위의 코드에서 _age 변수는 private하다. 하지만 위의 코드에서 Person 생성자 함수의 sayHi 메서드가 중복 생성된다.

프로토타입을 사용한 중복 생성 방지 410 ~ 412p

  • 위의 예제와 같이 인스턴스를 활용하여 정보은닉을 흉내낼 수 있지만, 중복 생성이 일어난다.
  • 프로토타입을 이용하여 중복방지 생성을 하면 정보은닉이 불가능하다.
  • Symbol, WeakMap을 사용하여 private 프로퍼티를 흉내내기도 했지만 근본적인 해결이 되진 못했다.
  • private필드 정의 제안을 통해 이를 해결할 수 있다!

😀Private filed

class PrivateFiled {
  #privateProperty = 'foo'
  publicPropery = 'bar'
    
  //private instance method
  #privateMethod() {
		return 'Kim'
	}
  publicMethod() {
		return this.#privateProperty;
	}
}

const obj = new PrivateFiled()

console.log(obj.#privateProperty) // Error
console.log(obj.publicPropery) // bar
console.log(obj.publicMethod()) // foo
console.log(obj.#privateMethod()) // Error
  • ‘#’ 해쉬를 통해 private 변수를 만들 수 있다.
  • 메서드를 통해서 private 변수에 접근할 수 있다.
 

Private class fields - JavaScript | MDN

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

developer.mozilla.org