타입변환과 다형성 (Polymorphism)
다형성
- 같은 타입이지만 실행 결과가 다양한 객체를 이용(대입)할 수 있는 성질
- 하나의 타입에 여러 개의 객체를 대입하여 다양한 기능 이용 가능
- 부모 타입에는 모든 자식 객체가 대입 가능
- 자식 타입은 부모 타입으로 자동 타입 변환됨
-
프로그램 실행 중에 자동 타입 변환이 일어나는 것
-
비록 변수는 자식 객체를 참조하지만
-
변수로 접근 가능한 멤버는 부모 클래스 멤버로 한정
-
바로 위의 부모가 아니더라도 상속 계층의 상위이면 자동 타입 변환 가능
주의! - 변환 후에는 부모 클래스 멤버만 접근가능
예외의 경우 : 오버라이딩
- 메소드가 자식 클래스에 오버라이딩 되었다면
- 자식 클래스의 메소드가 대신 호출됨
강제 타입 변환 (Casting)
주의! - 모든 부모 타입을 자식 클래스 타입으로 강제 변환할 수 있는 것은 아니고
- 조건 : 자식 타입을 부모 타입으로 자동 변환된 후, 다시 자식 타입으로 변환할 때만 가능 (원위치 개념)
강제 타입 변환이 필요한 경우
- 자식 타입이 부모 타입으로 자동 변환되면
- 부모 타입에 선언된 필드와 메소드만 사용 가능(오버라이딩 예외)
- 자식 타입에 선언된 필드와 메소드를 다시 사용해야 할 경우
instanceof 연산자 : 객체 타입 확인
- 참조 변수가 참조하고 있는 인스턴스의 실제 타입 확인
- 부모 타입이면 모두 자식 타입으로 강제 타입 변환할 수 있는 것 아님
- 부모 타입으로 변환되어 있는 상태에서만 강제 타입 변환 가능
- 아니면 ClassCastException 예외 발생
- 먼저 자식 타입인지 확인 후 강제 타입 실행해야 함
instanceof
연산자
boolean result = 참조변수 instanceof 타입(클래스명)
: 왼쪽의 참조변수가 오른쪽 타입의 인스턴스이면 true 반환
: true 반환되면 참조변수가 검사한 타입으로 타입 변환 가능
매개변수의 다형성
- 매개변수가 클래스 타입인 경우
- 매개값을 다양화하기 위해 매개변수에 자식 타입 객체 대입 허용 (자동 타입 변환)
- 따라서, 해당 객체뿐 아니라 자식 객체까지도 매개값으로 사용 가능
- 매개 값으로 어떤 객체가 전달되느냐에 따라 실행 결과 달라짐 → 매개변수의 다형성
- 자식 객체가 부모의 메소드를 재정의 했다면 내부에서 오버라이딩된 메소드를 호출함으로써 실행 결과 다양해짐