객체지향 패러다임
패러다임이란 한 시대의 사람들의 견해나 사고를 근본적으로 규정하고 있는 인식의 체계. 또는, 사물에 대한 이론적인 틀이나 체계.
을 의미한다.
Class = ADT(Abstract Data Type) + Inheritance + Polymorphism
ADT(Abstract Data Type)
ADT 즉, 추상 자료형을 한마디로 정의하면 관련된 데이터와 오퍼레이션을 모은 것이다.
이렇게 했을 때 장점은
1. 관리, 수정 용이
2. 캡슐화로 해당 ADT를 사용하는 사용자 입장에서 key operation(혹은 메소드 시그니처)만 알면 된다.
예를 들면 stack, queue등이 있겠다.
사용자 입장에서는 stack에 관련된 key operation(push, pop등)만 알면 되고 내부의 동작은 알 필요가 없다.
Inheritance와 Polymorphism
B가 A의 모든 data와 operation을 가져오고(Inheritance)
B는 A에게 받은 operation을 같은 시그니처를 유지하면서 다른 방식으로 사용할 수 있는 것(Polymorphism)
내가 만든 Class를 사용하는 쪽(코드)에서 얼마나 수정 없이 사용 할 수 있게 만들지 집중
객체지향 패러다임에서 가장 신경써야 할 부분은 어떤 class를 사용하는 쪽에서 최대한 수정 없이 사용 할 수 있게 만드는 것이다.
예를 들면 위와 같은 상속 관계를 가진 Vehicle class를 사용한다고 해보면 사용자 입장에서는 어떠한 Vehicle이 추가되어도 코드 수정 없이 기능을 확장 할 수 있게된다. 이 예에 위에서 언급한 Class = ADT(Abstract Data Type) + Inheritance + Polymorphism 개념이 모두 들어가 있다.
class Client {
void driveVehicle(Vehicle v) {
v.drive();
}
}
만약 객체지향 패러다임 없이 위의 기능을 구현해야 했다면 기능이 추가될 때마다 if else로 대응해야하고 Vehicle관련 코드의 변경 시 Client쪽에서도 코드 변경이 일어날 가능성이 높아진다.
결론은 Abstract Level을 높이는 것
사용자 입장에서 코드의 수정 가능성이 낮아질 수록 Abstract Level이 높다고 할 수 있다.
각 프로그래밍 언어마다 abstract의 기능을 제공하는데 java의 경우 abstract키워드 혹은 interface로 cpp의 경우 순수 가상 함수로 제공한다. 어쨌든 abstract는 프로그래머가 이 operation은 절대 변하지 않는 시그니처라는 것을 코드에 표현한 것으로 해석 할 수 있다.
따라서 내가 abstract를 쓸 때도 위와같이 생각하며 신중히 개발해야하고 사용하는 입장에서도 해당 코드를 작성한 프로그래머의 의도를 파악해서 서로간의 컨센서스를 이루어야 한다.
'객체지향프로그래밍' 카테고리의 다른 글
[SOLID 원칙] 5. Dependency Inversion Principle 의존관계 역전 원칙 (0) | 2022.01.16 |
---|---|
[SOLID 원칙] 4. Interface Segregation Principle 인터페이스 분리 원칙 (0) | 2022.01.16 |
[SOLID 원칙] 3. Liskov Substitution Principle 리스코프 치환 원칙 (0) | 2022.01.09 |
[SOLID 원칙] 2. Open Closed Principle 개방-폐쇄 원칙 (0) | 2022.01.09 |
[SOLID 원칙] 1. Single Responsibility Principle 단일 책임 원칙 (0) | 2022.01.09 |