02. Object-Oriented Principles
OOP/OOAD/UML에 대해 알아보자
02. Object-Oriented Principles
1.2 Object-Oriented Principles
1.2.1 Abstraction (=Modeling)
- Abstraction(=Modeling)이라고도 말함
- 중요한 것들을 포함하면서 디테일한것들을 버리는 것을 추상화라고 함
- 즉
지금 내가 하려는 것과 관련된 것(relevant)들은 강조하고 그외의 특징들을 버려버리는 것을 말함
- 서류 가방을 생각해보면 용량/재질/지퍼/수납공간크기/가변적인재질이냐 등등이 있을떄 Abstraction이란 모델링을 거쳐서 중요한 것들 즉 용량/무게/여닫기만 추상화 시키고 그외에 것들은 버리는 것
- SW 객체만 추상화를 하는 것이 아니라 모든 사물들을 OO 관점에서는 추상화가 가능하다.
1.2.2 Encapsulation
- 어떻게 동작하는지 내부 동작은 몰라도 쉽게 사용하는 방식을 Encapsulation이라고 함(Information Hiding)
- 예를 들어, 자동차의 경우 연료 배합으로 압축 폭팔이 일어나서 전후진을 하는지 다 숨겨버리고 그냥 휠/엑셀/브레이크로 사용법만 제공하여 쉽게 이용
- 예를 들어, 대학교에서 유교수님의 강좌 수업을 4개로 낮춰 주고 싶다. 그러면 유 교수님의 프로퍼티랑 어떤 오퍼레이션이 있는지 몰라도 그냥 퍼블릭한 SetminLoad(4)만 호출하면 유 교수님의 최소 강좌 갯수가 4로 셋팅 됨
- 또다른 예시를 들어보면 고객이 ATM기를 접근한다고 하면 입금/출금/전송만 사용하면 된다. 내부적인 Information들이 어떻게 구성되어 있는지를 아예 몰라도 됨. 세가지의 +(Deposit/Withdraw/Transfer)만 알고 있으면 됨
1.2.3 Inheritance
- Class
Generalization
와 같은 개념이다 - 위 아래
hierarchy
가 있어 아래는 위의 포괄적인 개념을 내려 받음(상속) -
is a kind of
/is-a
관계라고 말함 - sedan is a kind of automobile vehicle, sportcar is a vehicle, school bus is a bus, luxury bus is a kind of vehicle 과 같이 설명이 가능하여
is a kind of
,is-a
관계라고도 함 - 계측적 구조에서 위 계측의 기능을 상속 받은 것이 밑의 개념이며, 해당 객체만 가지고 있는 특징적인 기능들은 걔만 같도록 적음.(스포츠카의 경우 문열리는것 자기만 가지고 있음으로 스포츠카 프로퍼티에만 적어주면 됨)
- C++의 경우 Child class는 여러 부모 클래스 상속(
Multiple Inheritance
)이 가능하나 JAVA는 불가능함. - 따라서 Multiple Inheritance는 C++에서 가능이나 보편적인 Single Inheritance로 예시를 듬
- 예시의 classdiagram anotation을 확인해보면, Encapsulation and information hiding을 통해 Account의 Public한 behavior(method)는 withdraw/createStatement란 Ancestor인 superclass(parent)가 있음
- 이를 상속 받는 두개의 child class는 2개의 account가있는데 둘다 공통적으로 account의 state/behavior를 물려받고 각각의 해당하는 specific한 동작들은 각자 child class내에 적어준다
- 따라서 위와 같은 Inheritace는 Object-Oriented를 가장 OO답게 해주는 기능이다
1.2.4 Polymorphism(다형성)
- 많은 A/B/C의 동작이 있는데 외부 Actor가 접근할수 있는 인터페이스는 하나가 제공되는 상황이다. 이를 통해 Actor는 인터페이스만 부르기만하고 그 인터페이스는 contexts(상황)에 따라 return을 다르게 해준다(같은 단어나 문구가 다른 contexts를 의미할 수 가 있다)
- 이는 추후 배울
Composition
을 통해 Polymorphism을 구현 가능함 - 예를 들어 bank는 문맥에 따라 강둑 또는 은행을 의미할 수 있음
- 에를 들어 Actor가 나이를 얻고자 한다면 이에 따른 Context(출생 년도/인종)에 따라서 다른 나이 값을 리턴 함
1.2.5 Composition
- Polymorphism을 OO에서 구현하는 가장 쉽고 효과적인 방법이
Composition
이다 - Obejct 간에 다른 관계를 갖고
(has-a)
특성을 가지고 있음런타임 도중에 동적으로 다른 오브젝트를 가져올수 있음
- 예를 들어, A라는 객체가 다른 Object들 B/C/D를 가지고 있고 외부 Actor가 A 객체의 a method를 호출 시 contect에 따라서 B/C/D의 a() operation이 다르게 호출 될수가 있음
- 따라서 이처럼 Composition을 통해 Plymorphism을 효과적으로 구현 가능하며, 엄밀히 말하면 A 객체 뒤에 interface가 있어야하는데 이는 다음 예시로 화인 가능
- Object Composition을 통해 Polymorphism을 구현한 전형적인 예제임
- Duck Abstract Class가 있고 (new를 해서 instacne를 생성하지 않고 Child class를 instacne new를 하며, Attribute/Operation은 다 정의 되어 있음. 즉 new만 안할 뿐 Property/Method는 다 정의 되어 있는 경우를 말함 )
- Duck Absction Class 내에 Composition 관계로 fly와 quack 객체를 가지고 있음. 원래는
색칠 된/안된 마름모 꼴의 형태
로 표현되어야 하나 여기는 화살표임 - fly를 보면 인터페이스가 있고(이름만 정의되어 있고 안에 정의는 없음), interface를 realization을 한 밑에 있는 하부 class가 fly opeation의 body를 구현함. 이때는
점선 화살표로 표시되며 interface realization
이라고 함 - interface realization을 보면 날라다니는 오리/못날라다니는 오리에 대한 fly의 operation을 채우고 있으며, 이게 인터페이스를 통해 런타임 도중에 context가 바뀌며 fly의 동작이 달라질수 도 있음.
- duck 추상화 클래스를 composition으로 날기 행위에 대한 polymorphysim이 구현된 flyBehavior 프로퍼티를 가지고 있고, 이에 대한 method performFly를 보게 되면 flybehavior.fly()를 실행하는데 런타임 도중에 Flybehavior에 realization 되어 연결된 fly 동작을 따라가게 됨. 따라서 문맥에 따라 런타임 도중에 다이나믹하게 날라다니는 오리/못날라다니는 오리가 나오게 됨
1.2.6 QUIZ
Answer : Encapsulation
Answer : Polymorphism
- 다음 시간은 이러한 OO를 가지고 OOD를 어떻게 진행하는지 이야기 할 것이며, 이때 OOD 중에
UP 기반의 iterative OAD
를 다룰 예정이다
This post is licensed under
CC BY 4.0
by the author.