언어(Language)/Java

다형성(polymorphism)

송기동 2023. 8. 9. 18:55
728x90

다형성이란?

하나의 코드가 여러 자료형으로 구현되어 실행되는 것

같은 코드에서 여러 다른 실행 결과가 나옴

정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나임

다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있음

다형성을 사용하는 이유?

상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있음

그렇지 않는 경우 많은 if-else if문이 구현되고 코드의 유지보수가 어려워짐

상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능 구현

여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있음

package ch05;

public class Animal {

	public void move() {
		System.out.println("동물이 움직입니다.");
	}

	public void eating() {
		System.out.println("동물이 먹습니다.");
	}
} // end of Animal class

class Tiger extends Animal {

	@Override // 오버라이드
	public void move() {

		System.out.println("호랑이가 네발로 움직입니다.");
	}

	@Override
	public void eating() {
		System.out.println("호랑이가 사냥합니다.");
	}
} // end of Tiger class

class Human extends Animal {

	@Override
	public void move() {
		System.out.println("사람이 두발로 걸어다닙니다.");
	}

	@Override
	public void eating() {
		System.out.println("밥을 먹습니다.");
	}

	public void readBooks() {
		System.out.println("사람이 책을 읽습니다.");
	}
} // end of Human class

형변환(업캐스팅,다운캐스팅)

package ch06;

public class Animal {

	public void makeSound() {
		System.out.println("동물이 소리를 내고 있습니다.");
	}
} // end of class
package ch06;

public class Bird extends Animal {
	@Override
	public void makeSound() {
		System.out.println("새가 지저귀고 있습니다.");
	}

	public void fly() {
		System.out.println("새가 날아갑니다.");
	}
} // end of class
package ch06;

public class CastingExample {

	public static void main(String[] args) {

		// 다형성, 업캐스팅(Upcasting)
		// 업캐스팅은 하위클래스의 객체를 상위클래스 타입으로
		// 변환하는 것을 말합니다. 이 경우에는 데이터 손실이 없습니다.
		// 업캐스팅은 자동적으로 이루어지므로 별도의 형변환 연산자가 필요없습니다.
		Animal animal = new Bird();

		// 다운캐스팅이란
		// 업캐스팅된 객체를 다시 원래의 하위 클래스타입으로
		// 변환하는 것을 말합니다.
		// 다운캐스팅은 수동적으로 형변환 연산자를 사용하여 이루어집니다.
		// 업캐스팅된 객체를 하위 클래스에 메서드나 속성을 사용하기 위해 필요합니다.
		// 다운캐스팅을 할 땐 반드시 하위 클래스타입으로 변환 가능한지
		// instaceof 연산자로 확인하는 것이 안전합니다.
		Bird bird = (Bird) animal;
		bird.fly();

		// 배열을 활용
		Animal[] animals = new Animal[3];
		animals[0] = new Animal();
		animals[1] = new Bird();
		animals[2] = new Animal();
		System.out.println("=================");

		// 0 -- Animal --> if --> false
		// 1 -- Bird --> if --> true
		// 2 -- Animal --> if --> false
		for (Animal a : animals) {
			a.makeSound();
			// a.fly(); 데이터 타입을 확인하고 싶다면 instanceof 연산자
			if (a instanceof Bird) {
				Bird targetBird = (Bird) a;
				targetBird.fly();
			}
			System.out.println("----------------");
		}
//		for (int i = 0; i < animals.length; i++) {
//			
//		}

	} // end of main

} // end of class
새가 날아갑니다.
=================
동물이 소리를 내고 있습니다.
----------------
새가 지저귀고 있습니다.
새가 날아갑니다.
----------------
동물이 소리를 내고 있습니다.
----------------
728x90