** 프리온보딩 강의 및 개인 공부를 하면서 정리한 글로 부족한 부분이 있을 수 있습니다. 예쁜말 지적 환영
객체지향은 객체를 중심으로 프로그래밍을 하는 프로그래밍 패러다임을 뜻한다.
객체지향 프로그래밍에서 객체들은 능동적인 존재가 된다.
객체들은 공동체를 만들어 서로 상호작용하며 기능을 제공하게 되었으며, 그 상호작용은 ‘메세지’로 이루어진다.
객체 지향 세계에서 독점은 없다.
필요한 기능들을 쪼개어 객체에 분배하고 객체 간의 적절한 협력을 이루는 것이 application의 목표이기에,
혼자 모든 것을 가지고있는 객체는 없다.
마치 맥도널드 시스템처럼 주문 / 패티 / 햄버거 조립 / 감자튀김 담당으로 기능이 쪼개져있게 된 것이다.
객체지향에서의 협력과 책임, 역할을 조금 더 자세히 살펴보자.
협력 :
- 작은 단위로 쪼개진 기능들의 한 줄 설명
(작은 단위 기능들의 모임으로 주요기능이 구현된다) - 협력은 객체간의 상호작용을 통해 이루어진다
- 객체간의 상호작용은 message를 통해서만 가능하다
책임 :
- 협력에 참여하기 위해서 객체가 책임지고 있는 기능의 세부 내역
역할 :
- 동일한 책임을 수행하는 객체의 집합체
- 객체의 집합체가 여러개가 있을 경우 대표가능한 특별한 이름을 부여해 관리한다
- 예) DiscountPolicy 추상체를 만들어 통신사, 멤버십 할인금액 계산을 관리
이러한 객체들의 관계 속에서 '의존성'이 부여되는데 이 의존성에 따라 코드의 결합도가 결정된다.
의존성이 높을 수록 한 코드를 변경할 때 많은 수정이 뒤따르게 되므로
소스코드를 유연하게 유지하기 위해 느슨한 결합도를 유지하는 것이 좋다.
느슨한 결합도를 위한 방법 :
⭐️ 올바른 의존성을 주입하기
⭐️ 코드 변경을 방해하는 의존성을 제거하기
> 추가 설명
의존성(Dependency)
- ‘A->B message 전달했을때 B->A 메세지 처리가 가능하다’를 알고 있는 정보 = ‘의존성’
결합도(Coupling )
의존성 관계가 높을 수록 강한 결합도, 낮을 수록 느슨한 결합도
- B객체에 변경이 발생할 경우, B객체에 의존하고 있는 다른 객체들에게 전이되는 정도의 수준을 표현한 것
- 잘못된 캡슐화는 강한 결합도를 유발해간다.
- 객체상태를 조작하는 책임은 객체 본인한테 있어야 하기 때문이다.
- 객체 바깥에 객체 상태를 변경하는 로직이 있으면 결합도가 높아진다.
- 결합도가 높다
= 변경시 다른 객체도 연쇄적으로 변경이 필요하다.
= 의존성 변경이 어려워진다
= 레거시 코드가 된다
- 레거시 : 의존성을 더이상 변경하기 어려운 수준이 되어있는 내용
이러한 느슨한 결합도에 유리한 것이 '합성' 이다.
상속은 부모클래스의 행동과 상태를 모두 상속받는데, 이는 ‘순수코드에 의존’하는 설계 구조가 된다.
부모 클래스에대해 모든 것을 알아야 적절한 적용이 가능하며,
만약 부모 클래스에 변경이 생기면 자식클래스에 어떻게 적용되는지 확인해야한다.
이에 비해 합성은 작은 기능을 조합해 다양한 기능을 만드는 것이다.
기능에 대해 자세히 알지 못해도 사용할 수 있도록 해주어 보다 유연한 코드를 작성할 수 있게 돕는다.
공부하면서 디자인 패턴에서도 상속 / 합성의 두가지 예시를 발견할 수 있었는데,
객체를 합성하는 방식(인자로 입력받고, 입력받은 인자를 바탕으로 함수를 호출하는 방식)이 보다 유연함을 알 수 있었다.
디자인패턴 Design Pattern
디자인패턴들은 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 일반적인 해결책이다.
디자인 패턴은 의도나 목적에 따라 분류하는데, 생성 / 구조 / 행동 패턴으로 나뉜다.
1. 생성 패턴은 기존 코드의 재활용, 유연성을 증가시키는 객체 생성 메커니즘을 제공한다.
2. 구조 패턴은 구조를 유연, 효율적으로 유지하면서 객체와 클래스를 더 큰 구조로 조합하는 방법이다.
3. 행동 패턴은 객체 간의 효과적인 의사소통과 책임 할당을 처리한다.
패턴의 종류
1. 생성패턴 :
팩토리 메서드, 추상 팩토리, 빌더, 프로토타임, 싱글턴
2. 구조패턴 :
어댑터, 브릿지, 복합체, 데코레이터, 퍼사드, 플라이웨이트, 프록시
3. 행동패턴 :
책임 연쇄, 커맨드, 반복자, 중재자, 메멘토, 옵저버, 상태, 전략, 템플릿 메서드, 비지터
참고 : https://refactoring.guru/ko/design-patterns/decorator/python/example
'CS > computer science' 카테고리의 다른 글
[기술면접] cs 문답 | CPU process, 관계형DB KEY (0) | 2023.08.25 |
---|---|
[기술면접] CS 문답 | os : memory (0) | 2023.08.24 |
[기술면접] CS 문답 | 멀티프로세스 상세 (0) | 2023.08.23 |
[기술면접] CS 문답 | 프로세스 vs 스레드, 동시성 병렬성 (0) | 2023.08.22 |
[기술면접] CS 문답 | 인스턴스 변수 인수 (0) | 2023.08.21 |