Java/JAVA

[JAVA] 자바의 다형성(polymorphism)

담크 2021. 9. 24. 23:58

자바는 객체지향프로그래밍(OOP) 언어 중 하나로 객체지향프로그래밍의 특징에는 추상화, 상속, 다형성, 캡슐화 이렇게 4가지가 존재합니다. 지난 포스팅에는 자바의 상속에 대해 공부했었는데 오늘은 자바의 다형성에 대해 공부해보도록 하겠습니다.

 

다형성이란?

하나의 객체가 여러가지 타입을 가질 수 있는 것을 말합니다. 반대로 타입이 같을 때 객체에 따라 다른 역할을 하기도 합니다. 오버라이드와 비슷한 특징을 가지고 있죠

다형성의 특징으로는(자식 타입이 부모 타입에 상속되어있다는 필수 전제조건이 필요합니다.)

1. 부모 타입으로 자식 생성 가능

Parent p = new Child();

2. 부모 타입 변수에 자식 대입 가능

Child c = new Child();
Parent p = c;

3. 부모 메소드를 통해 자식 메소드 호출 가능

Parent p = new Child();
p.prn();  //c.prn() 호출

** 같은 부모를 상속받은 자식 클래스는 컴파일할 때 형 변환 가능한 것처럼 작성은 되지만 실제 실행 시 ClassCastException에러를 발생시킨다고 합니다.

입니다.

 

아래 코드로 살펴보겠습니다.

Animal.java

package test01;

public class Animal {
	
	public Animal() {
		System.out.println("동물");
	}
	
	public void bark() {
		System.out.print("울음 소리 : ");
	}

}

Dog.java

package test01;

public class Dog extends Animal{
	
	public Dog() {
		System.out.println("강아지");
	}
	
	public void bark() {
		super.bark();
		System.out.println("멍멍");
	}

}

Cat.java

package test01;

public class Cat extends Animal{
	
	public Cat() {
		System.out.println("고양이");
	}
	
	public void bark() {
		super.bark();
		System.out.println("야옹");
	}

}

MTest.java

package test01;

public class MTest {
	
	public static void main(String[] args) {
		Animal ani = new Dog();
		ani.bark();
		
		ani = new Cat();
		ani.bark();
		
		//instanceof : 해당타입의 객체인지 아닌지 판별한다.
		if(ani instanceof Dog) {
			System.out.println("멍멍이다.");
		} else if(ani instanceof Cat) {
			System.out.println("야옹이다.");
		}
	}

}

코드 실행결과

 

우선 출력 결과가 왜 이렇게 나왔는지 보려면 MTest의 main메소드를 확인해야 합니다.

처음에 Animal 타입의 Dog 객체를 ani라는 이름으로 만들었습니다. 가장 먼저 Animal 클래스의 기본 생성자인 public Animal( )이 호출이 되기 때문에 "동물"이 출력이 됩니다. 그다음은 Dog의 기본 생성자인 "강아지"가 출력이 되겠죠

그다음 ani.bark( )로 bark메소드를 호출했습니다. Dog클래스에서 bark라는 이름의 메소드를 호출했기 때문에

"울음소리 : 멍멍"이 출력됩니다.

그 다음 ani = new Cat( );을 통해 Cat객체로 다시 대입을 했고 그 뒤는 Dog객채에서 했던 행위와 동일합니다.

마지막에 "야옹이다."만 출력된 이유는 코드는 위에서 아래로 읽어가죠? 처음엔 Dog객체로 만들었으나 이후에 Cat객체로 바뀌었기 때문에 "야옹이다."만 출력합니다.