-
자바 다형성(polymorphism)자바 2021. 3. 14. 16:43
객체지향개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다. 즉 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다는 것이다.
class Tv { boolean power; int channel; void power() { power = !power; } void channelUp() { ++channel; } voud channelDown() { --channel; } } class CaptionTv extends Tv { String text; void caption() { } } Tv t = new Tv(); CaptionTv c = new CaptionTv();
서로 상속관계에 있을 경우, 다음과 같이 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하도록 하는 것도 가능하다.
CaptionTv c = new CaptionTv(); Tv t = new CaptionTv();
허나 Tv타입의 참조변수로는 Tv클래스의 멤버들만 사용할 수 있다.
조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.
반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.
참조형변수의 형변환
기본형 변수와 같이 참조형변수도 형변환이 가능하다.
자손타입 -> 조상타입 : 형변환 생략가능
조상타입 -> 자손타입 : 형변환 생략불가
class Car { String color; int door; void drive() { System.out.println("drive, Brrr~"); } void stop() { System.out.println("stop!!!"); } } class FireEngine extends Car { void water() { System.out.println("water!!!"); } } class Ambulance extends Car { voud siren() { System.out.println("siren~~~"); } } Car car = null; FireEngine fe = new FireEngine(); FireEngine fe2 = null; car = fe; fe2 = (FireEngine) car;
형변환은 참조변수의 타입은 변환하는 것이지 인스턴스를 변환하는 것은 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 끼치지 않는다.
Car car = new Car(); Car car2 = null; FireEngine fe = null; fe = (FireEngine)car; // 컴파일은 ok. 실행 시 에러가 발생
참조변수 car가 참조하고 있는 인스턴스가 Car타입의 인스턴스라는데에서 문제가 발생한다.
조상타입의 인스턴스를 자손타입의 참조변수로 참조하는 것은 허용되지 않는다.
컴파일 시에는 참조변수간의 타입만 체크하기 때문에 실행 시 생성될 인스턴스의 타입에 대해서는 전혀 알지 못한다.
그래서 컴파일 시에는 문제가 없었지만, 실행 시에는 에러가 발생하는것이다.
서로 상속관계에 있는 타입간의 형변환은 양방향으로 자유롭게 수행될 수 있으나, 참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용되지 않는다.
매개변수의 다형성
class Product { int price; int bonusPoint; } class Tv extends Product {} class Computer extendds Product {} class Audio extends Product {} class Buyer { int money = 1000; int bonusPoint = 0; void buy(Product p) { money = money - p.price; bounsPoint = bonusPoint + p.bonusPoint; } }
매개변수가 Product타입의 참조변수라는 것은, 메서드의 매개변수로 Product클래스의 자손타입의 참조변수면 어느 것이나 매개변수로 받아들일 수 있다는 것이다.
남궁성,『Java의 정석』,도우출판
'자바' 카테고리의 다른 글
자바 String 클래스 (0) 2021.03.14 접근 제어자 (0) 2021.03.14 자바 객체지향 (0) 2021.03.12 자바의 변수(variable)에 대해서 (0) 2021.03.10 JVM(Java Virtual Machine) (0) 2021.03.10