상속(추상화)과 다형성은 다른 문제해결 방법이다.

상속(추상화)로 해결할 수 있는 부분 → 데이터들의 기능이 다르지 않을때 즉, 데이터들의 기능이 같고 상태가 다를때는 추상화를 통한 상속으로 해결할 수 있다. 하지만 기능이 다를 경우에는 다형성으로 문제를 해결해야 한다.

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
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기