개인공부/TIL(Today I Learned)

TIL 40일차_ 객체지향프로그래밍(OOP)

soon327 2021. 2. 27. 01:53

 

 

객체지향 프로그래밍이란??

지금까지 수업을 들으면서 '결국 모든 것은 객체이다'라는 말을 몇번은 들은 것 같다.
그때마다 나는
'???? 객체는 {a: 1} 이런 형태아닌가? 왜 다 객체라고하지'라는 생각을 했는데
오늘 조금은 무슨말인지 알것 같기도하다.

첫번째는
상속의관점에서
자바스크립트의 유일한 생성자는 객체뿐이다.
배열의 프로토타입은 Array를 가리키고,
이 Array의 프로토타입은 결국 Object를 가리킨다.

두번쨰는
객체지향프로그래밍에서
'객체는 모든 사물이라고도 할 수 있다.'라는 약간은 추상적인 개념을 포함하는 것이다.
내앞의 노트북도 하나의 객체이고, 책상, 침대, 나자신도 하나의 객체가 될 수 있다.
각각의 객체는 속성과 행동을 갖고 있다.

각각의 사람들은 하나의 독립적인 객체이지만
모두 인간이라는 커다란 범주안에 속한다.

이러한 개념을 프로그래밍에 그대로 대입해보자.
내가 쇼핑몰을 만든다고 할 때,
상품을 고르고, 상품을 담고, 주문하고, 결제하는 등
다양한 변수와 함수, 즉 속성과 행동들이 필요하다.

이러한 속성과 행동들을 각각 작성한다면, 작동은 하더라도
코딩의생명, 유지보수가 힘든 스파게티 코드가 될 것이다.

이럴 때 적용가능한 것이 객체지향프로그래밍이다.

객체지향 프로그래밍이란
연관된 변수와 함수를 묶어서
구조화하여 표현하는 프로그래밍 스타일이다.

그럼 Class는 뭘까?

Class는 객체를 생성하기위한 청사진,틀이라고 생각할 수 있다.

클래스 안에는 객체를 만들기 위한 클래스 내부함수인, 생성자 함수가 들어가게되고,
이렇게 작성된 클래스를 통해 객체가 만들어지면, 이 객체를 인스턴스라하며 이과정을 인스턴스화라고 한다.

OOP의 4가지 Basic Concepts

객체지향 프로그래밍의 4가지 기본컨셉은 다음과 같다.

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

Encapsulation 캡슐화

디테일한 구현이나 데이터는 숨기고, 동작만 노출시킨다.
보다 엄격한 클래스는 속성의 직접적인 접근을 막고,
자바의 경우 설정하는 함수(setter), 불러오는 함수(getter)를 철저하게 나누기도 한다.

Abstraction 추상화

내부구현은 복잡할지라도, 실제로 노출되는 부분은 단순하게 만든다는 개념.
추상화를 통해 인터페이스가 단순해지고, 너무많은 기능들이 노출되지 않도록 한다.

추상화는 캡슐화와 비교해서 종종 헷갈려하는 개념 중 하나이다.

캡슐화가 코드나 데이터의 은닉에 포커스가 맞춰져있다면,
추상화는 클래스를 사용하는 사람이 필요하지 않은 메소드 등을 노출시키지 않고,
단순화
하는 것에 포커스가 맞춰져있다.

클래스 정의 시, 메소드와 속성만 정의한 것을 인터페이스라고 부르는데 이것이 추상화의 본질이라고 할 수 있다.

Inheritance 상속

상속은 부모 클래스의 특징을 자식클래스가 물려받는 것이다.
정확히는 기본 클래스(base class)의 특징을 파생 클래스(derive class)가 상속받는다"로 표현한다.

Polymorphism 다형성

말 그대로 다양한 형태를 가질 수 있다는 개념이다.
객체는 똑같은 메소드라 하더라도 다른방식으로 구현될 수 있다.

OOP in JavaScript

자바스크립트는 본래 객체지향프로그래밍을 고려하여 탄생한 언어가 아니며,
프로토타입 기반의 언어이다.
따라서 객체지향프로그래밍이 대두되면서, 자바스크립트에서도 객체지향으로 프로그래밍해야할 필요성이 생겼고
사람들은 이를 위해 함수로 클래스의 기능을 구현했다.
이를 pseudoclassical 패턴이라고 한다.

그러나 ES6 이후에는
Class 키워드가 생겼고 위의 pseudoclassical패턴은 레거시라고 할 수 있다.
우리는 ES6 문법을 활용해서 객체지향프로그래밍을 할 일이 점점 늘어날 테지만,
말그대로 레거시는 레거시기 때문에 어떻게 작동하는지와 개념에 대해서는 알고 있어야겠다.