참고 사이트
1. introduction-to-object-oriented-programming
2. 위키백과-객체 지향 프로그래밍
3. 위키백과-절차적 프로그래밍
4. Is JavaScript a (True) OOP Language?
객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 속성(properties)과 메소드(method)를 하나의 "객체"(class)에 묶어서 청사진을 만들고, 그 청사진을 바탕으로 인스턴스 객체(instance object)를 만드는 것을 말합니다.
OOP에서 말하는 객체는 자바스크립트에 내장 객체(object)와 다르며, 클래스(class)라고 부릅니다.
OOP는 사람이 세계를 보고 이해하는 방법을 흉내낸 방법론
OOP는 사람이 세계를 보고 이해하는 방법과 매우 흡사 합니다. 클래스(class)와 오브젝트 인스턴스를 실생활과 연관지어 예를 들면 다음과 같이 예를 들 수 있습니다.
class | object instance |
---|---|
사람 | 학생, 선생님, 부모님 |
과일 | 수박, 바나나, 사과, 복숭아 |
도형 | 삼각형, 사각형, 원 |
절차 지향 프로그맹과 다르게 데이터와 기능을 한 곳에 묶어서 처리하기 때문에 강한 응집력(Strong Cohesion)을 갖고, 클래스 간에 독립적인 디자인을 함으로써 약한 결합력(Weak Coupling)을 가진다는 장점을 가지고 있습니다.
프로시저 호출의 개념을 바탕으로 하고 있는 프로그래밍 패러다임
절차적 프로그래밍에서 프로시저와 프로시저의 입력과 출력을 다루는 대신에 객체지향 프로그램들은 객체(classes)들을 다룹니다. 연산은 객체에게 내부 프로시저 중에 하나(혹은 상속받은 것)를 수행하라고 요청하는 것으로 이루어지며 이런 방법으로 내부상태를 다룹니다.
객체 지향 프로그래밍의 기본 특징은 다음과 같습니다.
- 캡슐화 (Encapsulation)
- 추상화 (Abstraction)
- 다형성 (Polymorphism)
- 상속 (Inheritance)
getArea(){ return this.width * this.height }
이라고 정의 되었다면 삼각형과 원의 getArea 메소드는 각각 달라야 할 것 입니다. (삼각형 너비를 구하는 공식은 width*height / 2 이고, 원 너비를 구하는 공식은 원의 반지름 X 원의 반지름 X 원주율 이기 때문입니다.) 이렇게 동일한 메소드라고 하더라도 개별 인스턴스에 따라 다양한 형태를 가질 수 있는 것을 다형성이라고 합니다.
자바스크립트에서 class 키워드와 new 키워드를 사용하여 클래스와 인스턴스를 간단히 만들어 봅시다.
우선 클래스(class)를 만들어 봅시다. 위에서 나온 클래스 Animal을 예를 들어 클래스 객체를 만들어 봅시다. 자바스크립트에서는 class를 만들 때 class
(ES6문법) 라는 키워드를 사용합니다. 클래스명은 명사로 하고, 첫글자를 대문자로 하는 것이 원칙입니다.
다음으로 인스턴스 객체(instance)를 만들어 봅시다. new
키워드를 사용하여 인스턴스를 만들고, 클래스 객체 함수를 호출하면서 인자로 속성을 class constructor에 저장된 순서대로 전달합니다.
자바스크립트의 class는 객체(object) 형식으로 만들어졌으므로 객체를 호출할 때와 같은 방식으로 호출하여 결과값을 얻습니다.
그렇다면 자바스크립트를 객체 지향 프로그래밍이라고 할 수 있을까?
학원에서는 자바스크립트에는 class 개념이 없는 언어이고,(다만 class를 만들 수는 있음) 프로토타입 기반(prototyped-base) 언어이기 때문에 객체지향 언어가 아니라고 했습니다.
반면, 이 포스트의 필자는 자바스크립트가 객체지향언어(Object-Oriented Programming)라고 합니다.
이 필자의 주장을 정리하자면 다음과 같습니다.
- 많은 개발자는 자바스크립트는 class가 개념이 없는 언어이고, OOP 원칙을 준수하지 않기 때문에 진정한 객체지향 언어로 간주하지 않습니다.
OOP 패러다임은 공식적인 문서로 정의된 것이 아니기 때문에 어떤것이 OOP고 어떤것이 아닌지를 전문적인 서류가 없습니다.
- 객체 지향적으로 광범위하게 프로그래밍 언어라고 할 수 있는 조건에는 2가지가 있습니다.
1. 객체(objects)를 통해 문제를 모델화하는 능력이 있는가?
2. 모듈화와 코드 재사용성을 허용하는 몇 가지 원칙을 지원하는가?
- 자바스크립트가 class 개념이 없는 것은 맞지만 자바스크립트 언어를 사용하여 OOP의 기본 특징(캡슐화, 상속화, 다형성)을 구현할 수 있기 때문에 자바스크립트는 객체지향언어라고 할 수 있다. 캡슐화는 getter와 setter, 클로저 활용하여 오브젝트의 내부적인 상태를 정의하고 외부의 엑세스로부터 보호할 수 있으므로 구현할 수 있습니다. 상속은 프로토컬 상속(prototypal inheritance)을 할 수 있으므로 상속을 구현할 수 있습니다. 다형성은 비단 OOP언어에서만 사용되는 것이 아닌 프로그래밍 언어에서 사용될 수 있고, 자바스크립트에서도 다양하게 사용됩니다.
OOP가 되기 위해서는 오브젝트(classes)의 특징들과 원칙들이 요구되는 것이지, 추상적인 클래스가 필수 요구 조건이 아닌 것이다. 따라서 자바스크립트에서, 추상적인 클래스가 없는 것과 OOP 원칙을 유지하는 특성들을 개발자가 사용하거나 하지 않는 것을 자바스크립트가 OOP 언어라고 고려하는 것에 대한 걸림돌이 될 수 없다
결론적으로 위 포스트의 필자가 말하는 사실처럼 OOP 패러다임에 대한 공식적인 문서가 없기 때문에 자바스크립트가 OOP인지 아닌지는 정확한 답이 없을 수도 있을 것 같다. 위 포스팅의 필자(Andrea Chiarelli)처럼 본인의 주장과 주장에 대한 타당한 이유를 대면 될 것 같다.
이 필자의 글을 읽은 후에 나는 자바스크립트가 객체지향언어가 될 수 있다고 생각했다.