본문 바로가기
javaScript

캡슐화 자바스크립트에서 사용방법

by mooyou 2023. 12. 11.
728x90
300x250

캡슐화(Encapsulation)는 객체 지향 프로그래밍(OOP)에서 중요한 개념 중 하나로, 데이터와 그 데이터를 다루는 메서드(함수)를 하나의 단위로 묵는것을 말한다. 이는 객체의 상태를 외부에서 직접 접근하지 못하도록 하고, 오직 정의된 메서드를 통해서만 상태를 조작하도록 하는 것을 의미한다. 이로써 코드의 유지보수성이 증가하고, 객체의 내부 구현이 외부로부터 감춰지면서 한전성이 향상된다.

 

자바스크립트에서의 캡슐화

자바와 같은 언어에서는 명시적 접근 지정자를 사용하여 클래스의 멤버에 대한 접근을 제어한다.

하지만 자바스크립트에서는 명시적 접근 지정자를 지원하지 않기때문에 비슷하게 흉내 내어 사용할 수 있다.

 

접근 지정자 자바스크립트 자바스크립트 표현 방법
public 지원(기본) 프로퍼티
메서드
protected 미지원 _프로퍼티
_메서드
private 미지원 _프로퍼티
_메서드

 

 

function Car(make, model) {
  // _로 시작하는 변수와 메서드는 일반적으로 내부에서만 사용되어야 함을 나타냅니다.
  this._make = make;
  this._model = model;
  let _mileage = 0;

  // 내부에서만 사용되는 메서드
  function _drive(distance) {
    _mileage += distance;
  }

  // 외부에서 호출 가능한 메서드
  this.getMake = function () {
    return this._make;
  };

  this.getModel = function () {
    return this._model;
  };

  this.drive = function (distance) {
    _drive(distance);
  };

  this.getMileage = function () {
    return _mileage;
  };
}

const myCar = new Car('Toyota', 'Camry');
console.log(myCar.getMake()); // Toyota
console.log(myCar.getModel()); // Camry
myCar.drive(100);
console.log(myCar.getMileage()); // 100
console.log(myCar._mileage); // undefined (_mileage는 외부에서 직접 접근 불가)

 

자바스크립트에서는 객체 외부에서 접근하지 못하게 하는 접근 지정자 private와 protected 대신 요소 이름 앞에 _를 붙여 만들어서 사용한다. _을 사용할 경우 해당 멤버가 클래스 객체의 내부에서만 사용되어야 하며 외부에서는 직접적인 조작을 피해야 한다는 것을 나타낸다.

하지만 이 방법은 단순한 관례적인 표현이고 실제로 접근을 막는다거나 하는 기능을 하지는 않는다.

명시적 접근 제한이 필요한 경우 클로저, 프로토타입 체인 등의 메커니즘을 통해서 비슷한 효과를 얻을 수도 있다.

 

1. 클로저 : 클로저는 함수와 그 함수가 선언된 렉시컬 스코프 사이의 관계를 나타낸다. 함수 내부에 선언된 변수는 외부에서 접근할 수 없다. 이 특성을 이용하여 캡슐화를 구현할 수 있다.

 

function createCounter() {
  let count = 0;

  return {
    increment: function() {
      count++;
    },
    decrement: function() {
      count--;
    },
    getCount: function() {
      return count;
    }
  };
}

const counter = createCounter();

counter.increment();
counter.increment();
console.log(counter.getCount()); // 2

 

2. 프로토타입을 이용한 캡슐화 : 프로토타입을 이용하여 특정 메서드나 프로퍼티를 숨기고, 외부에서 접근할 수 없도록 할 수 있다.

function Car(make, model) {
  // _로 시작하는 변수와 메서드는 일반적으로 내부에서만 사용되어야 함을 나타냅니다.
  this._make = make;
  this._model = model;
  let _mileage = 0;

  // 내부에서만 사용되는 메서드
  function _drive(distance) {
    _mileage += distance;
  }

  // 외부에서 호출 가능한 메서드
  this.getMake = function () {
    return this._make;
  };

  this.getModel = function () {
    return this._model;
  };

  this.drive = function (distance) {
    _drive(distance);
  };

  this.getMileage = function () {
    return _mileage;
  };
}

const myCar = new Car('Toyota', 'Camry');
console.log(myCar.getMake()); // Toyota
console.log(myCar.getModel()); // Camry
myCar.drive(100);
console.log(myCar.getMileage()); // 100
console.log(myCar._mileage); // undefined (_mileage는 외부에서 직접 접근 불가)

 

 

728x90
반응형

'javaScript' 카테고리의 다른 글

Object.create()  (0) 2023.12.25
js에서 클래스 상속  (0) 2023.12.19
접근 지정자(Access Modifiers)  (0) 2023.12.08
자바스크립트에서 추상화  (0) 2023.12.07
UML 다이어그램  (0) 2023.12.06

댓글