ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바스크립트 - 객체지향 프로그래밍 - 캡슐화 (1)
    Dev/Javascript 2019. 10. 25. 20:56

    자바스크립트의 캡슐화를 알아보기 전, 객체지향 프로그래밍에서의 캡슐화부터 간단히 짚고 넘어가도록 하겠습니다. 

     

    - 객체지향 프로그래밍에서의 캡슐화란 ?

    비슷한, 관련된 역할을 하는 속성과 메소드들을 하나의 틀(클래스 등) 안에 담는 것을 의미합니다.

     

    - 캡슐화를 왜 할까요?

    결론부터 말씀드리면 가장 중요한 이유는 정보은닉 때문입니다.

    정보은닉이란, 객체에 대한 구체적인 정보를 노출시키지 않도록 하기 위한 기법입니다.

     

    - 예를들면?

    사원의 속성 중에 "월급" 이라는 속성이 있다고 합시다.

    만약 Public으로 누구나 "월급"이라는 속성에 접근할 수 있다면,

    사원.월급 = -500000 와 같은 현실세계에선 불가능한 코드를 작성할 수 있게 되죠.

     

    그러나, 캡슐화를 해서 월급이라는 속성을 직접적으로 접근을 못하게 하고,

    접근하는 방법을  get월급, set월급 이라는 메소드를 통해 접근하게 된다면

    set월급(-500000) 와 같은 코드는 set월급 메소드 구현부에서 미연에 값을 검증할 수 있겠죠? 

     

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

    클래스기반 객체지향 언어인 Java에서는 다음과 같이 캡슐화를 구현했습니다.

    public class Product {
        private String productId;
        private int price;
        
        public String getProductId(){
        	return productId
        }
        
        public String getPrice(){
        	return this.price;
        }
        
        public String setPrice(int price){
        	if(price < 0){	// 이런식으로 Validation 체크가 가능합니다.
            	this.price = 0;
            }
            else {
            	this.price = price;
            }
        }
    }

    그러나 프로토타입 기반 객체지향 언어인 자바스크립트에는 public, private 와 같은 접근제한자가 없지요.

    그렇다고 자바스크립트에서 정보은닉이 불가능한 것은 아닙니다.! 

    다음 예제를 봅시다.

    var Person = function(arg) {
        var name = arg ? arg : "junyoung";
        
        this.getName = function() {
        	return name;
        }
        this.setName = function(arg) {
        	name = arg;
        }
    };
    
    var me = new Person();
    console.log(me.getName());
    me.setName("junyoung han");
    console.log(me.getName());
    console.log(me.name); // undefined

    생성자함수 안에 var로 선언한게 보이시죠?

    만약 this.name으로 선언했다면, 객체의 프로퍼티로 적용되면서,

    인스턴스에서는 me.name처럼 접근 가능했겠지만! (public)

    new로 호출하여 this객체만 리턴을 받았기 때문에, 생성자 함수 안의 var는 외부에서 접근이 불가능하게 되었어요.(private 효과)

     

    하지만, 객체의 프로퍼티인 this.getName, this.setName클로저 역할을 하면서 이미 스코프에서 사라진 name을 참조할 수 있게 했습니다.

     

    이것이 자바스크립트에서 할 수 있는 기본적인 정보 은닉 방법이에요.

     

     

    다음 장에서 이 캡슐화 기법을 이용한 몇가지 패턴과 장단점을 알아보도록 하겠습니다.

     

     

     

     

    댓글

Designed by Tistory.