자바의 다형성?

다형성은 사용방법은 동일하지만 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질입니다.
이런 다형성을 구현하려면 메소드 재정의와 타입 변환이 필요합니다.

자동 타입 변환

타입 변환이란 타입을 다른타입으로 변환하는 행위를 이야기합니다. 클래스도 마찬가지로 타입 변환이 있는데, 여기서 클래스의 변환은 상속관계에 있는 클래스 사이에서 발생합니다.
(자식은 부모 타입으로 자동 타입 변환이 가능함)

  • 위처럼 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 아래와 같이 자동 타입 변환이 일어날 수 있습니다.
	B b = new B();					A a1 = b;
	C c = new C();		=> 			A a2 = c;
	D d = new D();					A a3 = d;
	E e = new E();					A a4 = e;
		
									B b1 = d;
									C c1 = e;
								

필드의 다형성

그렇다면 왜 자동 타입변환이 필요할까?
그냥 자식타입으로 사용하면 될 것을 부모 타입으로 변환해서 사용하는 이유가 무엇일까?
그것은 다형성을 구현하기 위해서 입니다.
필드의 타입을 부모타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 대문에 필드 사용 결과가 달라질 수 있습니다. 이것이 필드의 다형성입니다.
프로그램은 수많은 객체들이 서로 연결되고 각자의 역할을 하게 되는데, 이 객체들은 다른 객체로 교체될 수 있어야 합니다.
이것을 프로그램으로 구현하기 위해서 상속과 재정의, 타입 변환을 이용합니다.

매개 변수의 다형성

자동 타입변환은 필드의 값을 대입할 때에도 발생하지만, 주로 메소드를 호출할 때 발생합니다. 메소드를 호출할 때에는 매개 변수의 타입과 동일한 매개값을 지정하는 것이 정석이지만, 매개값을 다양화하기 위해 매개 변수에 자식 객체를 지정할 수도 있습니다.

  • 즉, 매개변수의 타입이 클래스일 경우에는 해당 클래스의 객체뿐만 아니라 자식객체까지도 매개값으로 사용할 수 있다는 것입니다.

강제 타입 변환

부모 타입을 자식 타입으로 변환하는 것을 말합니다. 그렇다고 해서 모든 부모 타입을 자식 타입으로 강제 변환할 수 있는 것은 아닙니다.
자식 타입이 부모 타입으로 자동 타입 면환한 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있습니다.

자식 타입이 부모 타입으로 자동 변환하면, 부모에 선언된 필드와 메소드만 사용이 가능하다는 제약 사항이 생깁니다.
만약 자식에 선언된 필드와 메소드를 꼭 사용해야 한다면 강제 타입 변환을 해서 다시 자식 타입으로 변환한 다음 자식의 필드와 메소드를 사용하면 됩니다.

객체 타입 확인

강제 타입 변환은 자식 타입이 부모 타입으로 변환되어 있는 상태에서만 가능하기 때문에 다음과 같이 처음부터 부모 타입으로 생성된 객체는 자식타입으로 변환할 수 없습니다.
그렇다면 부모 변수가 참조하는 객체가 부모 객체인지 자식 객체인지 확인하는 방법은?
instance of 연산자를 이용합니다.

boolean result = 좌항(객체) instanceof 우항(타입)
profile
항상 더 나은 개발자가 되기 위해서 끊임없이 공부하고 학습하면서 성장하는 사람이 되겠습니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN