본문 바로가기

Study/Java

[Java] 다형성

다형성

조상 클래스 타입의 참조 변수로 자손 클래스의 인스턴스를 참조할 수 있다. Tv클래스와 이를 상속받는 CaptionTv클래스가 존재한다고 가정하자.

CaptionTv cap1 = new CaptionTv();
Tv cap2 = new CaptionTv(); // 자손 인스턴스를 부모 클래스 참조변수에 할당하였다

둘의 차이점은, cap1의 경우 CaptionTv클래스의 모든 변수와 메소드를 사용할 수 있지만, Tv 참조 변수에 담긴 cap2는 Tv클래스에 담긴 변수와 메소드만 사용할 수 있다.

이러한 다형성은, 매개변수로 클래스의 타입을 넘겨줄 때와 배열을 생성할 때 유용하게 사용된다.

  • 참조변수가 사용 가능한 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 하므로, 반대의 경우는 사용할 수 없다. 상속을 받으면 적어도 멤버의 개수가 같거나 많이 때문에 이런 다형성이 성립하는 것이다.

참조 변수의 형 변환

서로 상속관계에 있는 클래스 사이에는 형 변환이 가능하다.

  • 자손 ⇒ 조상 : 형변환 생략 가능 (업캐스팅)
  • 조상 ⇒ 자손 : 형 변환 생략 불가 (다운캐스팅)

형 변환은 참조 변수의 타입만 변경하는 것일 뿐, 인스턴스 자체를 변경시키는 것은 아니다. 참조변수의 형 변환을 통해 인스턴스에서 사용 가능한 멤버의 수를 조절하는 것이라고 생각하자.

정리

  • 자손 ⇒ 조상 : 형 변환 생략 가능
  • 조상 ⇒ 자손: 형변환 생략 불가
  • 조상 타입의 인스턴스를 자손 타입의 참조 변수가 참조하는 것은 불가능하다.

헷갈리지 말아야 할 점

조상 타입의 인스턴스를 자손 타입의 참조 변수로 참조하는 것은 허용되지 않는다. Car와 이를 상속하는 SportsCar가 있다고 생각해보자.

Car car1 = new Car();
Car car2 = new SportsCar();
Car car3 = null;
SportsCar sc = null;

sc = (SportsCar)car1; // Car 인스턴스가 생성되었기 때문에, 자손 참조변수에 할당이 불가능하다
sc = (SportsCar)car2; // Car 타입 참조변수에 자손 인스턴스를 할당한 것이므로 가능하다.
car3 = sc; // 조상타입에 자손타입을 할당하는 것이므로 가능하다.

instanceof 연산자

인스턴스의 타입을 알 수 있도록 해주는 연산자이다. 주로 조건문에 사용되고, (참조변수) instanceof (체크할 인스턴스 타입)의  형태로 사용한다.

자식 클래스 instanceof 조상 클래스의 경우, 자식 클래스는 조상 클래스를 늘 포함하고 있으므로 true가 반환된다. 이는 즉, 형 변환을 해도 아무런 문제가 되지 않는다는 것을 의미한다.

참조 변수와 인스턴스의 연결

메소드가 자손클래스에서 오버라이딩 된 경우 참조 변수에 상관없이 오버라이딩된 인스턴스 메소드가 호출된다. 그러나 멤버 변수가 중복으로 선언된 경우, 참조변수의 타입에따라 해당 참조변수 클래스의 멤버 변수가 사용된다.

'Study > Java' 카테고리의 다른 글

[Java] 내부 클래스  (0) 2020.03.15
[Java] 추상클래스  (0) 2020.03.13
[Java] 자바의 제어자  (0) 2020.03.12
[Java] 패키지와 import  (0) 2020.03.12