[Java] 다형성/업 캐스팅/다운 캐스팅

소이뎁·2023년 10월 17일
0

Java

목록 보기
16/26
post-thumbnail

📍 다형성

  • 다형성은 단일 작업을 다양한 방식으로 수행하는 것이다.
  • 다형성은 컴파일 시, 런타임 시 나타난다.
  • 컴파일 시 나타나는 다형성은 메소드 오버로딩, 연산자 오버로딩이 있지만 자바는 연산자 오버로딩을 지원하지 않는다.
  • 런타임 시 나타나는 다형성은 메소드 오버라이딩이 있다.
  • 즉, 자바에서 다형성은 메소드 오버로딩(컴파일)과 메소드 오버라이딩(런타임)으로 나타난다.

이미지 출처

📍 업 캐스팅 & 다운 캐스팅

1) 업 캐스팅

  • 업 캐스팅은 자식 클래스를 부모 클래스로 캐스팅하는 것이다.
  • 부모 클래스는 하나이므로 캐스팅 문법 생략이 가능하다.
  • 주로 한 개의 변수 또는 메서드가 여러 형태의 데이터 타입과 호환이 필요한 경우 사용한다. (ex. Animal[]에 Dog, Cat, Tiger를 삽입하는 경우)
// 🟢 Animal Class
package lesson04.quiz01;

public class Animal {
	
	public void onlyAnimal() {
		System.out.println("부모 클래스에만 있는 메소드");
	}
	
	public void cry() {
		// do nothing
	}
}
// 🟢 Cat Class
package lesson04.quiz01;

public class Cat extends Animal {
	@Override
	public void cry() {
		System.out.println("야옹");
	}
	
	public void grooming() {
		System.out.println("그루밍");
	}
}
// 🟢 AnimalTest Class (Main Class)
package lesson04.quiz01;

public class AnimalTest {

	public static void main(String[] args) {

        Animal animal = new Animal();
		animal = new Cat();
        // animal = (Animal)new Cat();

		animal.onlyAnimal(); // 부모 클래스에만 있는 메소드
        // animal.grooming(); // 자식 클래스에만 있는 메소드 -> error
		animal.cry(); // 오버라이딩한 메소드
		
	}

}

2) 다운 캐스팅

  • 다운 캐스팅은 부모 클래스를 자식 클래스로 캐스팅하는 것이다.
  • 자식 클래스는 여러 개일 수 있으므로 캐스팅 문법 생략이 불가능하다.
  • instanceof로 해당 클래스가 실제로 다운 캐스팅하려는 클래스의 인스턴스인지 확인 후 참일 경우에만 수행한다.
  • 주로 업 캐스팅된 객체가 원래 속한 하위 클래스에만 있는 메소드나 필드에 접근해야 할 경우 사용한다.
// 🟢 Animal Class
package lesson04.quiz01;

public class Animal {
	
	public void onlyAnimal() {
		System.out.println("부모 클래스에만 있는 메소드");
	}
	
	public void cry() {
		// do nothing
	}
}
// 🟢 Cat Class
package lesson04.quiz01;

public class Cat extends Animal {
	@Override
	public void cry() {
		System.out.println("야옹");
	}
	
	public void grooming() {
		System.out.println("그루밍");
	}
}
// 🟢 AnimalTest Class (Main Class)
package lesson04.quiz01;

public class AnimalTest {

	public static void main(String[] args) {
		
		Animal animal = new Cat(); // up casting
		
		if(animal instanceof Cat) { // animal이 실제로 Cat의 인스턴스인지 확인
			Cat cat = (Cat)animal; // down casting
			
			cat.onlyAnimal(); // 부모 클래스에만 있는 메소드
			cat.grooming(); // 자식 클래스에만 있는 메소드
			cat.cry(); // 오버라이딩한 메소드
		}

	}

}

3) 업 캐스팅 & 다운 캐스팅 시 메소드 사용 가능 여부

업 캐스팅다운 캐스팅
부모 클래스에만 있는 메소드 사용OO(상속)
자식 클래스에만 있는 메소드 사용XO
자식 클래스에 의해 오버라이딩 된 메소드 사용XX
부모 클래스의 메소드를 오버라이딩한 메소드 사용OO

References

🔗 https://www.geeksforgeeks.org/polymorphism-in-java

0개의 댓글