Java/정석

다형성

hs_developer 2022. 6. 1. 15:19

다형성은 상속과 깊은 관계가 있음.

 

여러가지 형태를 가지는 것을 의미하며, 참조변수 하나로 여러 타입의 객체를 참조하도록 한다. 

 

class TV
{
	boolean power; // 전원
	int channel; // 채널
	
	void power() 
	{
		power = !power;
	}
	
	void channelUp()
	{
		++channel;
	}
	
	void channelDown()
	{
		--channel;
	}
}

class CaptionTV extends TV
{
	String text;
	
	void caption()
	{
		...
	}
}

 

 

 

 

TV와 CaptionTV 클래스가 서로 상속 관계에 있을 경우, 다음과 같이 parent 클래스의 참조변수로 child 클래스의 인스턴스를 참조가 가능하다.

 

TV t = new TV();
CaptionTV c = new CaptionTV();
TV t = new CaptionTV(); // parent 타입의 참조변수로 child 인스턴스 참조

 

 

 

class Car
{
	String color;
	int door;
	
	void drive()
	{
		System.out.println("drive, Brrr~"); // 운전하는 기능

	}
	
	void stop()
	{
		System.out.println("stop!!"); // 멈추는 기능
	}
}

class FireEngine extends Car // 소방차
{
	void water()
	{
		System.out.println("water!!!"); // 물 뿌리는 기능
	}
}

class Ambulance extends Car // 구급차
{
	void siren()
	{
		System.out.println("siren!!"); // 사이렌 울리는 기능
	}
}
class Test
{
	public static void main(String[] args) {
		
		Car car = null;
		FireEngine fe = new FireEngine();
		FireEngine fe2 = null;
		
		fe.water(); // water!!!
		car = fe; 
		fe2 = (FireEngine)car; 
		fe2.water(); // water!!!
		
	}
    
 
// 결과
water!!!
water!!!
class Test
{
	public static void main(String[] args) {
		
		Car car = new Car();
		Car car2 = null;
		FireEngine fe = null;
		
		car.drive(); // drive, Brrr~
		fe = (FireEngine)car;
		fe.drive();
		
		car2 = fe;
		car2.drive();
		
	}
}


// 결과
drive, Brrr~
Exception in thread "main" java.lang.ClassCastException: class Car cannot be cast to class FireEngine (Car and FireEngine are in unnamed module of loader 'app')
	at Test.main(Test.java:43)

 

서로 상속 관계에 있는 타입 간의 형 변환은 가능하나, 참조 변수가 가리키는 인스턴스의 child 타입으로 형 변환은 안된다.

 

그래서 참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인하는 것이 중요하다.

 

 

 

instanceof 연산자

 

FireEngine 인스턴스입니다.
Car 인스턴스입니다.
Object 인스턴스입니다.
FireEngine
class Car {
	
}

class FireEngine extends Car {
	
}

class Test {
	public static void main(String[] args) {
		FireEngine fe = new FireEngine();
		
		if(fe instanceof FireEngine)
		{
			System.out.println("FireEngine 인스턴스입니다.");
		}
		
		if(fe instanceof Car)
		{
			System.out.println("Car 인스턴스입니다.");
		}
		
		if(fe instanceof Object)
		{
			System.out.println("Object 인스턴스입니다.");
		}
		
		System.out.println(fe.getClass().getName()); // 클래스 이름 출력
	}
}

 

생성된 인스턴스는 FireEngine 타입인데도, Object 타입과 Car 타입의 instanceof 연산에서 true 값을 얻었다. 

 

왜냐하면, FireEngine 클래스는 Object 클래스와 Car 클래스의 child 클래스이므로 parent 멤버들을 상속 받았기 때문에, FireEngine 인스턴스는 Object 인스턴스와 Car 인스턴스를 포함한다.

 

 

 

추가 필요

 

 

 

 

'Java > 정석' 카테고리의 다른 글

인터페이스  (0) 2022.06.03
추상 클래스  (0) 2022.06.02
오버라이딩  (0) 2022.06.01
static, instance 메소드  (0) 2022.05.29
배열  (0) 2022.05.29