본문 바로가기

Programming/Javascript

13. Javascript 객체지향 프로그래밍(4) - 캡슐화 구현 1

javascript logo image

 

 

Javascript 역시 클래스와 같은 일정 단위에서 변수와 메서드 같은 정보 값들에 대한 정보 공개 여부를 결정할 수 있어야 합니다. 일반적으로 JAVA나 C# 등의 언어에서는 public / private와 같은 키워드를 통해서 단위 별 정보 공개 여부를 결정합니다. 하지만 Javascript에는 이러한 키워드를 지원하지 않기 때문에, 다른 방법으로 정보 은닉을 설정해야 합니다. 

 

우선 가장 기본적으로 사용하는 방식은, [var]의 사용입니다. (생성자)함수를 선언할 때, 특정 프로퍼티를 var로 선언하게 되면 이는 다른 OOP 언어들의 private와 같은 역할을 하게 됩니다. 외부에서 직접 접근할 수 없게 되고, get/set 성격의 해당 클래스 내의 메서드를 통해서만 접근할 수 있게 되는 구조를 갖게 됩니다. 

 

var Rapper = function(arg) {
    var rapName = arg ? arg : "MC JOHN DOE";

    this.getName = function() {
        return rapName;
    };

    this.setName = function(arg) {
        rapName = arg;
    };
};

var hype = new Rapper();

console.log(hype.getName());

hype.setName("QM");
console.log(hype.getName());

console.log(hype.rapName);

 

위의 케이스는 기존 예제에서 살펴보았던 생성자 함수 Rapper( )의 사례와 조금 다릅니다. 우선, 가장 큰 차이점은 기존의 this.rapName = arg; 와 같은 형태의 선언이 이루어져 있지 않다는 점입니다. 

 

우리는 캡슐화를 통해서 rapName이라는 프로퍼티에 변수를 통해 직접 접근을 차단하는 구조를 만들어야 합니다. 특히, this 키워드를 기반으로 선언된 프로퍼티가 있다면 이는 new 키워드를 통해 생성된 새로운 객체(외부)에서 직접 접근이 가능하게 되죠? 이 경우, var 키워드를 써서 rapName 프로퍼티를 선언함으로써 이를 private 성격의 변수로 만들었습니다. 

 

그리고 getName( )과 setName( )을 선언하였는데, 이는 public의 역할을 하게 됩니다. 즉, hype.name 이라는 형태로는 해당 프로퍼티에 접근할 수 없으며 getName( ) 또는 setName( ) 메서드를 통해서만 해당 프로퍼티에 접근할 수 있는 구조가 만들어진 것입니다. 이때 getName( )과 setName( ) 일종의 클로저 역할을 하게 됩니다. hype.rapName을 출력해도 undefined만 출력되는 것도 확인할 수 있습니다. 

 

 


 

위의 예제를 다르게 객체 반환의 타입으로 변형해 보겠습니다. 

 

var Rapper = function(arg) {
    var rapName = arg ? arg : "MC JOHN DOE";

    return {
        getName : function() {
            return rapName;
        }, 
        setName : function(arg) {
            rapName = arg;
        }
    };
};

var hype = new Rapper();
// var hype = Rapper();도 가능

console.log(hype.getName());
hype.setName("JAMBINO");
console.log(hype.getName());

 

위의 코드에서는, public 메서드를 하나의 객체에 담아 리턴하는 형태로 구현하였습니다. 반환받은 객체를 통해 public 성격의 메서드를 실행하여 private에 접근할 수 있게 됩니다. 이러한 형태의 '메서드를 포함한 객체 리턴' 형태도 여러 라이브러리에서 응용되어 사용하는 방식이니, 익숙해져 봅시다. 

 

다만, 이 형태의 캡슐화 구조는 한 가지 문제점을 안고 있습니다. 이는 다음 아티클에서 다시 한번 살펴보겠습니다.