패스트캠퍼스 데브캠프 55일차 [OOP, SOLID]

Su Min·2024년 8월 6일
0
post-thumbnail

🔗 OOP

Object-Oriented-Programming 객체 지향 프로그래밍

OOP는 어떤 목적을 달성하기 위해 명령을 순서대로 나열하여 전달하는 알고리즘을 어떻게 설계 할 것인지에 대한 개념이자 방법론이다. 즉, 객체를 지향하는 프로그래밍 방식을 적용하여 설계를 하면 불필요한 비용과 시간을 줄일 수 있다는 것이다.

OOP 특징

OOP는 추상화, 상속, 다형성, 캡슐화 4가지 특징을 갖고 있다.
추상화: 역할과 구현을 분리하여 프로그램을 설계하도록 한다.

interface Animal {
  makeSound(): void
}

class Dog implements Animal {
  makeSound(): void {
    console.log("왈왈!")
  }
}

class Cat implements Animal {
  makeSound(): void {
    console.log("야옹 야옹")
  }
}

interface Animal은 메서드가 어떤 객체가 수행해야 하는 역할만 규정해두고 실제 구현은 Dog, Cat 객체들이 하도록 설계한다. 각 객체들의 역할은 Animal 인터페이스를 통해 추상화 될 수 있다.

상속: 공통적인 속성과 기능을 자식클래스에게 확장하여 반복되는 코드를 추가적으로 작성할 필요 없이 재사용할 수 있다.

다형성: 어떤 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있다. 위의 로직에서 makeSound()는 각 클래스의 맥락에 맞게 재정의하여 사용되어 상황에 따라 다른 역할을 수행한다. 다형성을 제대로 활용하기 위해선 각 객체들의 역할 정의가 가능한 추상화, 상-하위 클래스가 전제된 상속이 함께 필요하다.

캡슐화: 클래스를 서로 연관있는 역할과 기능들을 하나의 캡슐로 묶어서 관리하고, 데이터를 외부로부터 은닉한다. 묶어서 관리하면 외부로부터 클래스 안에 정의된 속성과 기능들을 보호하고, 객체의 정보를 은닉하면 외부에 필요한 부분만 노출시켜 직접적으로 변경하는 것을 차단할 수 있다.

작성된 코드는 중복을 방지하여 재사용할 수 있고 확장 할 수 있으며 유지보수 관리가 용이하고 안정적이어야 한다. 이런 코드를 구현하기 위해 OOP 개념이 등장했고 OOP 방식을 잘 지키면서 소프트웨어를 디자인하는 SOLID원칙이 등장했다.

🔗 S.O.L.I.D

좋은 설계라는 것은 어떠한 변경사항이나 요구사항이 새롭게 발생하더라도 대처가 용이하게 이루어지며 영향을 받는 범위가 적은 구조를 말한다. 예를 들면 한 페이지에서 어떠한 기능을 제거하고 다른 기능으로 교체한다고 했을 때, 구조가 복잡하게 얽혀있지 않는다면 변경사항을 쉽고 빠르게 적용 할 수 있다.

SRP (Single Responsibility Principle)

단일 책임 원칙 : 객체는 하나의 책임만 가지며 컴포넌트는 단일 책임을 가지게 분리한다.

새로운 기능을 하나의 클래스에 계속해서 추가하게 된다면 해당 클래스는 여러 역할을 갖고 있게된다. 이후에 변경사항이 생길 때마다 긴 코드양과 많은 기능들이 포함되어 있어 수정의 번거로움이 생길 수 있다.

OCP (Open-Closed Principle)

개방 폐쇠 원칙 : 확장에는 개방적, 변경에는 페쇄적이다.

예를 들어, 3가지 기능을 수행하는 클래스가 있다면 기능 추가에는 개방적이며, 확장하더라도 기존 클래스의 기능을 변경할 필요가 없다는 것이다. 개방 폐쇠 원칙을 잘 지킨다면 컴포넌트의 재사용성, 유연성, 유지보수성을 활용 할 수 있다.

LSP (Liskov Substitution Principle)

리스코프 치환 원칙 : 자식 클래스에서 부모클래스의 기능을 사용할 수 있게 로직을 구현해야 한다.

다형성의 특징을 이용하여 각각의 자식 클래스는 부모의 메서드를 재정의하여 사용해도 동작이 문제없이 의도대로 흘러가야 한다.

ISP (Interface Segregation Principle)

인터페이스 분리 원칙 : 하나의 인터페이스에서 여러 인터페이스를 구현하지 않고 인터페이스를 작은, 독립된 인터페이스로 분리한다.

interface Workabel{
  work(): void
}
interface Eatable{
  eat(): void
}
class Human implements Workabel, Eatable {
  work(): void {
    console.log("일하러 갑니다.")
  }
  eat(): void {
    console.log("음식을 먹습니다.")
  }
}

위 로직처럼 인터페이스의 work()와 eat()메서드를 각각 분리한다면 하나의 인터페이스에서 수정이 발생해도 다른 인터페이스에는 영향을 주지 않으며 각각의 인터페이스가 명확해진다.

DIP (Dependency Inversion Principle)

의존성 역전 원칙 : 의존성 요소를 관리하여 유연성은 증가하고 안정성을 추구한다.

예를 들어 컴퓨터가 작동하려면 전기를 관리해야 되서 컴퓨터는 전기에 의존적이라 할 수 있다. 갑자기 정전이 일어난다면 컴퓨터는 전기가 없어 사용할 수 없게 된다. 전기의 의존성을 약화시키는 방법은 배터리도 관리하는 것이다. 컴퓨터는 전기와 배터리를 잘 관리하여 각각의 의존성을 낮추고 안정적으로 사용이 가능해진다.

profile
성장하는 과정에서 성취감을 통해 희열을 느낍니다⚡️

0개의 댓글

관련 채용 정보