객체지향 설계에 등장하는 개념들
클래스 : 공통되는 것들을 묶어서 대표적인 이름을 붙인 것(추상화의 결과)
추상화 : 공통적인 것들을 뽑아낸 것
예를들어 사람, 자동차라고 하면 누구든지 알아들을 수 있는 정도로 공통점만 뽑아내는 것
자동차! 라고 하면 모두가 머릿속에 엔진있고, 바퀴, 창문있는 이동수단인 것을 떠올린다 -> 우리 사이에 이미 추상화가 되어있는 거임, 자동차의 공통적인 것들을 뽑아내서 갖고 있다는 것
소프트웨어를 설계할 때도 마찬가지로 공통적인 것들을 묶어서 클래스로 추상화
인스턴스 : 클래스가 메모리 공간에 할당된 실체
객체 : 명확한 의미를 담고 있는 대상 / 클래스에서 생성된 변수, 상태, 메서드 등
OOP의 대표적 원칙
로버트 마틴이 "애자일 SW 개발" 책의 '객체지향 설계'부분에서 응집도 원칙을 설명하면서 SRP 개념 소개
장점
-> 주문 클래스가 1. 주문, 2. 결제 2가지 책임이 있음
-> 분리
프랑스 사람이 OO SW Construction이라는 책에서 1998에 정의한 내용
"변경에는 닫혀있고 확장에는 열려있어야한다"는 원칙 소개
즉,
-> 추상화, 다형성이 핵심
-> 변할것, 변하지 않을 것을 모듈로 분리해 관리
-> 만나는 지점을 인터페이스로
주문이라는 클래스에 1.주문, 2.결제 모든 책임이 다있음
-> SRP로 주문 결제 나눔
-> 근데 결제 클래스 결제방법이 다양해지면 매번 클래스를 수정???
-> 결제도 나눠야함
@abstractmethod
로 추상 메서드 구현extends
, implements
, @override
extends
는 오버라이딩 필요없음 & 다중상속 지원안함 implements
는 반득시 오버라이딩 해야함 & 다중상속 지원리스코프가 데이터 추상화의 본질을 구성하는 리스코프 치환 원칙 개발
-> 기반클래스는 파생클래스로 대체 가능해야한다
즉, 부모클래스의 인스턴스 자리에 파생클래스의 인스턴스가 들어가도 작동해야한다
부모클래스의 속성과 메서드를 그대로 물려받으면 문제가 발생하지 않는데
오버라이딩하면 문제가 발생할 수 있음
예를들어, 자동차클래스에서 헬리콥터라는 파생클래스를 만들었다 가정
기반 클래스인 자동차의 move 메서드는 땅을 달림
-> 따라서 헬리콥터 클래스를 만들때 move가 하늘을 날 수 있도록 오버라이딩
-> 부모클래스의 자동차를 자식인 헬리콥터로 대체할때 move에서 문제 발생
-> LSP 위반함으로써 문제발생
-> 이는 OCP도 붕괴
-> 헬리콥터의 자식클래스인 의료헬리콥터 군용헬리콥터를 변경하면 연쇄적으로
헬리콥터, 자동차 줄줄이 변경해야하기떄문에 변경에는 닫혀있어야하지만 망해버림
-> OOP 자체가 위협
해결방법
즉, 책임을 잘 생각해서 상속, 오버라이딩, 클래스 분리 잘 고려해서 코딩해라
상세 예시
-> PaymentProcessor를 카카오페이로 대체했을 때 동작되지 않을 것이다
-> java는 생성자
로버트 마틴이 제록스 컨설팅 과정에서 제시한 개념
-> "사용자는 자신이 필요한 인터페이스만 사용"
구현해놓고 사용안하면 상관없다 생각하지만
필요없는걸 구현해놓고 시스템을 복잡하게 만들고 사용상의 오류를 발생시킬 수 있는 여지를 남기는 행위를 하지 마라
사례
-> P.P를 상속받아서 Sms 인증이 필요없는 결제도 sms인증을 하게됨
-> 에러 발생
-> 모든 클래스가 적절하게 인터페이스를 사용할 수 없음
-> ISP위반
해결방법
-> 구체화 된것에 의존하다가 추상화 된거에 의존하게됨