OOP(객체 지향 프로그래밍)은 개념과 클래스/인스턴스로 나누어서 2부로 다루었다.
객체 지향 프로그래밍, 혹은 OOP(Object Oriented Programming)는 실제 세계에서 사물을 인지하는 방법을 프로그래밍에 접목하려는 패러다임이다. 이러한 개념의 반대는 절차적 프로그래밍(procedural programming)으로, 객체라는 개념 없이 순차적 처리를 중요시하여 프로그램 전체가 유기적으로 연결되어있는 패러다임이다. 이러한 절차적 프로그래밍은 컴퓨터의 처리 구조와 유사해 속도는 빠르지만, 실행 순서에 따라 결과가 달라지고 유지 보수에 어려움이 있었다. 이러한 단점을 보완하고 실제 세계와 더욱 비슷한 접근 방식으로 프로그래밍하기 위해 객체 지향 프로그래밍이 나타나게 된다.
객체 지향 프로그래밍은 다음과 같은 4가지 특징을 가진다.
Inheritance(상속): 상속은 부모 클래스의 특징을 자식 클래스가 물려받는 것으로, 자주 사용하는 클래스의 형태를 특정하면 이를 토대로 파생되는 클래스를 쉽게 작성할 수 있다. 이러한 특징은 다음 자바스크립트에서 '프로토 타입 체이닝'을 통해 구현할 수 있으며, 다음 편에서 자세히 다루었다.
Encapsulation(캡슐화): 캡슐화란 특정 속성과 메소드를 하나의 객체 안에 넣어서 묶는 것으로, '느슨한 결합(loose coupling)'과 '은닉화(hiding)'를 특징으로 한다. '느슨한 결합'은 React_1. 기본 개념에서 다루었듯이, 절차에 상관없이 각각의 코드 묶음이 독립적으로 작동하도록 하여 재사용성을 높이고, 코드가 상징하려는 모습과 최대한 닮게 구성하는 개념이다. '은닉화'는 내부의 데이터나 동작을 외부로 노출하지 않는 것으로, 잘못 사용될 수 있는 객체의 특정 부분을 사용자가 접근하지 못하게 막는 역할을 한다. 예를 들면 숫자를 입력하면 그 숫자만큼 상품이 나오는 자판기가 있다고 할 때, 캡슐화를 통해서 사용자가 음수(비정상적 사용)를 입력하지 못하도록 사전에 방지할 수 있다.
Abstraction(추상화): 추상화는 고차함수에서 다뤘던 것과 같이 내부의 복잡한 구현방식은 숨기고, 실제로 노출되는 부분은 단순화하여 본질에 집중할 수 있도록 돕는 개념이다. 추상화는 캡슐화와 비슷할 수 있다. 그러나 둘은 다른 개념으로, 추상화가 클래스 사용자의 '가독성'을 위한 개념이라면 캡슐화는 비정상적 접근을 막기 위한 '은닉화'를 특징으로 하는 개념이다.
Polymorphism(다형성): 다형성은 같은 메소드라도 다양하게 작동하는 것을 의미한다. 예를 들어 Draw()라는 메소드가 있다고 가정하자. 이러한 메소드는 삼각형 클래스에서 상속을 받던, 동그라미 클래스에서 상속을 받건 상관없이 모두 '그린다'라는 동작을 수행한다. 그러나 같은 메소드를 사용하여도 그 결과는 모두 다르다.
이를 표로 다시 한 번 정리하면 다음과 같다.
특징 | 설명 | 장점 |
---|---|---|
상속 | 부모 클래스의 특징을 자식 클래스가 물려받는 것 | 코드의 반복을 줄임 |
캡슐화 | 특정 속성과 메소드를 하나의 객체로 묶음 | 재사용성 증가, 단순화 |
추상화 | 내부의 복잡한 구현방식은 숨기고 기능만을 노출 | 변화의 영향 최소화, 단순화 |
다형성 | 같은 메소드라도 다양하게 작동 | 조건문의 불필요 |
정확히 말하면 자바스크립트는 프로토타입 기반 객체 지향 언어이다. ES6에서 클래스의 추가를 통해 객체 지향 프로그래밍을 구현하기는 하였지만 실제 JAVA나 C++과 같은 클래스 기반 언어와는 약간의 차이가 있다. 클래스 기반 언어에서 클래스는 해당 객체군을 대표하는 추상적인 개념이며, 인스턴스는 클래스를 기반으로 실체화된 것이다. 반면 프로토타입 기반 언어인 자바스크립트에서는 클래스와 인스턴스의 차이를 두지 않는다. 단지 프로토타입 체이닝으로 속성을 공유하는 객체들만이 있을 뿐이다.
참고
poiemaweb.com - 자바스크립트 객체지향 프로그래밍
MDN - 객체 모델의 세부 사항
달달한 디버깅 블로그