키워드
- 객체지향
- 객체지향의 4가지 특성
- 객체지향의 SOLID 설계 원칙
객체지향
- 과거 절차지향 방식의 한계를 극복하기 위해 나타난 개념.
- 한계 1. 프로젝트 유지보수의 어려움
- 한계 2. 신규 기능 추가의 어려움
- 코드도 부품처럼 재사용 가능하도록 작성하여 프로젝트를 조립하듯 완성해 나가는 것.
- 객체에 필요한 속성 및 기능을 class로 관리함.
객체
객체지향의 핵심 : 객체지향의 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)
- 어떤 클래스를 참조하여 사용해야하는 상황이라면, 그 클래스를 직접 참조하는 것이 아니라
그 대상의 상위 요소(추상 클래스, 인터페이스)로 참조하라는 원칙.
- 구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 의미.
- 의존 관계 형성 시, 변하기 쉬운 것이나 자주 변하는 것보다는
변하지 않거나 변하기 어려운 것에 의존하라는 것.
객체지향 프로그래밍
- 의존성을 낮추어 결합도를 낮추고, 응집도를 높인다.
결합도를 낮추는 방법
- 연관성이 없는 작업(기능)은 다른 객체(연관성이 있는 클래스)에 위임한다.
- 객체 내부 상태를 캡슐화하여 오직 메세지(메서드, 이벤트)를 통해서만 상호작용한다.
- 단일 클래스 상속보단 다중 인터페이스 상속으로 조립해서 사용한다.
#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL