일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- kubernetes
- 상속성
- 어플리케이션셋
- ArgoCD
- delegation
- 빌드
- Encapsulation
- kubernetes in actin
- kubenetes in action
- kubernetes component
- kube
- 레이블 셀렉터
- 쿠버네티스 어노테이션
- kubenetes
- kubenetes architecture
- kubernetes in action
- OOP
- Abstraction
- 객체지향
- 피터코드
- applicationset
- maven
- 레이블
- 쿠버네티스
- 캡슐화
- 메이븐
- argocd applicationset
- 위임
- 피터코드의 상속규칙
- 추상화
- Today
- Total
IT 끄적장
OOP(Object Oriented Programming)의 특성 (다형성) 본문
- 다형성
서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력.
다형성은 상속관계와 함께 서브 클래스를 개별적으로 다룰 필요 없이 한 번에 처리할 수 있는 수단을 제공한다.
간단하게 애완동물을 예시로 다형성의 개념을 살펴보자.
애완동물에는 고양이, 강아지, 앵무새 등 여러 종류의 동물이 있다. 이러한 동물은 같은 행동을 하더라도 행동 방식 자체는 다르다. 고양이에게 말을 걸면 '야옹~', 강아지는 '멍멍~', 앵무새는 '짹짹' 거리며 대답을 할 것이다.
고양이, 강아지, 앵무새는 모두 '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() 메소드를 통해 모든 애완동물의 울을 소리를 표현할 수 있다.
이것이 가능한 이유는 상속관계에 있을 때 부모 클래스의 레퍼런스 변수가 자식 클래스의 객체를 참조할 수 있기 때문이다. 단, 부모 클래스의 레퍼런스 변수가 접근할 수 있는 것은 부모 클래스가 물려준 메소드와 변수뿐이니 참고하자.
'OOP' 카테고리의 다른 글
OOP - 피터 코드(Peter Coad)의 상속 규칙 (0) | 2019.11.15 |
---|---|
OOP(Object Oriented Programming)의 특성 (상속성)-2 (0) | 2019.11.14 |
OOP(Object Oriented Programming)의 특성 (상속성) -1 (0) | 2019.11.14 |
OOP(Object Oriented Programming)의 특성 (캡슐화) (0) | 2019.11.14 |
OOP(Object Oriented Programming)의 특성 (추상화) (0) | 2019.11.14 |