본문 바로가기
Language/java

Java_Study 객체지향 프로그래밍_다형성(polymorphism)

by gamxong 2022. 7. 6.

 

다형성이란?

 

 : 여러 가지 형태를 가질 수 있는 능력

 : 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함

-> 조상클래스의 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 함.

 

 

상속관계에 있을 경우, 조상 클래스의 타입의 참조변수로 자손 클래스의 인스턴스를 참조하도록 하는 것이 가능

Tv t = new CaptionTv();

 

CaptionTv c = new CaptionTv();
Tv t = new CaptionTv();

 - 둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다.

 

 

조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.
반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.

 

 

참조변수의 형변환

 

 - 상속 관계에 있는 클래스사이에서만 가능.

[참조변수] instanceof [타입(클래스명)]

 

자손타입 -> 조상타입 형변환 생략가능
자손타입 <- 조상타입 형변환 생략불가

 

Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;

car = fe;              // car = (Car)fe; 에서 형변환 생략 (업캐스팅)
fe2 = (FireEngine)car; // 형변환 생략불가 (다운캐스팅)

 - 참조변수 형변환은 인스턴스에 아무런 영향을 미치지 않는다.

 - 단지 멤버의 개수를 조절하는 것 뿐이다.

 

 

instanceof 연산자

 

: 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용

 

 

어떤 타입에 대한 instanceof연산의 결과가 true라는 것은 검사한 타입으로 형변환이 가능하다는 것을 뜻한다.

 

 

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

 

 * 멤버변수가 조상클래스와 자손 클래스에 중복으로 정의된 경우

  1. 조상타입의 참조변수 사용했을 경우 -> 조상 클래스에 선언된 멤버변수가 사용
  2. 자손타입의 참조변수 사용했을 경우 -> 자손 클래스에 선언된 멤버변수가 사용

 

매개변수의 다형성

 

class Product {
	int price;
	int bonusPoint;
    
    Product(int price) {
    	this.price = price;
        bonusPoint = (int)(price/10.0);
}

class Tv extends Product {
	Tv() {
    	super(100);
    }
    
    public String toString() {
    	return "Tv";
    }
}

class Computer extends Product {
	Computer() {
    	super(200);
    }
    
    public String toString() {
    	return "Computer";
    }
}


class Buyer {
	int money = 1000;
    int bonusPoint = 0;
    
    void buy(Product P) {
		money = money - p.price;
    	bonusPoint = bonusPoint + p.bonusPoint;
	}

}

class PolyArgumentTest {
	public static void main(String args[]) {
    Buyer b = new Buyer();
    
	b.buy(new Tv());
	b.buy(new Computer());
	}
}

 

 

여러 종류의 객체를 배열로 다루기

 

product p1 = new Tv();
product p2 = new Computer();
product p3 = new Audio();

//

Product p[] = new Product[3];
p[0]= new Tv();
p[1]= new Computer();
p[2]= new Audio();

 

메서드 / 생성자 설명
Vector() 10개의 객체를 저장할 수 있는 Vector인스턴스 생성
10개 이상의 인스턴스가 저장되면, 자동적으로 크기 증가
boolean add(Object o) Vector 객체를 추가한다.
성공하면 true, 실패하면 false 반환
boolean remove(Object o) Vector에 저장되어 있는 객체를 제거
성공하면 true, 실패하면 false 반환
boolean isEmpty() Vector가 비어있는지 검사
비어있으면 true, 아니면 false 반환
Object get(int index) 지정된 위치(index)의 객체를 반환
Object타입이므로 적절한 형변환이 필요
int size() Vector에 저장된 객체의 개수 반환

 

//Ex

Vector item = new Vector();

댓글