상속(추상화)과 다형성은 다른 문제해결 방법이다.
상속(추상화)로 해결할 수 있는 부분 → 데이터들의 기능이 다르지 않을때 즉, 데이터들의 기능이 같고 상태가 다를때는 추상화를 통한 상속으로 해결할 수 있다. 하지만 기능이 다를 경우에는 다형성으로 문제를 해결해야 한다.
1. 상속(추상화)로 해결하는 문제 - 상위 클래스 만들기
class Animal {
int legCounts = 4;
int earCounts = 2;
int tailCount = 1;
int eyeCounts = 2;
int mouthCount = 1;
int height;
int tailColor;
boolean isCat;
public Animal(
int height,
int tailColor,
boolean isCatOrDog;
) {
this.height = height;
this.tailColor = tailColor;
this.isCat = isCat;
}
}
- 개와 고양이를 추상화한 animal 클래스에서는 개와 고양이 어느것이든 4개의 다리 2개의 귀 1개의 꼬리 등을 가지고 있다는 사실을 기반으로 추상화 되었다. 그리고 단순한 키와 꼬리 색깔만이 다른 개와 고양이를 만들기 위해서는 위에서 보이는 인자들을 넣어 간단하게 만들어 줄 수 있다.
- 단순히 성질 (특징)만이 다른 추상화 클래스를 만들어서 문제를 해결할 수 있다.
- 상속을 하여 cat과 dog를 만드는것도 좋은 방법이다.
- 하지만 아직은 서로 다른 기능을 염두해둔 상태가 아니기 때문에 굳이 cat과 dog라는 클래스를 만들어 상속받아 새로운 기능을 하는 클래스를 만들 실익이 없다.
2. 다형성으로 해결할 문제
class Animal {
int height;
public Animal(
int height
) {
this.height = height;
}
public void sound() { }
}
class Dog extends Animal {
public Dog(
int height
) {
super(height);
}
@override
public void sound() {
System.out.println("bark bark");
}
}
class Cat extends Animal {
public Cat(
int height
) {
super(height);
}
@override
public void sound() {
System.out.println("meow meow");
}
}
- 위와 다르게 아래는 기능이 서로 다른 클래스들이다.
- 기능이 다른 함수들이 필요한 경우에는 다형성을 사용하기 위해 상속을 받아 @override를 사용하는것이 좋은 방법이다.
- 하지만 다형적인 기능을 쓰기 위해서 무분별한 상속 을 하여 구현하는 코드는 안좋은 아키텍쳐를 만들어 낼 수 있다. 예를 들어 horse 클래스를 다형적으로 사용하기 위해 cat클래스 자식으로 만든다면 어떻게 될까? 실제 다형적으로 잘 작동하겠지만 (sub type 다형성) 아키텍쳐로는 잘못된 설계가 될것이다.
결론
상속을 활용하면 당연히 다형성을 활용할 수 있는 기회를 많이 만나게 된다. 하지만 위의 두가지 구분을 확실히 하고 문제를 풀어나가야 하지 않을지 생각해본다.
728x90
최근댓글