객체 지향 프로그래밍 : Object Oriented Programming
- 말 그대로 객체의 개념에 기반을 둔 프로그래밍 패러다임이다.
(여기서 패러다임이란 우리가 작성하는 코드의 스타일, 코드를 어떻게 작성하고 조직화 할 것인가에 대한 체계, 개념같은 것이다.) - 객체를 현실 세계의 개념이나 요소를 표현하기 위해 - 모델링 하기 위해서 사용한다. 사람이 현실 세계를 이해하는 방식을 모방한 방식이라고 생각하면 된다.
- 객체는 데이터(프로퍼티)와 그에 상응하는 행동(메서드)를 포함한다. 객체 하나가 하나의 개념을 표현한다면, 이 개념과 연관되어있는 데이터와 행동들을 따로 분리하는 것이 아니라, 객체라는 구조 안에 모아두어 활용성을 높인다.
- 이런 객체들이 여럿 모여 애플리케이션을 구성하고, 다른 객체들과 상호작용 하는 방식을 객체 지향 프로그래밍이라고 한다.
Why OOP? 왜 객체 지향 프로그래밍을 하는가.
- OOP의 목적은 데이터모음을 더 유연하게 활용하고, 유지보수와 확장이 쉽도록 조직화하기 위함이다.
- OOP의 탄생 배경에는 이전 절차 지향 프로그래밍에서 덩치가 커질수록 수 많은 코드들이 잘 조직화되어 관리되지 않는 이른바 스파게티 코드가 되는 문제점이 있었기 때문이다. (내가 간략하게 이해한 바로는 그렇다.)
- 동작 보다는 의미있는 데이터들(객체)를 중심으로 코드를 짜면, 코드의 덩치가 커져도 일관성이 유지되었고 OOP는 여기에서부터 출발하게 되었다.
- OOP는 현재 가장 널리 쓰이는 프로그래밍 패러다임일 것이며, 이와 비슷하지만 다른 개념으로는 함수형 프로그래밍이 존재한다.
클래스와 인스턴스
- OOP에서는 객체 리터럴을 사용해 객체를 직접 만드는 대신에, 새롭게 객체를 생성해내는 방식을 사용해야 한다.
- 이 때 사용되는 것이 클래스와 인스턴스 개념이다.
클래스
- 클래스는 청사진, 설계도 같은 개념이다. 붕어빵이 있을 때 붕어빵(인스턴스)를 찍어내는 붕어빵 틀 같은 존재이다. 실제 객체는 아니지만, 실제 객체를 만들어내기 위한 개념적인 것이라고 볼 수 있다.
- 클래스를 생성할 때 인스턴스에 들어갈 세부적인 정보 (프로퍼티와 메서드)를 설정한다. 예시를 들자면 붕어빵 속은 무엇인지, 크기는 어떤지 등등 붕어빵이 되기 위한 속성들을 만들어준다.
인스턴스
- 인스턴스 : 클래스(붕어빵 틀)을 통해서 찍혀져 나오는 실제 객체 데이터(붕어빵).
- 인스턴스를 생성하면서 각 객체가 가질 고유한 데이터를 전달하면, 어떤 인스턴스는 슈크림에 대왕 잉어빵, 어떤 인스턴스는 팥에 미니 붕어빵이 될 것이다.
이러한 클래스 인스턴스 개념은 모든 OOP 언어에서 활용되는 공통 개념이고, 자바스크립트는 이 방식과 유사하지만 약간 다른 방법을 사용하여 객체를 생성한다.
OOP의 4가지 중요한 원칙!
- 클래스를 만들어 내는데 정해진 한 가지 정답이 있다고는 할 수 없다. 하지만 중요하게 여겨야 할 개념은 아래와 같다.
추상화 Abstraction
- 필요하지 않은 디테일은 무시하라!
- 우리가 생성하고 있는 것에 대해서 한 눈에 파악할 수 있도록, 필요하지 않은 정보들로 복잡하게 만들지 말아야 한다.
- 사용자와 상호작용 하기 위해 필요하지 않은 저수준의 디테일은 과감히 무시하고 필요한 정보만 담아 단순화된 인터페이스를 만들 수 있다.
- 추상화는 OOP 뿐만 아니라 프로그래밍 전반에서 공통적으로 중요하게 생각해야하는 원칙 중 하나이다.
캡술화 Encapsulation
- 속성과 메서드를 따로따로 작성하는 것이 아니라, 코드가 상징하는 실제 모습 (객체)안에 모아서 결합 즉, 캡슐화를 시키는 것이다.
- 또한 이렇게 캡슐화 시킨 데이터 모음들, 속성과 메서드들은 외부에서 쉽게 접근하거나 변경할 수 없도록 은닉화한다. 이렇게 은닉화 시켜야 예기치 못한 변경을 방지해 결과적으로 버그를 줄일 수 있다.
- 외부에 공개할 몇 개의 메서드들만 선별적으로 public하게 공개하여 API로써 의도적으로 노출시킬 수 있다.
상속 Inheritance
- 두 개의 유사한 속성을 지닌 클래스들이 있을 때, 하나의 클래스에서 다른 클래스를 상속시키고, 상속 받을 수 있다. (쉽게 생각하면 부모 클래스와 자식 클래스가 존재할 수 있는 것. ) 이렇게 하여 코드의 중복을 막을 수 있다.
- 하나의 클래스에 속하는 모든 속성을 특정 클래스에게 상속시킬 수 있고, 이렇게 하여 부모 - 자식 관계같은 클래스간의 계층적인 구조가 생긴다. 중복을 방지해 공통의 로직을 재사용할 수 있으며, 실제 세계에서의 각 객체과 관계를 모델링 할 수 있다.
다형성 Polymorphism
- 그리스어에서 파생된 단어로 영어로 표현하면 many shapes. 부모로부터 상속받은 클래스를 각 인스턴스가 자신에게 맞게 변형시켜서 사용할 수 있는 것을 의미한다.
- 이를 통해 부모 클래스를 용도별로 분기시키지 않아도 각 인스턴스가 변형하여 목적에 맞게 사용할 수 있기 때문에, 다양한 상황에 더 유연하게 대처할 수 있다는 장점이 있다.
참고 자료
- 코드스테이츠 유어클래스
https://www.udemy.com/course/the-complete-javascript-course
https://yozm.wishket.com/magazine/detail/1396/
'JavaScript > JavaScript' 카테고리의 다른 글
[JavaScript] 프로토타입 (0) | 2022.07.22 |
---|---|
[JavaScript] OOP in JavaScript : 생성자 함수, 클래스 문법 (0) | 2022.07.22 |
[JavaScript] 클로저와 커링 초간단 정리 (0) | 2022.07.21 |
[JavaScript] Promise (0) | 2022.07.18 |
[JavaScript] 동기와 비동기 (0) | 2022.07.16 |