내일배움캠프 22일차 TIL : 객체지향 특강

김정환·2024년 10월 15일
0

키워드

  • 객체지향
  • 객체지향의 4가지 특성
  • 객체지향의 SOLID 설계 원칙

객체지향

  • 과거 절차지향 방식의 한계를 극복하기 위해 나타난 개념.
    • 한계 1. 프로젝트 유지보수의 어려움
    • 한계 2. 신규 기능 추가의 어려움
  • 코드도 부품처럼 재사용 가능하도록 작성하여 프로젝트를 조립하듯 완성해 나가는 것.
    • 객체에 필요한 속성 및 기능을 class로 관리함.

객체

  • Object : 개념 / 단위

  • Class : 객체를 정의하기 위한 문법

  • Instance : 메모리에 할당된 클래스 / 객체

객체지향의 핵심 : 객체지향의 4가지 특성

  1. 객체는 기능을 제공한다.
  2. 기능을 제공하기 위해 캡슐화한다.
  3. 캡슐화하기 위해서 추상화한다.
  4. 추상화된 클래스들을 상속하여 다양한 클래스를 만든다.(다형성)

관계

클래스 간에는 관계가 생긴다. (상속, 의존, 연관, 실체화)

  • 관계의 관점에서 프로그램을 보는 것 : 객체지향 <-> 코드 간 순서로 구분하는 것 : 절차지향

  • 상속 :
    부모 클래스로부터 변수, 기능들을 이어받아 재정의, 확장하는 것.

  • 실체화 :
    인터페이스, 추상 클래스에서 명시된 기능들을 상속받아 하위 클래스에서 구현하는 것.

  • 의존 :
    다른 클래스의 기능을 가져와 사용하는 것. 다른 클래스의 기능에 의존하는 것.
    (강력한 결합)

  • 연관 :
    구성 요건의 관계. 변수로 선언하여 사용하는 관계.

클래스 간 결합도

좋은 객체지향 설계 = 결합도가 낮고, 응집도가 높다.

  • 결합도가 높다 = 의존도가 높다.
  • 연관 관계를 활용하여 의존도를 줄이도록 설계해야 한다.

객체지향의 설계 원칙 SOLID

단일책임원칙 - SRP (Single Responsibility Principle)

  • 클래스(객체)는 단 하나의 책임만 가져야 한다.
  • 책임 = 기능
  • 하나의 클래스는 하나의 기능만 담당하여 그 책임에 집중하도록
    클래스를 따로따로 여러 개 설계하라는 의미이다.
  • 한 책임을 가지고 있기에 변경될 이유가 관련된 책임에 대한 것 뿐이므로
    하나의 기능을 수정한다고 다른 기능의 변경으로 이어지는 연쇄 작용을 극복할 수 있다.

개방폐쇄원칙 - OCP (Open Closed Principle)

  • 확장에 열려있어야 하며, 수정에 닫혀있어야 한다.
  • 기능 수정 시, 클래스를 확장을 통해서 쉽게 구현하면서 확장에 따른 수정은 최소화하도록 한다.
    • 확장에 열려있다 : 새로운 변경 사항이 발생했을 때, 유연하게 코드를 추가하여 기능을 확장할 수 있다.
    • 수정(변경)에 닫혀있다. : 새로운 변경 사항 발생 시, 객체를 직접적으로 수정을 제한한다.
  • 추상화 사용을 통해 관계 구축을 권장하는 것 (다형성과 확장의 장점 극대화)

리스코프 치환 원칙 - LSP (Liskov Substitution Principle)

  • 서브 타입(자식 클래스)은 언제나 기반 타입(부모 클래스)로 교체할 수 있어야 한다.
  • 다형성 원리를 이용하기 위한 원칙
    • 상위 클래스 타입으로 객체를 선언하여 하위 클래스 인스턴스를 받아도,
      업캐스팅된 상태에서 부모 메서드를 사용해도 동작이 의도대로 흘러가야 하는 것을 의미.
  • override 시, 종종 base.~ 부분을 삭제하는데, 이를 하지 말라는 것.
    • 부모 타입의 기능을 남겨둬야 온전히 치환할 수 있기 때문.
  • 즉, override 시, 최대한 재사용하라는 것.

인터페이스 분리 원칙 - ISP (Interface Segregation Principle)

  • 인터페이스를 각각 사용에 맞게끔 잘게 분리하라는 의미
    • SRP : 클래스의 단일 책임을 강조 = 책임에 맞게 클래스 분리
    • ISP : 인터페이스의 단일 책임을 강조 = 책임에 맞게 인터페이스 분리
  • 인터페이스를 사용하는 클라이언트를 기준으로 분리하여
    클라이언트의 목적과 용도에 적합한 인터페이스만을 제공하는 것이 목표
  • 단, 한 번 인터페이스를 분리하여 구성해놓고 나중에 무언가 수정사항이 생겨서 또 인터페이스를 분리하진 말아야 한다.
    • 인터페이스는 한번 정의하고나면 변하면 안되기 때문.

의존 역전 원칙 - DIP (Dependency Inversion Principle)

  • 어떤 클래스를 참조하여 사용해야하는 상황이라면, 그 클래스를 직접 참조하는 것이 아니라
    그 대상의 상위 요소(추상 클래스, 인터페이스)로 참조하라는 원칙.
  • 구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 의미.
  • 의존 관계 형성 시, 변하기 쉬운 것이나 자주 변하는 것보다는
    변하지 않거나 변하기 어려운 것에 의존하라는 것.

객체지향 프로그래밍

  • 의존성을 낮추어 결합도를 낮추고, 응집도를 높인다.

결합도를 낮추는 방법

  1. 연관성이 없는 작업(기능)은 다른 객체(연관성이 있는 클래스)에 위임한다.
  2. 객체 내부 상태를 캡슐화하여 오직 메세지(메서드, 이벤트)를 통해서만 상호작용한다.
  3. 단일 클래스 상속보단 다중 인터페이스 상속으로 조립해서 사용한다.

#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL

profile
사파 개발자

0개의 댓글