Abstract Data Type (ADT)
- single syntactic unit에서 관련된 데이터와 함수들을 encapsulation 시킨다.
Single syntactic unit
- 프로그램의 조직화, 수정, 분리가 증가함
Encapsulation
- reliability가 증가함.
- data의 표현을 숨김으로써, 유저는 객체에 직접 점근할 수 없거나 표현에 의존할 필요가 없다.
- 유저 코드에 영향을 신경 쓸 필요 없이 변화시킨다.
ex) 만약 Stack에서 array 대신 linked list로 구현을 바꾼다 해도 ADT는 바꿀 필요가 없다.
Class = ADT + Inheritance + Polymorphism
- Interitance는 재사용성의 향상
- Polymorphism은 flexibility의 향상
class ClientOfShape {
void renderShape(Shape s) {
if (s.type == LINE) DrawLine(s.data);
else if ((s.type == CIRCLE) DrawCircle(s.data);
else if ((s.type == RECT) DrawRect(s.data);
else if ((s.type == TRIANGLE) DrawTriangle(s.data);
}
}
다음과 같은 코드가 있을 때 만약 새로운 Shape의 하위 class가 여러개 생성된다면 코드에 다 추가해야 한다는 불편함이 있다.
Inheritance
Y가 X로부터 상속을 받을 때
- Y는 X의 method를 모두 상속 받는다. 즉, X에 보낼 수 있는 메세지를 Y한테 보내도 작동한다.
- Y는 X의 data를 모두 상속 받는다. 즉, Y의 인스턴스는 X의 data를 모두 가지고 있다.
- 상속 관계에 있으면 "Y is a X" 가 성립된다.
- 모든 Y의 인스턴스는 X의 인스턴스이다.
- X type 인스턴스에 Y type 인스턴스가 전달 되어도 된다.
Polymorphism
다른 class들에서 operation이 다른 방식으로 일어나게 할려면
- 같은 이름의 다양한 method가 필요함
Polymorphism의 종류
- Runtime polymorphism (Dynamic Polymorphism)
- Method Overiding
- Compile time polymorphism (Static polymorphism)
- Method Overloading
Method Overloading
같은 이름의 parameter의 type이나 갯수가 다른 것
이는 컴파일 타임에서 일어남
class X {
void methodA(int num) {
System.out.println("mothodA:" + num);
}
void methodA(int num1, int num2) {
System.out.println("mothodA:" + num1 + "," + num2);
}
double methodA(double num) {
System.out.println("mothodA:" + num);
return num;
}
}
public class Main {
public static void main(String[] args) {
X obj = new X();
double result;
obj.methodA(20);
obj.methodA(20, 30);
result = obj.methodA(5.5);
System.out.println("Answer is:" + result);
}
}
Method Overriding
다른 클래스 안에 같은 이름의 operation이 각각 있는 것
이는 런타임에 일어남
class X {
public void methodA() {
System.out.println("hollo, I'm methodA of class X");
}
}
class Y extends X {
public void methodA() {
System.out.println("hollo, I'm methodA of class Y");
}
}
public class Main {
public static void main(String[] args) {
X obj1 = new X();
X obj2 = new Y();
obj1.methodA();
obj2.methodA();
}
}
(Run-time) Polymorphism
polymorphic 변수는 클래스와 그 클래스 하위에 있는 클래스를 참조할 수 있는 클래스 안에 정의될 수 있다.
'CS > 소프트웨어 공학' 카테고리의 다른 글
GRASP (1) | 2024.06.15 |
---|---|
Detailed Design (0) | 2024.06.15 |
MVC (0) | 2024.06.15 |
Logical Architecture and UML Package Diagram (0) | 2024.06.15 |