[JAVA]상속 중 타입 변환

혜원·2023년 8월 13일

JAVA

목록 보기
3/3

다형성

다형성이란 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행 결과가 나오도록 하는 성질이다. 예를 들어 자동차가 타이어를 사용하는 방법은 동일하지만 어떤 타이어를 사용(장착)하느냐에 따라 주행 성능이 달라질 수 있다.

다형성을 구현하려면 메소드 재정의타입 변환이 필요하다.



자동 타입 변환

클래스의 타입 변환은 상속 관계에 있는 클래스에서 발생한다. 자식은 부모 타입으로 자동 타입 변환이 가능하다.
자동 타입 변환은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다. 자동 타입 변환은 다음과 같은 조건에서 일어난다.

부모타입 변수 = 자식타입; 일 경우 자식이 부모 타입으로 자동 타입 변환이 발생한다.
예를 들어 부모 클래스가 Animal이고 자식 클래스가 Cat일 경우
위 코드의 경우 Cat 타입의 cat 객체를 생성한다. 밑 줄의 경우 cat 변수에 할당된 Cat 클래스의 객체를 animal 변수에 할당하는 부분이다. 이것이 바로 타입 변환의 예시이다. 여기서 animal 변수는 Animal 타입으로 선언되었지만, Cat 클래스의 객체를 할당받을 수 있다. Cat이 Animal을 상속받았기 때문이다.

이렇게 함으로써, animal 변수는 사실상 Cat 클래스의 객체를 가리키고 있다. 하지만 컴파일러는 animal 변수를 Animal 타입으로 인식한다. 따라서 animal 변수를 통해 Cat 클래스에만 있는 메서드나 속성에 접근하는 것은 불가능하다. 만약 Animal 클래스에 정의된 메서드나 속성을 사용하려면 가능하다.

또한 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있다.

부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메서드만 접근이 가능하다. 비록 변수는 자식 객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스 멤버로만 한정된다. 그러나 예외가 존재한다. 메소드가 자식 클래스에서 재정의 되었다면 자식 클래스의 메소드가 대신 호출된다. 이것은 다형성과 관련이 있기 때문에 매우 중요한 성질이다.


그렇다면 왜 자동 타입 변환이 필요할까? 그냥 자식 타입으로 사용하면 될 것을 부모타입으로 변환해서 사용하는 이유가 무엇일까? 그것은 다형성을 구현하기 위해서이다. 필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 있다. 이것이 필드의 다형성이다.

부모 클래스를 상속하는 자식 클래스는 부모가 가지고 있는 필드와 메소드를 가지고 있으니 사용 방법이 동일할 것이다. 자식 클래스는 부모의 메소드를 재정의하여 메소드의 실행 내용을 변경함으로써 더 우수한 실행 결과가 나오게 할 수도 있다. 그리고 자식 타입을 부모 타입으로 변환할 수 있다.

0개의 댓글