자바스크립트에서의 객체지향프로그래밍, Part 1 : Public/Private 변수와 메소드

이 페이지는 어떻게 자바스크립트에서 클래스의 private 변수와 메소드를 생성하는지 person이라는 간단한 예제를 통하여 보여줍니다. Part 2 는 상속을 다루겠습니다.

요약

예제에서, 사람의 이름(name)과 인종(race)은 태어날때(birth) 값이 정해지며 절대 바뀌지 않는다. person 객체가 생성시에 그 person 객체는 1살의 나이로 시작되며 감춰진 수명(나이)이 정해진다. person 객체는 몸무게(weight)를 가지며 이 값은 먹는행위(eating)(3배의 몸무게 상승)와 운동(exercising)(몸무게 절반 감소)에 의해 변경된다. 매번 먹는행위와 운동하는 행위는 1살 더 나이를 먹게된다. 사람객체는 누구나 수정가능한 clothing 속성을 가지고 있다. 뿐만아니라 dirtyFactor도 수동적으로(더러운것이 묻는다거나 씻는행위) 값을 변경할수 있다. 그러나 dirtyFactor변수는 먹는행위와 운동을 할 때마다 증가하고 shower() 메소드를 사용함으로써 줄일수 있습니다.

<- 클릭하시면 아래의 코드가 실행됩니다 (코드는 Person의 생성자가 실행된 후에 실행될 것이다).

예제코드

function Person(n,race){
	this.constructor.population++;

	// ************************************************************************
	// PRIVATE 변수와 함수
	// PRIVELEGED 메소드만 보기,수정,호출이 가능하다.
	// ***********************************************************************
	var alive=true, age=1;
	var maxAge=70+Math.round(Math.random()*15)+Math.round(Math.random()*15);
	function makeOlder(){ return alive = (++age <= maxAge) }

	var myName=n?n:"John Doe";
	var weight=1;


	// ************************************************************************
	// PRIVILEGED 메소드
	// 어디서든 호출할수 있고 PRIVATE ITEMS에 접근이 가능하다
	// PUBLIC FLAVORS와 함께 변경될수 있다
	// ************************************************************************
	this.toString=this.getName=function(){ return myName }

	this.eat=function(){
		if (makeOlder()){
			this.dirtFactor++;
			return weight*=3;
		} else alert(myName+" 는 먹을수 없습니다, 그는 죽었습니다!");
	}
	this.exercise=function(){
		if (makeOlder()){
			this.dirtFactor++;
			return weight/=2;
		} else alert(myName+" 는 운동할수 없습니다, 그는 죽었습니다!");
	}
	this.weigh=function(){ return weight }
	this.getRace=function(){ return race }
	this.getAge=function(){ return age }
	this.muchTimePasses=function(){ age+=50; this.dirtFactor=10; }


	// ************************************************************************
	// PUBLIC 속성 -- 누구든 읽고 쓸수 있다
	// ************************************************************************
	this.clothing="아무것도입지않음";
	this.dirtFactor=0;
}


// ************************************************************************
// PUBLIC 메소드 -- 누구든 읽고 쓸수 있다
// ************************************************************************
Person.prototype.beCool = function(){ this.clothing="검은 셔츠" }
Person.prototype.shower = function(){ this.dirtFactor=2 }
Person.prototype.showLegs = function(){ alert(this+" 는 다리가 "+this.legs+" 개 입니다") }
Person.prototype.amputate = function(){ this.legs-- }


// ************************************************************************
// PROTOTYOPE 속성 -- 누구든 읽고 쓸수 있다 (overridden 할수 없습니다)
// ************************************************************************
Person.prototype.legs=2;


// ************************************************************************
// STATIC 속성 -- 누구든 읽고 쓸수 있다
// ************************************************************************
Person.population = 0;



// Person 클래스를 사용한 코드
function RunGavinsLife(){
	var gk=new Person("Gavin","caucasian");       // Person 객체의 인스턴스를 생성
	var lk=new Person("Lisa","caucasian");        // Person 객체의 인스턴스를 생성
	alert("현재 "+Person.population+" 명의 사람이 있습니다");

	gk.showLegs(); lk.showLegs();                 // 'this.legs'를 참조할때 모두 'Person.prototype.legs' 변수를 공유한다

	gk.race = "hispanic";                         // 값을 변경하려고 해도 private 'race' 변수는 overwrite 되지 않는다.
	alert(gk+"'의 인종은 "+gk.getRace()+" 입니다");    // 인스턴스 생성시에 지정된 private 'race' 변수로부터 'caucasian'을 리턴한다
	gk.eat(); gk.eat(); gk.eat();                 // 몸무게는 3... 9... 27
	alert(gk+" 는 "+gk.weigh()+" 파운드의 무게가 나가며 dirt factor 는 "+gk.dirtFactor + "입니다");

	gk.exercise();                                // 몸무게 13.5
	gk.beCool();                                  // 옷이 새로운 것으로 변경됩니다.
	gk.clothing="Pimp Outfit";                    // clothing 은 public 변수고 다른 값으로 변경이 가능합니다.
	gk.shower();
	alert("현재의 샤워기술로 "+gk+" 의 dirt factor가 "+gk.dirtFactor + " 이 되었습니다");

	gk.muchTimePasses();                          //50년이 지남
	Person.prototype.shower=function(){           //모두에게 샤워 기술이 향상됨
		this.dirtFactor=0;
	}
	gk.beCool=function(){                         //Gavin 은 혼자서 새로운 패션 아이디어를 얻었다. 
		this.clothing="꽃남방";
	};

	gk.beCool(); gk.shower();
	alert("패셔너블한 "+gk+" 는 "
		+gk.getAge()+" 살이고 지금 "
		+gk.clothing+" 를 입고있으며 dirt factor 는 "
		+gk.dirtFactor+"이다");

	gk.amputate();                                //prototype 메소드를 사용하여 public 속성을 만듭니다
	gk.showLegs(); lk.showLegs();                 //Lisa는 여전히 prototype 속성을 가지고 있다

	gk.muchTimePasses();                          //50년이 지나고... Gavin 은 현재 100살이 넘었다.
	gk.eat();                                     // 나이가 수명을 초과하였고 죽었기 때문에 먹을수 없다.
}

메모

This page copyright ©2003 by Gavin Kistner. Comments, corrections, and criticisms are welcome. 한글 번역 김경민 해석에 오류가 있는 부분 지적해주시면 수정토록 하겠습니다