Remind of Object Oriented Programming

2 분 소요

들어가면서

  • 좋은 설계란 새로운 요구사항, 변경사항이 있을 때 영향을 받는 범위가 적은 구조로 하는 설계를 뜻합니다. SOLID 객체 지향 원칙을 적용해서 코드를 확장, 유지보수 관리가 원활해지며 복잡성을 제거해 개발의 생산성을 높일 수 있습니다.
  • 좋은 설계를 위한 OOP 특징, 설계 원칙(SOLID), Design Pattern에 대하여 한 번 더 상기해보고자 합니다.



Feature of OOP

  • Encapsulation(캡슐화)

    • 객체의 속성과 행위를 하나로 묶고 구현 코드를 외부에 감춰 은닉
    • Class/Interface, Access Modifiers(Default, Public, Private, Protected)
  • Abstraction(추상화)

    • 객체의 공통적인 속성과 내용을 추출하여 정의
    • Abstract Class/Method, Interface로 추상화를 구현할 수 있다
  • Inheritance(상속성)

    • 상위 클래스에서 정의된 기능을 하위 클래스에서 재정의하여 사용
    • Parent/Child
  • Polymorphism(다형성)

    • 객체가 상속을 통해 기능을 확장, 변경하여 여러 형태의 객체로 재구성
    • Overriding : 하위 클래스에서 상위 클래스의 함수를 재정의
    • Overloading : 하나의 클래스 안에서 매개변수 개수와 타입을 다르게 하여 같은 메소드를 여러 개 정의



SOLID

  • SRP(Single Responsibility Principle)
    • 하나의 클래스(객체)는 하나의 기능만을 담당해야 한다.
    • 포로그램의 유지보수성을 높이기 위한 설계 기법
  • OCP(Open Closed Principle)
    • 확장에는 열려있고 변경에는 닫혀있어야 한다.
    • 확장에 따른 클래스 수정은 최소화 하도록 하는 설계 기법
    • 추상화 사용을 통한 관계 구축을 권장
  • LSP(Listov Substitution Principle)
    • 하위 클래스를 항상 상위 클래스로 교체할 수 있어야 한다.
    • 다형성 원리를 이용하기 위한 원칙
  • ISP(Interface Segregation Principle)
    • 필요한 기능만을 담은 인터페이스로 분리해서 사용한다.
    • 클라이언트의 목적과 용도에 적합한 인터페이스만을 사용
    • SRP는 클래스의 단일 책임을 강조, ISP는 인터페이스의 단일 책임을 강조
  • DIP(Dependency Inversion Principle)
    • 하위 모듈이 변경될 경우 상위 모듈은 변경되지 않도록 설계한다.
    • 구현 클래스에 의존하는 것이 아닌 인터페이스에 의존을 지향



Design Pattern

  • 생성(Creational), 구조(Structural), 행위(Behavioral) 패턴으로 분류된다.
  • Pros

    • 재사용성 : 반복적인 문제에 대한 해결책을 제공한다.
    • 가독성 : 일정한 구조로 정리하고 명확하게 작성하여 개발자의 코드 이해와 유지보수를 쉽게 만든다.
    • 유지보수성 : 코드를 쉽게 모듈화 할 수 있으며 변경이 필요한 경우 해당 모듈만 수정하여 유지보수가 쉽다.
    • 확장성 : 새로운 기능을 추가하거나 변경할 때 기존 코드를 변경하지 않고도 새로운 기능을 통합할 수 있다.
  • 생성 패턴(Creational Pattern)

    • 객체 생성에 관련된 패턴으로 객체 생성 과정을 캡슐화하거나 더 유연한 객체 생성 방식을 제공
    • Singleton Pattern : 클래스의 인스턴스가 단 하나만 존재하도록 보장하는 패턴
    • Factory Pattern : 객체 생성 로직을 별도의 클래스로 분리하여 캡슐화하는 패턴
    • Builder Pattern : 복잡한 객체 생성 과정을 단계별로 나누어 구현하는 패턴
    • Prototype Pattern : 객체를 복제하여 새로운 객체를 생성하는 패턴
  • 구조 패턴(Structural Pattern)

    • 클래스나 객체들의 구조를 조직하는 패턴으로 클래스와 객체의 구성을 통해 더 큰 구조를 만들거나 유연성을 제공
    • Adapter Pattern : 서로 다른 인터페이스를 갖는 클래스들이 함께 작동할 수 있도록 인터페이스를 변환하는 패턴
    • Decorator Pattern : 기존 객체에 동적으로 새로운 기능을 추가하는 패턴
    • Proxy Pattern : 실제 객체에 대한 참조를 제공하여 객체의 일부 기능을 대신 수행하는 패턴
    • Fascade Pattern : 서브시스템을 더 쉽게 사용할 수 있도록 단순한 인터페이스를 제공하는 패턴
  • 행위 패턴(Behavioral Pattern)

    • 객체들 사이의 알고리즘, 상호작용, 책임분배 등을 정의
    • Observer Pattern : 객체 상태 변경 시 관련 객체들에게 알림을 전달하는 패턴
    • Strategy Pattern : 알고리즘을 캡슐화하여 런타임에 동적으로 알고리즘을 변경할 수 있는 패턴
    • State Pattern : 객체의 내부 상태에 따라 동작을 변경하는 패턴
    • Template Method Pattern : 알고리즘의 구조를 정의하면서 하위 클래스에서 각 단계의 구현을 제공하는 패턴
    • Iterator Pattern : Collection 내의 요소들에 접근하는 방법을 표준화하여 Collection의 내부 구조에 독립적으로 접근할 수있는 패턴