일반화
“여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정”
바나나, 사과, 배, 오렌지 -> 과일
과일 = 바나나, 사과, 배, 오렌지를 일반화 한 것이다.
역은 특수화!!
</br>
이 그림에서 부모 클래스는 A, 자식 클래스는 A1,A2,A3
이때! 다음 관계가 성립해야 한다.
</br>
제약 조건
</br>
- disjoint
-> 자식 클래스 객체가 동시에 두 클래스에 속할 수 없다.
- complete
-> 자식 클래스의 객체에 해당하는 부모 클래스의 객체와 부모 클래스의객체에 해당하는 자식 클래스의 객체가 하나만 존재햐아 한다.
</br>
각 회원들은 VIP, 일반 회원 상관없이 Item(물품)을 구입할 수 있다.
이때 연관관계를 각 등급의 회원들로 하는것이 아닌, 그 둘의 부모 클래스인 member로 표현하는 것이 더 깔끔하다.
</br>
학생이 있다고 하자.
학생은 놀기(playing) or 공부하기(studying) 상태만 있다고 가정하자.
놀기 = toy
공부하기 = book
상태에 따라서 연관관계가 달라진다.
만약 둘의 상태가 없고 student에 book과 toy가 연결되어 있다면 혼란이 올 수 있다.
따라서, 명확하게 분할해야 한다.
다중 분류
앞서 봤던 그림 2-10에서 member에는 구매액으로만 나누는 것이 아닌, 지역별로도 나눌 수 있다.
이렇게 되면, 회원은 vip이면서 지역사람이 될 수 있다.
이것이 바로 다중 분류 이다.
한 인스턴스가 동시에 여러 클래스에 속함
다형성
“서로 다른 클래스의 객체가 같은 메세지를 받았을 때 각자의 방식으로 동작하는 능력
Speak!!! 고양이 -> 야옹, 강아지 -> 멍멍
다형성이 없다면 각 동물들(class)마다 개별적으로 불러줘야 했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public abstract class Pet{
public abstract void talk();
}
public class Cat extends Pet{
public void talk(){
System.out.println("야옹");
}
}
public class Dog extends Pet{
public void talk(){
System.out.println("멍멍");
}
}
public class Parrot extends Pet{
public void talk(){
System.out.println("안녕");
}
}
이 상태에서
1
Pet p = new Parrot();
을 실행한다면?
P는 Parrot 클래스의 객체를 참조한다.
이게 바로 ‘다형성’
Typecastring
자식 클래스 -> 부모 클래스 Typecasting 가능
Pet p = new Parrot(); -> o
자식 클래스 -> 자식 클래스 Typecasting 불가능
Cat c = new Dog(); -> x
정적 메서드(static)는 상속을 통해 override되지 않는다.
정적 메서드를 실행할 때 동적 바인딩을 실행 x
컴파일할 때 결정된 객체의 타입에 따라 실행될 메서드 결정.