Object Oriented Programming

2020. 5. 8. 17:09JavaScript

# Object Oriented Programming (OOP)

 - 객체 지향 프로그래밍

 - 객체 단위로 데이터와 기능을 묶어서 사용

 - class라는 틀에 기본적인 속성, 기능 등을 정의하고 이를 기반으로 instance를 생성 (해당 기능을 가지는 객체를 찍어냄)

 

 

 ## OOP의 특징

   - Encapsulation (캡슐화) :  속성, 메소드 등을 하나의 객체로 묶어 사용하기 때문에, 제 3자가 객체 내부의 데이터를 변조하는 것을 막아줌

   - Inheritance (상속) :  상속을 통해 상위 객체가 가지고 있는 속성을 하위 객체가 이어받을 수 있음

   - Abstraction (추상화) :  해당 객체에서 꼭 필요한 부분만 표현하고, 나머지 세부사항은 감춤

   - Polymorphism (다형성) :  동일한 명령어를 입력해도 상황에 따라 다른 결과값이 나오도록 하며, 상속을 통해 특정 속성, 메소드가 확장되어 다형성을 가질 수 있게 됨

 

 

 ## JavaScript에서 객체 인스턴스를 생성하는 방법들

   1. functional :  모든 속성과 메소드를 함수 내부에 정의하고, 그 함수를 사용해 인스턴스 생성

var Animal = function(name){
    var obj = {};
    obj.name = name;
    obj.eat = function() {
        console.log(this.name + '가 밥을 먹습니다.');
    }
    return obj;
}

var dog = Animal('강아지');
var cat = Animal('고양이');

dog.eat();
// result: 강아지가 밥을 먹습니다.

console.log(cat);   
// result: {name: "고양이", eat: ƒ}

 

 

   2. Functional Shared :  함수 내부에 속성과 메소드를 전부 정의하는 것이 아니라, 메소드를 정의하는 부분을 분리해서 작성한 뒤 마지막에 인스턴스와 메소드를 합치는 방식 (인스턴스들이 각각 메소드를 가지고 있는 것이 아니라, 메소드가 있는 주소값만 참조하기 때문에 메모리 효율이 좋아짐)

var Animal = function(name){
    var obj = {
      name: name
    }
    extend(obj, animalMethod);
    return obj;
}

var animalMethod = {};
animalMethod.eat = function() {
     console.log(this.name + '가 밥을 먹습니다.');
}

var extend = function(instance, method){
    for(var key in method) {
        instance[key] = method[key];
    }
}

var dog = Animal('강아지');
var cat = Animal('고양이');

dog.eat();
// result: 강아지가 밥을 먹습니다.

console.log(cat);   
// result: {name: "고양이", eat: ƒ}

 

 

   3. Prototypal :  Object.create( )를 이용해 속성, 메소드가 들어 있는 객체를 프로토타입으로 해 줌

var Animal = function(name){
    var obj = Object.create(animalMethod);
    obj.name = name;
    return obj;
}

var animalMethod = {};
animalMethod.eat = function() {
     console.log(this.name + '가 밥을 먹습니다.');
}

var dog = Animal('강아지');
var cat = Animal('고양이');

dog.eat();
// result: 강아지가 밥을 먹습니다.

console.log(cat);   
// result: {name: "고양이", eat: ƒ}

 

 

 

   4. Pseudoclassical :  생성자 함수를 작성한 뒤, 함수 밖에서 prototype 키워드를 사용해 메소드를 프로토타입으로 해 줌, 인스턴스를 생성할 때마다 new 키워드를 붙여야 함

var Animal = function(name) {
    this.name = name;
}

Animal.prototype.eat = function() {
    console.log(this.name + '가 밥을 먹습니다.')
}

var dog = new Animal('강아지');
var cat = new Animal('고양이');

dog.eat();
// result: 강아지가 밥을 먹습니다.

console.log(cat);   
// result: {name: "고양이", eat: ƒ}

 

 

   5. ES6 class keyword 사용: 아래 포스팅에 따로 정리해 두었다.

https://lsy26499.tistory.com/29

 

ES6 class, super

# psudoclassical instantation - ES6 class 키워드 등장 이전에 사용되던 방법 - 하나의 인스턴스에 여러 개의 생성자 함수를 연결할 때, prototype 연결을 해 주는 방법으로 Object.create( ) 로 상위 생성자함..

lsy26499.tistory.com

 

 

 

 

 

 

'JavaScript' 카테고리의 다른 글

200611 TIL :: Promise  (0) 2020.06.09
ES6 class, super  (0) 2020.05.08
Closure  (0) 2020.04.28
이벤트 버블링과 캡쳐  (0) 2020.03.26
function method, this  (0) 2020.03.18