[ JavaScript ] 객체 지향 프로그래밍(Object-Oriented Programming, OOP)

양찌·2021년 7월 19일
1

JS

목록 보기
10/11
post-thumbnail

참고 사이트
1. introduction-to-object-oriented-programming
2. 위키백과-객체 지향 프로그래밍
3. 위키백과-절차적 프로그래밍
4. Is JavaScript a (True) OOP Language?



객체 지향 프로그래밍(Object-Oriented Programming, OOP)

의미

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 속성(properties)과 메소드(method)를 하나의 "객체"(class)에 묶어서 청사진을 만들고, 그 청사진을 바탕으로 인스턴스 객체(instance object)를 만드는 것을 말합니다.

OOP에서 말하는 객체는 자바스크립트에 내장 객체(object)와 다르며, 클래스(class)라고 부릅니다.

  • < class와 instane object의 예시 >



의의

OOP는 사람이 세계를 보고 이해하는 방법을 흉내낸 방법론

OOP는 사람이 세계를 보고 이해하는 방법과 매우 흡사 합니다. 클래스(class)와 오브젝트 인스턴스를 실생활과 연관지어 예를 들면 다음과 같이 예를 들 수 있습니다.

classobject instance
사람학생, 선생님, 부모님
과일수박, 바나나, 사과, 복숭아
도형삼각형, 사각형, 원



장점

절차 지향 프로그맹과 다르게 데이터와 기능을 한 곳에 묶어서 처리하기 때문에 강한 응집력(Strong Cohesion)을 갖고, 클래스 간에 독립적인 디자인을 함으로써 약한 결합력(Weak Coupling)을 가진다는 장점을 가지고 있습니다.






절차적 프로그래밍과 비교 (Procedural Programming)

절차적 프로그래밍

프로시저 호출의 개념을 바탕으로 하고 있는 프로그래밍 패러다임

절차적 프로그램밍과의 비교

절차적 프로그래밍에서 프로시저와 프로시저의 입력과 출력을 다루는 대신에 객체지향 프로그램들은 객체(classes)들을 다룹니다. 연산은 객체에게 내부 프로시저 중에 하나(혹은 상속받은 것)를 수행하라고 요청하는 것으로 이루어지며 이런 방법으로 내부상태를 다룹니다.

  • 객체 지향 프로그래밍과 절차적 프로그래밍






객체 지향 프로그래밍 특징

객체 지향 프로그래밍의 기본 특징은 다음과 같습니다.

  1. 캡슐화 (Encapsulation)
  2. 추상화 (Abstraction)
  3. 다형성 (Polymorphism)
  4. 상속 (Inheritance)



1. 캡슐화 (Encapsulation)

  • 데이터와 기능을 하나의 단위로 묶는 것을 말합니다.
  • 데이터를 은닉(Hiding)을 할 수 있습니다.
    - 은닉(Hiding) : 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것
  • 하나의 단위로 묶음으로써 (클래스 간의 독립적인 디자인을 함으로써) 약한 결합력(Weak Coupling)을 가집니다.
  • 복잡성 줄이고 재사용성을 높입니다.


2. 추상화 (Abstraction)

  • 복잡한 내부 구현을 숨기고, 노출되는 부분(interface)은 단순하게 만든다는 개념입니다.
    예를 들면, 전화기 내부는 여려개의 회선(?)등이 있는 등의 복잡한 내부구조를 가질 테지만 실제로 사용자가 사용할 때는 숫자버튼 등의 인터페이스(interface)만을 이용하여 전화기를 사용할 수 있습니다.
  • 인터페이스: 메소드와 속성만을 정의한 것. 추상화의 본질
  • 복잡성을 줄이고, 변화에 대한 영향을 줄입니다.


3. 다형성 (Polymorphism)

  • Polymorphism이라는 단어의 poly는 "많은", 그리고 morph는 "형태"라는 뜻을 가지고 있습니다. 즉, 다형성이란 다양한 형태를 가질 수 있다는 것을 뜻합니다.
  • 예를 들어, "도형"이라는 클래스와 "사각형", "삼각형", "원" 인스턴스 객체가 있다고 가정 해보겠습니다. 클래스 "도형"에 너비를 구하는 메소드 getArea(){ return this.width * this.height }이라고 정의 되었다면 삼각형과 원의 getArea 메소드는 각각 달라야 할 것 입니다. (삼각형 너비를 구하는 공식은 width*height / 2 이고, 원 너비를 구하는 공식은 원의 반지름 X 원의 반지름 X 원주율 이기 때문입니다.) 이렇게 동일한 메소드라고 하더라도 개별 인스턴스에 따라 다양한 형태를 가질 수 있는 것을 다형성이라고 합니다.
  • switch 문 대신 객체의 특성에 맞게 달리 작성하는 것이 가능해집니다.



4. 상속 (Inheritance)

  • 기본 클래스(base class)의 특징을 파생 클래스(derive class)가 상속 받는 것을 말합니다.
  • 쉽게 말하면 부모 클래스의 속성을 자식 클래가 물려 받는 것이라고 할 수 있습니다.
    예를 들면, 도형이라는 클래스가 있을 때 도형의 속성(width가 있다. width와 height로 너비를 구할 수 있다. 등)의 속성을 사각형이 해당 속성을 물려 받을 수 있는 것을 상속이라고 말합니다.
  • 반복되는 코드를 없도록 합니다.








객체 지향 자바스크립트

자바스크립트에서 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)처럼 본인의 주장과 주장에 대한 타당한 이유를 대면 될 것 같다.

이 필자의 글을 읽은 후에 나는 자바스크립트가 객체지향언어가 될 수 있다고 생각했다.

profile
신입 개발자 입니다! 혹시 제 글에서 수정이 필요하거나, 개선될 부분이 있으면 자유롭게 댓글 달아주세요😊

0개의 댓글