객체지향프로그래밍 in JS

또르르·2021년 1월 14일
0

What is 객체지향 프로그래밍?

자바스크립트는 객체지향언어이다. "객체지향" 이 단어를 이루고 있는 단어들은 우리가 일상생활에서 쉽게 접하는 단어들의 조합이지만, 이러한 전문용어들은 지칭하고 있는 대상의 활용을 알지 않으면 그 뜻을 알기가 어렵다. 프로그램을 구성하는 요소를 각 객체로 나누어 설명할 수 있다고 보는 생각 중 하나이다. 이와 비슷한 명령형 프로그래밍의 개념 중 하나는 절차지향적 프로그래밍으로써 어떠한 프로그램을 하나의 단일체로써 각 단계에서 일어나는 사건을 분리해서 설명하지 않고 순차적 단계로 원테이크 코딩하는 방법이다. 컴퓨터 발명 초기에는 절차지향적 프로그래밍을 했으나, 절차지향적 프로그래밍은 한 번 썼던 코드를 다시 쓰는 것이 어렵고, 수정하기도 불편하여 지금에는 인간에게 더 친밀한 추상화가 가능한 객체지향적 프로그래밍을 쓴다.

객체지향 코딩

객체지향성 코딩은 최종 목표의 객체를 쪼개고 세분화시켜 그것을 이루는 조직들을 하나하나 그룹화 하는 방법이다. 조직을 만드는 과정에서 등장하는 클래스라는 개념은 아직 무엇이 될 지 모르는 점토와 같은 것으로 클래스에 우리가 만들고 싶은 객체의 기본틀을 만들고 나면, 그 후에 색칠을 하거나 더 꾸며서 그 상품을 다른 것과 구분되어 특정하게 만들 수 있다. 마치 어렸을 때 들어봤을 법한 창조주(이 작업에선 우리 프로그래머)가 단 하나의 재료를 가지고 만물을 창조하는 것과 같다. 하지만 컴퓨터와 소통하기 위해서 지켜야할 문법이 있는데, 메서드와 클래스를 쓰는 법이다. JavaScript에서는 쓸 수 있는 메서드와 자주 쓰이는 프로토타입을 정해놨다. (e.g. Array에만 쓰이는 reduce,concat 등...)

JS만의 독창적 특징: 프로토타입 기반 언어

JavaScript는 다른 객체지향 언어와 달리 클래스를 이용하기보다 자체적으로 자주 쓰이는 프로토타입을 설정 되어 있다. ES6문법이 개편되면서 class를 쓰는 문법이 추가 되었지만, 프로토 타입을 쓰는 것이 JS 문법 안에서의 정석이다. class를 쓰기 위해서는 function을 통해 새 객체를 지정하고 자체적으로 쓰고 싶은 메서드를 만들어서 사용해야한다.

Various ways to make new object

코딩하는 방법도 여러가지이듯이 새로운 객체를 생성하는 방법도 여러가지이다.

The 1st way: functional

const Person = function() {
	let physicalFeature = {};
    physicalFeature.eyes = 'dark brown';
    physicalFeature.weight = 50;
    
    physicalFeature.gainWeight = function(num = 1){
    	physicalFeature.weight += num; 
    }
    return physicalFeature;
}

let fDoe = Person();//{eyes: 'dark brown', weight: 50}
fDoe.gainWeight();//result as {..., weight: 51}

The 2nd way: functional shared

이 방법은 위와 비슷하지만, 만들어진 인스턴스들이 만약 똑같은 함수를 공유하고 있다면, 그 메모리를 줄이기 위해서 창안한 방법입니다.

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

const someMethods = {};

someMethods.gainWeight = function(num = 1) {
	this.weight += num;
}

const Person = function() {

    let physicalFeature = {};
    physicalFeature.eyes = 'dark brown';
    physicalFeature.weight = 50;
        
    extend(physicalFeature, someMethods);
    return physicalFeature;
    }

let fDoe = Person();
fDoe.gainWeight();//result as {..., weight: 51}

The 3rd way: Prototypal

이것은 전과 달리 매우 특별한 방법이므로 눈여겨 보셔야 합니다. Object.create을 이용해 객체를 프로토타입객체로 생성해 주는 방법입니다.

const someMethods = {};

someMethods.gainWeight = function(num = 1) {
	this.weight += num;
	}

const Person = function(eyesColor = 'dark brown', weight = 50) {
    let physicalFeature = Object.create(someMethods);
    
    physicalFeature.eyes = eyesColor;
    physicalFeature.weight = weight;
        
    return physicalFeature;
}

let fDoe = Person();
fDoe.gainWeight();//result as {..., weight: 51}

The 4th way:Pseudoclassical

직접적으로 프로토타입을 설정해주는 방법, 하지만 꼭 처음 선언 할 때 new를 붙혀야한다.

const Person = function(eyesColor = 'dark brown', weight = 50) {
    this.eyes = eyesColor;
    this.weight = weight;
}

Person.prototype.gainWeight = function(num = 1) {
	this.weight += num;
	}

let fDoe = new Person();
fDoe.gainWeight();//result as {..., weight: 51}
profile
소프트엔지니어 뉴키즈

0개의 댓글