07 상속
07-2 타입 변환과 다형성
다형성이란?
- 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질을 의미한다.
- 다형성은 메소드 재정의와 타입 변환으로 구현한다.
자동 타입 변환
- 자동 타입 변환(promotion)이란? 프로그램 실행 도중 자동으로 타입 변환이 일어나는 것을 말한다.
- 자식은 부모 타입으로 자동 타입 변환이 가능하다.
부모타입 변수 = 자식 타입; // 자동 타입 변환
- cat과 animal 변수는 타입만 다를 뿐, 동일한 Cat 객체를 참조한다.
Cat cat = new Cat();
Animal animal = cat;
cat == animal // true
- 부모 타입으로 자동 변환 이후에는 부모 클래스에 선언된 필드 및 메소드만 접근 가능하다.
- 예외적으로, 메소드가 자식 클래스에서 재정의(오버라이딩)될 경우 자식 클래스의 메소드가 대신 호출된다.
필드의 다형성
- 필드 타입을 부모 타입으로 선언하면 다양한 자식 객체가 저장되어 필드 사용 결과가 달라질 수 있다. → 필드의 다형성
매개 변수의 다형성
- 메소드 호출 시 매개값으로 부모 객체 및 모든 자식 객체를 제공할 수 있다.
- 자식 객체가 부모의 메소드를 재정의했다면 자식의 재정의된 메소드를 호출함으로써 메소드의 실행결과는 다양해질 수 있다. → 매개 변수의 다형성
강제 타입 변환
- 강제 타입 변환(casting)이란? 부모 타입을 자식 타입으로 변환하는 것을 말한다.
- 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 반대로 변환할 때 사용한다.
- 강제 타입 변환을 하면 자식에 선언된 필드와 메소드를 사용할 수 있다.
자식 타입 변수 = (자식타입) 부모타입;
Parent parent = new Child(); // 자동 타입 변환
Child child = (Child) parent; // 강제 타입 변환
Parent parent = new Parent(); // 처음부터 부모 타입으로 객체 생성
Child child = (Child) parent; // 강제 타입 변환 불가능
객체 타입 확인
- instanceof 연산자: 어떤 객체가 어느 클래스의 인스턴스인지 확인한다.
- 우항의 타입으로 객체가 생성되었다면 true를 리턴, 그렇지 않으면 false를 리턴한다.
boolean result = 좌항(객체) instanceof 우항(타입)
- 메소드 내 강제 타입 변환이 필요한 경우 타입을 확인하지 않고 강제 타입 변환하면 ClassCastException이 발생할 수 있다.
마무리 핵심 키워드
- 클래스 타입 변환: 다른 클래스 타입으로 객체를 대입하는 것을 말한다.
- 자동 타입 변환: 자식 객체를 부모 타입 변수에 대입할 때에는 자동으로 타입이 변환된다.
- 강제 타입 변환: 자식 객체가 부모 타입으로 변환된 상태에서 다시 원래의 자식 타입으로 변환하고자 할 때 캐스팅() 연산자를 사용해서 강제 타입 변환할 수 있다.
- instanceof 연산자: 객체가 어떤 타입인지 조사할 때 사용한다. 주로 강제 타입 변환전에 변환이 가능한지 조사할 때 사용한다.
- 다형성: 객체 사용 방법은 동일하지만 실행결과가 다양하게 나오는 성질을 말한다. 다형성을 구현하는 기술은 메소드 재정의와 타입 변환이다. 자식 객체가 재정의된 메소드를 가지고 있을 경우, 부모 타입으로 자동 타입 변환 후에 메소드를 호출하면 재정의된 자식 메소드가 호출 되면서 다양한 실행결과를 가져올 수 있다.
※ 이 내용은 책 [혼자 공부하는 자바]를 보고 정리한 내용입니다.
'🌎 Web > Java' 카테고리의 다른 글
[Java] 추상 클래스 (0) | 2022.12.07 |
---|---|
[Java] 상속(inheritance) (0) | 2022.12.05 |
[Java] 패키지와 접근 제한자 (0) | 2022.11.30 |
[Java] 인스턴스 멤버와 정적 멤버, 싱글톤, final (0) | 2022.11.29 |
[Java] 메소드(method) (2) | 2022.11.28 |