OOP 개요

  • 핵심: 프로그램을 수많은 객체(Object)라는 기본 단위로 나누고, 이들의 상호작용으로 서술하는 방식
    • OOP란, 프로그램 설계 방법론, 패러다임 중 하나
  • 객체: 하나의 역할을 하는 메소드와 변수(데이터) 의 묶음
  • 객체지향은 메시지를 주고 받으면서 상호 협력하는 자율적인 객체들로 인식

OOP 효과

  • 높은 응집도: 하나역할을 하는 데이터들을 모아 놓은 데이터형, 클래스 사용

    • 응집도: 한 모듈내의 구성요소들 간의 연관 정도
  • 낮은 결합도: 객체들간의 적절한 협력에 필요한 관계만을 유지를 함으로써 결합력을 낮춤

    • 결합도(coupling): 묘듈 모듈간의 의존 정도
  • 그에 따른 효과

    • 요구사항 변경에 대한 대응성
    • 유지보수성
    • 재사용성
    • 중복되는 코드량 감소

image-20240505183430663.png

OOP의 4가지 특징

추상화

  • 객체의 공통적인 속성과 기능을 추출하여 하나의 묶음으로 이름 붙여 정의하는 것

다형성

  • 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력

  • 같은 자료형에 여러가지 타입의 데이터를 대입하여 다양한 결과를 얻어낼 수 있는 성질

캡슐화

  • 필드와 메서드를 내부에 구현하여 은닉하고 외부로 부터 접근을 제한

    • 관련 데이터와 코드 알고리즘이 하나의 묶음으로 내부에 구현
    • 외부와의 상호작용은 메시지와 메소드를 통해서만 함
  • 모듈 내에서 내부를 구현하여 응집도 높힘

  • 외부 노출 최소화 결합도 낮춤

  • 객체간에 의존성은 오직 public 메서드에 의해서만 발생

    • 호출 순서 파악이 쉬움

상속

  • 자식 클래스가 부모 클래스의 특성과 기능을 그대로, 전부 물려 받는 것

  • 위험

    • 결합도를 크게 늘림

    • 컴파일 시점에 클래스의 관계가 결정, 유연하지 못한 소프트웨어

    • 상위 클래스가 하위 클래스의 is-a 관계 일때만 사용

      • Dog is-a Animal
  • 위험에 대응하는 법

    • 상속 보단 합성이나 인터페이스 구현으로 대체
    • 설계와 문서를 제대로 갖추고 상속

SOLID

  • OOP의 5가지 기본 원칙의 첫 글자를 따서 명명한 원칙
  • OOP의 4가지 특징이 반영
  • 효과
    • 중복되는 코드 감소
    • 낮은 결합도, 높은 응집도
    • 유지보수 용이, 요구사항 변경에 유연
    • 결과적으로 생산성 상승

SRP, 단일 책임 원칙

  • 단일 모듈은 변경의 이유가 오직 하나뿐 이여야 한다
    • 책임을 많이 질수록 서로 다른 역할을 수행하는 코드 끼리 결합도 상승의 위험
    • Ex) 회계팀, 인사팀의 Employee 클래스 사용

OCP, 개방 폐쇄 원칙

  • 확장에 Open
    • 요구사항이 변경될 때, 새로운 동작을 추가하여 애플리케이션의 기능확장할 수 있다
  • 수정에 Closed
    • 기존의 코드수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있다

LSP, 리스코프 치환 원칙

  • 하위 타입상위 타입대체 할 수 있어야 한다는 원칙

    • 즉, 하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 한다

    • 위반 사례

      image-20240505184738484.png

    • 반영 사례

      image-20240505184748557.png

ISP, 인터페이스 분리 원칙

  • 인터페이스잘게 분리하여, 클라이언트의 목적과 용도적합한 인터페이스 만제공해야 한다는 원칙

    • 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야 하는 것

    • 위반 사례

      image-20240505184858957.png

    • 반영 사례

      image-20240505184910396.png

DIP, 의존 역전 원칙

  • 고수준 모듈저수준 모듈구현의존해서는 안 되며, 저수준 모듈고수준 모듈에서 정의한 추상 타입의존해야 한다는 원칙

    • 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어, 변하기 쉬운 것의 변화영향받지 않게 하는 것

    • 저수준의 구현에 의존하던 것을 인터페이스에 의존하게 변경 (저->고) , (소스 코드 의존성)

    • 소스 코드의 의존성(저→고)제어 흐름(고→저) 을 반대(역전)로 됨

    • 위반 사례

      image-20240505185033236.png

    • 반영 사례

      image-20240505185044934.png

    • 고수준 모듈 : 변하기 어려운, 추상화된 클래스 또는 인터페이스

    • 저수준 모듈 : 변하기 쉬운, 구체 클래스