22-09-24 객체지향 패러다임

BRINCE·2022년 9월 24일
0

스프링 스터디

목록 보기
2/10

객체지향의 4가지 특징

  1. 추상화 (Abstraction)
  2. 다형성 (Polymorphism)
  3. 캡슐화 (Encapsulation)
  4. 상속 (Inheritance)

추상화

불필요한 부분을 제거함으로서 필요한 핵심만 나타냄.

  • 복잡성을 낮추기 위한 도구

다형성

다양한 형태를 가지는 것

  • 하나의 타입으로 여러 종류의 객체를 참조하는것

캡슐화

객체 내부의 세부사항을 외부로부터 감추는 것

  • 인터페이스만 공개해서 변경하기 쉬운 코드를 만들기 위함

상속

부모로부터 물려받는 것

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

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

하나의 책임을 가진다.

OCP: Open/Closed Principle (개방 폐쇄의 원칙)

확장에는 열려있지만 변경에는 닫혀있다.(기존 코드를 변경하지 않고 기능을 추가할 수 있어야 한다.)

LSP: Liskov’s Subsititution Principle (리스코프 치환의 원칙)

상위 타입의 객체를 하위 타입의 객체로 치환해도 동작에 전혀 문제가 없어야 한다.

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

많은 기능을 가진 인터페이스를 작은 단위로 분리시킴으로써 클라이언트에게 필요한 인터페이스만 구현하도록 하는 개념 (클라이언트가 사용하지 않는 기능에 의존하게 되면, 예상하지 못한 문제가 발생할 수 있기 때문에 이를 예방하기 위함)

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

의존관계를 맺을 때, 자주 변경되는 쪽이 아닌, 변경이 거의 일어나지 않는쪽에 의존하라는 의미 (자기보다 변하기 쉬운 것에 의존하게 되면 영향을 많이 받기 때문에 상위 클래스나 인터페이스를 둬서 변화에 영향을 받지 않게 하기 위한 원칙)

객체지향 패러다임

  • 적절한 객체에게 적절한 책임을 할당하여 서로 메시지를 주고 받으며 협력하도록 하는 것

(하나하나에 큰 의존성을 두지 않음 ?)

  • 점점 증가하는 SW 복잡도를 낮추기 위해 객체지향 패러다임 대두
  • 클래스가 아닌 객체에 초점을 맞추는 것이 중요
  • 객체들에게 얼마나 적절한 역할과 책임을 할당하는지 중요

절차지향 프로그래밍 vs 객체지향 프로그래밍

  • 책임이 한곳에 집중돼 있는 방식 (getter) → 절차지향

하나의 메소드에서 게터를 통해 값을 가져온 뒤에 이곳에서 모든 처리가 집중되어 있다면 ,

절차지향 방식

  • 책임이 여러 객체로 적절히 분산돼 있는 방식 → 객체지향

해당 책임을 가진 객체에게 협력하도록 구현하는 방식

객체지향 방식

높은 응집도와 낮은 결합도 (High Cohesion, Loose Coupling)

→ 서랍정리

비슷한것끼리 하나로 모아두고 , 다른 성격의 것들은 분리시킴으로서,

비슷한 것 → 높은 응집도 , 다른 성격의 것들은 분리시키는게 낮은 결합도

높은 응집도

  • 변경의 포인트가 하나로 집중될 수 있다. (영향 범위를 파악하는것이 쉬워진다.)
  • 어디까지 영향을 주는지를 모르는것 → 객체지향적으로 설계가 온전히 되지 않았다는것을 반증함.
  • 객체지향 → 변경에대한 요구사항이 들어왔을때, 특정 한 부분만 수정하면 된다는 것은 응집도가 높다는
  • 변경이 생겼을때 다른곳에 영향을 끼치지 않는다면, 낮은 결합도
  • 유지보수와 관련이 크다

설계 및 구현

  1. 도메인을 구성하는 객체에는 어떤 것들이 있는지 고민
  2. 객체들 간의 관계를 고민
  3. 동적인 객체를 정적인 타입으로 추상화해서 도메인 모델링 하기

공통적인 상태와 행동을 가진 객체들을 타입으로 분류 할 수 있다. → 이걸 기반으로 클래스를 구현

클래스 : 공통적인 상태와 행동을 가진 객체들을 추상화하는 것 (복잡성을 낮출 수 있다.)

  1. 협력을 설계
  2. 객체들을 포괄하는 타입에 적절한 책임을 할당

클라이언트와 협력할 수 있는 퍼블릭 인터페이스를 정의한다.

  1. 이러한 인터페이스를 구현한다.
profile
자스코드훔쳐보는변태

0개의 댓글