TIL_210409

멜로디·2021년 4월 9일
0

Today I Learned

목록 보기
19/30
post-thumbnail

오늘 배운 것

  • OOP
  • Prototype

Object Oriented Programming

객체 지향 프로그래밍

절차적 언어

OOP라는 개념이 없을 시절의 초기의 프로그래밍 언어는 일반적으로 절차적 언어라고 부른다. (C, 포트란 등)
절차적 언어는 순차적인 명령의 조합이었고, 기껏해야 함수로 이동하는 것이 전부였다. 객체 지향의 개념이 없었다.

객체 지향 언어

객체 지향 프로그래밍이라는 패러다임이 등장하며 상당한 부분이 바뀌었는데,
별개의 변수와 함수로 순차적으로 작동하는 것을 넘어서
데이터의 접근, 데이터의 처리 과정에 대한 모형을 만들어내는 방식을 고안하여,
데이터와 기능이 별개로 취급되지 않고 한번에 묶어서 처리할 수 있게 되었다.

자바스크립트는 객체 지향 언어는 아니지만, 객체 지향 패턴으로 작성할 수 있다.
대표적인 예로, 데이터 모델의 청사진(클래스)를 사용해 코드 작성이 가능하다.

OOP

OOP의 모든 것은 객체로 그룹화된다.
이 객체는 한번 만들고 나면 메모리에서 반환되기 전까지 객체 내의 모든 것이 유지된다.
객체 내에는 데이터와 기능이 함께 있다는 원칙에 따라 메소드와 속성이 존재한다.

클래스와 인스턴스

클래스
세부사항(속성)이 들어가지 않은 일종의 원형(original)으로, 객체를 생성하기 위한 청사진이다.
그리고 클래스는 객체를 만들기 위한 생성자(constructor) 함수를 포함한다.
클래스에 세부 사항만 넣는다면 객체가 되는 것이다.

인스턴스
이 클래스를 통해 만들어진 객체를 인스턴스라고 부른다.
함수에 인자를 넣듯 클래스에 세부 사항을 입력할 수 있는데, 이 때 생성자를 이용하게 된다.

OOP Basic Concepts

객체 지향 프로그래밍에는 4가지의 기본적인 주요 컨셉이 있다

  • Encapsulation (캡슐화)
  • Abstraction (추상화)
  • Inheritance (상속)
  • Polymorphism (다형성)

캡슐화

개요
데이터 구조와 데이터 다루는 방법(기능)을 하나의 단위로 묶는 것을 뜻한다.
외부에서 속성과 메소드를 따로 정의하는 것이 아니라 하나의 객체 안에 넣어서 묶는다.
코드가 복잡하지 않게 만들고, 재사용성을 높이는 장점이 있다.

은닉
내부 동작이나 데이터가 외부로 노출되지 않도록 할 수 있다.
따라서, 상세한 구현이나 데이터는 숨기고 실제 동작만 노출시키는 것이 가능하다.

TIP
underbar( _ ) : 언더바를 붙여놓은 프로퍼티나 메소드는 외부에서 사용하지 말라는 암묵적 룰이 있다.

느슨한 결합
엄격한 클래스는 속성의 직접적인 접근을 막고 설정하는 함수와 불러오는 함수를 철저하게 나누기도 하는데,
캡슐화를 하게 되면 느슨한 결합(언제든지 구현을 수정할 수 있음)에 유리하게 변한다.

추상화

특징
목적과 관련되지 않은 부분을 보이지 않도록 처리하여 필요한 부분만을 표현한다.
코드가 복잡하지 않게 만들고, 변화에 대한 영향을 최소화하는 장점이 있다.
클래스를 정의할 때 메소드와 속성만 정의한 것을 인터페이스라고 하는데, 이것이 추상화의 본질이다.

주의
추상화는 캡슐화와 다르게 '은닉'이 아니라 '불필요한 부분을 보이지 않게'하는 것에 포커스가 맞춰져 있다.

상속

상위 개념의 특징을 하위 개념이 물려받는 것이다.
같은 카테고리의 클래스를 추가로 작성할 때 이미 작성된 부분을 계속해서 중복하여 작성하는 것은 비효율적이다.
상속 관계를 맺으면 하위 클래스를 생성할 때 상위 클래스의 속성(필드, 메소드)들을 물려받기 때문에 속성을 다시 정의할 필요가 없어진다.

다형성

개요
상속을 받은 형태는 같지만, 그 기능이 다르다(변경)
같은 타입이지만 실행 결과가 다양한 객체를 대입할 수 있다.
코드의 재사용성이 높아져 불필요한 코드를 제거하여 코드의 길이가 감소하고,
다양한 객체를 대입한다는 개념이라 유지보수에 용이하다.

예시
시계는 건전지 타입으로 다양한 건전지를 사용하지만, 각 건전지의 성능은 다르게 나온다 (다형성)
따라서 동일 건전지이지만 형태나 성질이 다르다는 '다형성'의 사전적 의미와 매우 유사하다.

OOP의 장단점

장점

  • 코드 재사용을 통한 생산성 향상
  • 일상적 개념 코딩 (사람이 생각하는 방식대로 코드 작성이 가능)
  • 유지보수의 용이성

단점

  • 느린 개발 속도
    처리해야 하는 로직과 데이터에 대한 이해가 필요하여 초기 설계 시간이 길어짐
  • 느린 실행 속도
    컴퓨터가 여러 클래스를 참조하여 코드를 실행하기 때문에 절차적 코드보다 실행 속도가 느리다

Prototype

JS는 기존의 객체를 복사하여 새로운 객체를 생성하는 prototype 기반의 언어이다.
클래스라는 개념이 없고, 기본적으로는 상속 기능도 없기 때문이다.

function Car() {
  this.wheel = 4;
  this.handle = 1;
}

let avante = new Car()
let genesis = new Car()

console.log(avante.wheel)   // 4
console.log(genesis.wheel)  // 4

이 예시에서는 객체의 수에 따라 변수가 메모리에 할당되기 때문에,
5000개의 객체가 만들어지면 메모리에 5000개의 변수를 저장해야 하기 때문에 메모리가 터져나간다.
이 상태에서 avantewheelgenesiswheel은 다르다. (각자 생성되고 저장됨)
하지만 프로토타입을 이용하면 반대의 상황을 만들 수 있다.

function Car() {}
Car.prototype.wheel = 4;
Car.prototype.handle = 1;

let avante = new Car()
let genesis = new Car()

console.log(avante.wheel)   // 4
console.log(genesis.wheel)  // 4

wheelhandle을 저장해 두고, 변수는 그 저장된 데이터를 가져오기 때문에 메모리를 낭비하지 않는다.
따라서, this를 사용했을 때와 다르게 avantewheelgenesiswheel은 같다.

profile
하루하루 배울때마다 기록하는 일기장

0개의 댓글