자바의 정석 7장 (16일차) - 다형성 & 참조변수의 형변환

728x90
반응형

다형성 - polymorphism

조상 타입 참조 변수로 자손 타입 객체를 다루는 것

  • 다만 반대의 경우는 불가능 (자손타입이 조상타입 객체를 가리키는 것)
    • 참조된 인스턴스 멤버의 개수(조상)가 실제 사용 가능한 개수(자손)보다 적기때문에 오류 발생

아래와 같이 객체와 인스턴스 타입이 불일치함을 다형성을 표현하였다고 함

		TV t = new SmartTV(); // 객체와 인스턴스 타입이 불일치
		SmartTV st = new SmartTV();

 

객체와 인스턴스가 불일치함의 의미는 사용할 수 있는 인스턴스 멤버의 개수가 달라진다고 볼 수 있다.

 

만약 다형성이 아니라면 (객체와 인스턴스가 일치하면)

  • 아래의 코드처럼 TV의 클래스에 들어있는 총 4개의 변수 + SmartTv 클래스의 2개의 변수 = 총 6개를 사용가능

만약 다형성이라면 (객체와 인스턴스가 불일치하면)

  • TV의 클래스에 들어있는 총 4개의 변수만 사용가능하고 SmartTv에 들어있는 calltv 메서드는 사용 불가능
		TV t = new SmartTV(); // 객체와 인스턴스 타입이 불일치
		SmartTV st = new SmartTV();
		
		st.calltv("hello");
		t.calltv //에러
	}
}

class SmartTV extends TV{ // 인스턴스 멤버 총 2개
	String text;
	
	void calltv(String text){
		System.out.println(text);
	}
	
}
class TV{ //인스턴스 멤버 총 4개
	int channel;
	int volume;
	
	void channelup() {
		++channel;
	}
	void channeldown() {
		--channel;
	}
}

타입이 불일치할때 가능한 장점 2가지


참조변수의 형변환

사용할 수 있는 멤버의 개수를 조절하는 것

  • 기본형변환(float to int, 3.6 -> 3)과 같이 값(주소값 & 객체값)이 변경되는 것이 아닌 멤버의 개수만 달라짐

조상 자손관계의 참조변수는 서로 형변환 가능

  • 아래와 같이 st라는 SmartTV를 대변하는 인스턴스를 새로운 TV 클래스에 대입하면 자동 형변환이 됨
  • 자동 형변환이 되면서 사용가능한 멤버변수가 6개에서 4개로 조절된다
		TV t = new SmartTV(); // 객체와 인스턴스 타입이 불일치
		SmartTV st = new SmartTV();
		
		TV t2 = st; //뜻은 즉 TV t2 = new SmartTV() 자동 형변환이 됨
//		즉 사용가능한 멤버변수의 개수를 6개에서 4개로 줄인말과 같음

 

조상타입에서 자손타입으로 형변환 시킬 경우

  • (SmartTV)를 붙여 형변환을 시켜줘야 오류가 나지 않음 - 사용 가능한 멤버변수가 4개에서 6개로 증가하였기 때문
    • 사용 가능한 멤버변수가 증가하면 어떤 멤버를 지칭할지 모르므로 꼭 형변환을 써줘야 작동이 됨
    • 멤버변수가 증가하는 형변환은 무조건 형변환 생략불가, 나머지는 형변환 생략가능
		TV t = new SmartTV(); // 객체와 인스턴스 타입이 불일치
		SmartTV st = new SmartTV();
		
		TV t2 = st; //뜻은 즉 TV t2 = new SmartTV() 자동 형변환이 됨
//		즉 사용가능한 멤버변수의 개수를 6개에서 4개로 줄인말과 같음
		
		SmartTV st2 = (SmartTV)t;// SmartTV st2 = new TV
//		즉 사용가능한 멤버변수를 4개에서 6개로 늘림, 이 경우는 증가했으므로 (SmartTV)를 붙여줘서 형변환 시켜야 함

 

결국 참조변수 형변환은 조상과 자손타입의 관계에서만 가능하고 형변환을 하는 행동은 TV의 리모콘을 교체하는 것이라고 이해하면 편함

SmartTV를 TV리모콘으로 이용 or SmartTV리모콘으로 이용

728x90
반응형