Home 자바스크립트 객체지향
Post
Cancel

자바스크립트 객체지향

객체지향 프로그래밍이란 프로그램을 객체들로 구성하고 객체들 간에 서로 상호작용 하도록 작성하는 방법입니다. 객체지향에서 객체란 식별 가능한 구체적인 사물 또는 추상적인 개념이라고 정의합니다. 그리고 객체는 특징적인 행동과 변경 가능한 상태를 가지고 있습니다. 자바스크립트에서 함수 값으로 가지는 속성을 메소드라고 하며 이 메소드를 특징적인 행동 이며 그 외에 다른 값들은 변경 가능한 상태라 볼 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
teacherKim을 객체로 표현합니다.이름과 나이를 속성으로 가지고 있고
자바스크립트를 가르치는 함수를 가지고 있습니다. 
teachJavaScript 메소드는 학생을 매개변수로 정의하고 있으며
teacherKim은 student 객체를 사용합니다.

*/
const teacherKim = {
    name : 'kim',
    age : 30,
    teachJavaScript: function(student){
        student.gainExp();
    }
}

/* 

lee 학생을 객체로 표현합니다. lee 학생은 이름,나이 경험치를 상태로 가지고 있습니다.
경험치를 얻는 함수를 가지고 있습니다. 이 함수를 통해 내부 상태인 경험치를
변경 시킬 수 있습니다.
*/
const studentLee = {
    name : 'lee',
    age : '20',
    exp : 0,
    gainExp : function(){
        this.exp++;
    }
}

console.log(studentLee.exp) <-- 실행결과 0
teacherKim.teachJavaScript(studentLee)
console.log(studentLee.exp) <-- 실행결과 1

객체지향에서는 많은 객체들을 공통적인 특성을 기준으로 묶어서 하나의 타입으로 정의합니다.
이렇게 타입을 정의하는 작업을 분류(calssification)이라고 합니다. 이는 일종의 추상화를 하는 것입니다.
자바스크립트는 프로토타입 기반으로 객체지향 프로그래밍을 지원합니다. 자바의 클래스 기반과의 큰 차이점으로 프로토타입으로 객체에 공통사항을 적용할 수 있습니다. 모든 객체는 다른 객체의 원형(prototype)이 될 수 있습니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const studentProto = {
    gainExp : function(){
        this.exp++
    }
}

const kim = {
    name : 'kim',
    age : 10,
    exp : 0,
    __proto__ : studentProto
}

const lee = {
    name : 'lee',
    age : 20,
    exp : 10,
    __proto__ : studentProto
}

kim.gainExp()
lee.gainExp()
lee.gainExp()
console.log(kim) <-- 실행 결과 exp: 1
console.log(lee) <-- 실행 결과 exp: 12


1 ~ 13 코드 설명
학생의 경험치를 얻는 행위를 gainExp 메소드로 작성한 프로토타입 객체를 정의 합니다. 이름이 kim 이고 나이와 경험치를 가지는 kim 객체를 정의합니다. 자바스크립트에서 __proto__ 속성으로 프로토타입 객체를 정의할 수 있습니다. 모든 자바스크립트 객체는 __proto__ 속성을 가지는데 위에 코드 처럼 별도로 __proto__ 속성에 다른 객체를 할당하지 않으면 기본적으로 Object.prototype 객체가 연결되어 있습니다. kim 객체는 __proto__ 속성에 studentProto 객체를 연결 했기 때문에 경험치를 얻는 행위가 가능하게 됩니다.
14 ~ 19 코드 설명
앞에서 정의한 kim 객체와 유사한 lee 객체를 정의합니다 같은 속성 키를 가지지만 다른 값을 가지고 있습니다. 하지만 lee 객체 또한 __proto__ 속성에 studentProto 객체를 할당함으로써 경험치를 얻는 행위를 할 수 있습니다.
21 ~ 23 코드 설명
kim, lee 객체는 모두 경험치를 얻는 행위를 할 수 있습니다. 왜냐하면 모두 같은 프로토타입 객체에 연결되어 있기 때문입니다.

This post is licensed under CC BY 4.0 by the author.