-
728x90
다형성(polymorphism)
다형성
- 조상클래스 타입의 참조변수로 자손클래스의 인스터스를 참조할 수 있도록 하였다는 것.
// CationTv는 tv를 상속받음 Tv t = new Tv(); CpationTv c = new CationTv(); Tv t = c // t 는 CaptionT 인스터스의 모든 멤버를 사용할 수 없다. // 둘 다 같은 타입 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다.
참조변수가 사용할 수 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다.
조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.
자손타입의 참조변수로 조상타입의 인스터스를 참조할 수 없다.
형변환
- 자손 타입 > 조상 타입 (Up-Casting) : 형변환 생략 가능
- 자손 타입 < 조상타입 (Down-casting) : 형변환 생략 불가
// FireEngine 은 Car을 상속 받음 Car car = null FireEngine fe = new FireEngine(); FireEngine fe2 = null; car = fe // 형변환 생략 가능 (car)fe fe2 = (FireEngine)car // 형변환 생략 불가능 // 여기서 중요한점 car의 인스턴스 참조 타입을 봐야함 fireEngine이여야지만 가능
- 서로 상속관계에 있는 타입간의 형변환은 양방향으로 자유롭게 수행될 수 있으나, 참조변수가 가리키는 인스턴스의 자손타입으로형변환은 허용되지 않는다. 결국 참조변수가 가르키는 인스턴스의 타입이 무언인지 확인하는 것이 중요하다.
instance of
- 어떤 타입에 대한 instanceof연산의 결과가 true라는 것은 검사한 타입으로 형변환이 가능하다는것이다.
참조변수와 인스턴스의 연결
조상 클래스에 선언도니 멤버변수와 같은 이름의 인스턴스변수를 자손 클래스에 중복으로 정의했을 때, 조상타입의 참조변수로 자손 인스턴스를 참조하는 경우와 자손타입의 참조 변수로 자손 인스턴스를 참조하는 경우는 서로 다른 결과를 얻는다
메서드의 경우 조상 클래스의 메서드를 자손의 클래스에서 오버라이딩한 경우에도 참조 변수의 타입에 관계없이 항상 실제 인스턴스의 메서드가 호출 되지만, 멤버변수의 경우 참조변수의 타입에 따라 달라진다.
static 메서드는 static 변수처럼 참조변수의 타입에 영향을 받는다.
참조변수의 타입에 영향을 받지 않는 것은 인스턴스 메서드 뿐이다.static 메서드는 반드시 참조변수가 아닌 클래스이름. 메서드()로 호출해야 한다.
//child 는 parent 를 상속 // method 메소드 중복 , x 변수 중복 Parent p = new Child(); Child c = new Child(); System.out.prinit(p.x); // parent x System.out.prinit(c.x); // child x System.out.prinit(p.method); // child method System.out.prinit(c.method); // child method
- 매개변수의 다형성 ```java void buy(product p ){ money =money - p.price; bonusPoint = ponusPoint + p.bounsPoint; }
- 매개변수가 Product타입의 참조변수라는 것은 메서드의 매개변수로 Productc클래스의 자손타입의 참조변수면 어느것이나 매개변수로
받아들일 수 있다.
728x90