- 기본 타입 변환 처럼 클래스에서도 타입 변환이 있다.
- 다형성 : 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행 결과가 나오도록 하는 성질
- 다형성을 구현하려면 상속, 메소드 재정의와 타입변환이 필요하다.
1. 자동 타입 변환
- 자동 타입 변환(promotion)이란 ? 프로그램 실행 도중에 자동으로 타입 변환이 일어나는 것
- 클래스의 변환은 상속 관계에 있는 클래스 사이에서 발생한다.
- 자동 타입 변환의 개념은 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다는 것
- 따라서 자식은 부모 타입으로 자동 타입 변환이 가능하다.
- 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입 이라면 자동 타입 변환이 일어날 수 있다.
- 즉, 아래의 그림에서 D객체는 바로 위의 부모인 B타입으로 자동 타입 변환이 될 수도 있고, A 타입으로 자동 타입 변환이 될 수 있다.
- 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.
- 그러나 예외가 있는데, 메소드가 자식클래스에서 재정의 되는 경우이다. 이땐 자식 클래스의 메소드가 대신 호출된다. (다형성)
- Child 객체는 method3() 메소드를 가지고 있지만, Parent 타입으로 변환된 이후에는 method3()을 호출할 수 없다.
- 그러나 부모와 자식 모두에게 있는 method2()는 재정의를 통해 타입 변환 이후에도 호출이 가능하다.
2. 필드의 다형성
- 자동 타입 변환이 왜 필요할까? 다형성을 구현하기 위해서이다.
- 다형성을 구현하는 법 : 상속 + 재정의 + 타입 변환
- 필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 있다.
- 자식 클래스는 부모의 메소드를 재정의해서 메소드의 실행 내용을 변경함으로써 더 우수한 실행 결과가 나오게 할 수 있다.
- 예를 들어, 부모 클래스인 Tire의 필드값을 자식 클래스인 HankookTire에서 필드값을 교체함으로써 부모클래스의 메소드를 수정하지 않아도 자식클래스에서 다양한 메소드를 실행할 수 있는 것!
-
더보기Tire 클래스가 Car 클래스와 같은 패키지에 있다고 가정하자. 그렇다면 Car 클래스는 Tire클래스를 사용할 수 있다. 그래서 Car 클래스에서 Tire클래스로 각 바퀴에 대한 객체를 만들었다. 바퀴의 수명이 다하면 새로운 객체로 바꿔주려고 한다. Tire 클래스를 부모 클래스로 하는 자식 클래스 Hankook과 Kumho 를 만들고 타이어 교체시기가 되면 해당 위치의 타이어를 hankook이나 kumho 클래스로 새로운 객체를 만들어서 교체해줄 수 있다. 이때 hankook과 kumho 클래스의 roll을 재정의했을 경우 이전에 사용했던 roll과는 다르게 작동한다. 이렇게 다양한 자식 객체를 넣어 결과가 달라지는 것을 다형성이라고 한다.
3. 매개 변수의 다형성
- 자동 타입 변환은 필드의 값을 대입할 때에도 발생하지만, 주로 메소드를 호출할 때 많이 발생한다.
- 메소드 호출 시 매개값으로 부모 객체 및 모든 자식 객체를 제공할 수 있다.
- 매개 변수의 다형성은 매개값으로 어떤 자식 객체가 제공되느냐에 따라 메소드의 실행결과가 다양해 질 수 있다.
- 자식 객체가 부모의 메소드를 재정의 했다면 재정의된 메소드를 호출함으로써 메소드의 실행결과가 다양해 진다.
4. 강제 타입 변환
- 강제 타입 변환(casting) : 부모 타입을 자식 타입으로 변환하는 것
- 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 자식 타입으로 변환할 때만 적용된다.
- 자식 타입이 부모 타입으로 자동 타입 변환하면, 부모에 선언된 필드와 메소드만 사용 가능한데,
- 만약 자식에 선언된 필드와 메소드를 사용하고 싶다면, 자식 타입으로 다시 강제 타입 변환해서 자식의 필드와 메소드를 사용한다.
5. 객체 타입 확인
- 어떤 객체가 어떤 클래스의 인스턴스인지 확인하기 위해 instanceof 연산자를 사용한다.
- instanceof 연산자는 주로 매개값의 타입을 조사할 때 사용된다.
- 메소드 내에서 강제 타입 변환이 필요할 경우 반드시 매개값이 어떤 객체인지 확인하고 안전하게 강제 타입 변환을 해야 한다.
- 만약 타입을 확인하지 않고 강제 타입 변환을 시도하면 - ClassCastException이 발생할 수 있다.
// 사용법
boolean result = 객체 instanceof 타입
// Parent가 부모 클래스고 Child가 자식 클래스라고 가정하자.
Parent parent = new Parent();
// parent라는 객체가 Child로부터 만들어진 객체냐?
parent instanceof Child // false // classcastexception 발생
// Child 객체가 자동 타입 변환으로 parent에 대입됨
Parent parent = new Child();
// 활용법
public void method(Parent parent){
// parent는 child 객체가 자동 타입 변환된 경우이므로 true
if (parent instanceof Child){
// 강제 타입 변환 조건에 맞으므로 강제 타입 변환 가능
Child child = (Child) parent;
}
}
참고자료
- https://velog.io/@qwd101/%ED%98%BC%EA%B3%B5%EC%9E%90-ch7-2-%ED%83%80%EC%9E%85-%EB%B3%80%ED%99%98%EA%B3%BC-%EB%8B%A4%ED%98%95%EC%84%B1
- https://hyuntaekhong.github.io/blog/java-basic21/
- https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mals93&logNo=220716656982
- https://backtony.github.io/java/2020-11-22-java-16/
'Coding > Java' 카테고리의 다른 글
[23] JAVA 인터페이스 (0) | 2022.12.04 |
---|---|
[22] JAVA 추상클래스 (0) | 2022.12.03 |
[20] JAVA 상속 (0) | 2022.11.30 |
[19] JAVA 패키지와 접근 제한자 (0) | 2022.11.29 |
[18] JAVA 인스턴스(객체) Instance (0) | 2022.11.27 |