IT 끄적장

OOP(Object Oriented Programming)의 특성 (다형성) 본문

OOP

OOP(Object Oriented Programming)의 특성 (다형성)

kyunghoon_dev 2019. 11. 15. 15:32
  • 다형성
    서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력.

다형성은 상속관계와 함께 서브 클래스를 개별적으로 다룰 필요 없이 한 번에 처리할 수 있는 수단을 제공한다.

 

간단하게 애완동물을 예시로 다형성의 개념을 살펴보자.

 

애완동물에는 고양이, 강아지, 앵무새 등 여러 종류의 동물이 있다. 이러한 동물은 같은 행동을 하더라도 행동 방식 자체는 다르다.  고양이에게 말을 걸면 '야옹~', 강아지는 '멍멍~', 앵무새는 '짹짹' 거리며 대답을 할 것이다.

고양이, 강아지, 앵무새는 모두 'talk'라는 연산을 수행하지만 talk를 하는 행동 방식은 모두 다르다.

 

이것이 바로 다형성의 개념이다.

 

다형성은 상속과 연계되어 동작하면 매우 강력한 기능은 제공한다.

아래의 코드를 살펴보자.

 

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("짹짹~");
    	}
   
}

그리고 다음과 같이 pet에 바인딩 된 객체에 pet.talk()를 실행하면, 현재 pet이 실제 참조하는 객체에 따라 실행되는 talk 메소드의 동작이 달라진다.

Pet pet = new Cat();
pet.talk();

 

 

그렇다면 다형성을 사용하지 않고 애완동물 세 마리의 울음 소리를 호출하는 코드를 작성하고, 이와 비교해 다형성을 통해 작성한 코드가 얼마나 코드를 단순하고 유연하게 만드는지 확인해 보자.

 

public class Dog{
	public void bark(){
    	...
    }
}

public class Cat{
	public void meow(){
    	...
    }
}

public class Parrot{
	public void sing(){
    	...
    }
}


public class main(){
	public static void main(String[]args){
    	Dog dog = new dog();
        Cat cat = new cat();
        Parrot parrot = new parrot();
        
        dog.bark();
        cat.meow();
        parrot.sing();
    }
}

위는 상속과 다형성을 사용하지 않은 코드이다. 모든 애완 동물 클래스 객체를 만들어 각 클래스 객체의 메소드를 호출해주어야 한다. 이 경우에는 새로운 애완동물이 추가될 경우 해당 애완동물의 짖는 메소드를 새로 불러주는 코드를 호출해주어야 한다. 

 

public abstract class Pet(){
	public abstract void talk();
}

public class Dog extends Pet(){
	public void talk(){
    		...
    	}
}

public class Cat extends Pet(){
	public void talk(){
    		...
    	}
}

public class Parrot extends Pet(){
	public void talk(){
    		...
    	}
}

public class main{
	public void groupTalk(Pet[] pet){
    		for(int i=0;i< pet.length();i++){
        		pet.talk();
       		 }
    	}

	public static void main(String[]args){
    		Pet pet = {new Cat(),new Dog, new Parrot};
        	groupTalk(pet);
    	}

}

반면에 상속과 다형성을 사용하여 작성한 코드는 groupTalk() 메소드 부분에서 구체적으로 현재 어떤 클래스 객체가 참조되는지와 무관하게 pet의 talk() 메소드를 통해 모든 애완동물의 울을 소리를 표현할 수 있다.

 

이것이 가능한 이유는 상속관계에 있을 때 부모 클래스의 레퍼런스 변수가 자식 클래스의 객체를 참조할 수 있기 때문이다. 단, 부모 클래스의 레퍼런스 변수가 접근할 수 있는 것은 부모 클래스가 물려준 메소드와 변수뿐이니 참고하자.