50. Node.js 심화주차 - 객체 지향 프로그래밍 (항해 24일차)

코이그·2023년 4월 26일

항해99

목록 보기
48/54

프로그래밍 패러다임

  1. 구조적 프로그래밍

    • 제어 흐름의 직접적인 전환에 대한 규칙 제시 (절차 지향 프로그래밍)
    • 기능 중심적
  2. 객체 지향 프로그래밍

    • 제어 흐름의 간접적인 전환에 대한 규칙 제시
    • 객체 중심적 (현실 세계 모델링)
  3. 함수형 프로그래밍

    • 할당문에 대한 규칙 제시
    • 함수 중심적

객체 지향 프로그래밍

데이터(변수)와 프로세스(메소드)가 동일한 모듈 내부에 위치하도록 프로그래밍하는 방식.

장점

  • 코드의 추상화를 통해 직관적으로 사고할 수 있음
  • 현실 세계의 객체를 유연하게 표현할 수 있음
  • 객체는 특정 특성을 가지고 있으며 특정 기능을 수행할 수 있음

객체 지향 설계

좋은 설계:

  • 요구기능 온전히 수행 & 추후에 변경 수용 가능
  • 이해하기 쉬운 코드
  • 핵심: 캡슐화를 이용해 의존성의 적절한 관리, 객체 사이의 결합도를 낮추는 것

객체 지향 설계 5원칙 (SOLID)

Single Responsibility Principle

  • 하나의 객체는 단 하나의 책임을 가져야 한다.
  • 클래스나 모듈을 변경할 이유가 단 하나 뿐이어야 한다.
  • 책임이라는 개념을 정의하여 적절한 클래스의 크기를 제시한다.

Open-Closed Principle

  • 개체(클래스, 모듈, 함수 등)는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
  • 기존 코드에 영향을 주지 않고 새로운 기능이나 구성 요소를 추가할 수 있어야 한다.
function calculator(nums, option) {
  let result = 0;
  for (const num of nums) {
    if (option === "add") result += num;
    else if (option === "sub") result -= num; 
  }
  return result;
}

위와 같은 계산기 함수가 정의되었을 때 곱하기와 나누기 연산을 추가하려면 else if 문이 늘어나게 된다. 즉, 코드의 변경이 일어나게 된다. 기존 코드를 변경하지 않고 새로운 기능을 얼마든지 추가할 수 있어야 한다.

function calculator(nums, callBackFunc) {
  let result = 0;
  for (const num of nums) {
    result = callBackFunc(result, num);
  }
  return result;
}

const add = (a, b) => a + b;
const sub = (a, b) => a - b;
const mul = (a, b) => a * b;
const div = (a, b) => a / b;
console.log(calculator([2, 3, 5], add));
console.log(calculator([5, 2, 1], sub));

위처럼 두 번째 매개변수로 옵션을 받기보다 콜백함수를 받아서 콜백함수에 따라 연산이 달라지게 설정할 수 있다.

Liskov Substitution Principle

  • 객체는 정확성을 깨지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
  • 부모 클래스와 자식 클래스를 서로 바꿔도 잘못된 결과를 도출하지 않아야 한다.

[LSP 참고]

Interface Segregation Principle

  • 인터페이스는 최대한 작게 유지해야하고 클라이언트는 필요없는 기능을 포함하는 인터페이스에 의존하면 안된다.
  • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.

Dependency Inversion Principle

  • 구체화가 아닌 추상화에 의존해야 한다.
profile
COYG🔴⚪

0개의 댓글