본문 바로가기
JAVA/객체지향

다형성

by chogigang 2023. 2. 23.

조상클래스 타입의 참조변수로조상 자손 관계의 참조변수는 서로 형 자손 클래스의 인스턴스를 참조할 수 있도록 하였습니다

 

 

참조변수가 사용할 수 있는 맴버의 개수는 인스턴스의 맴버 개수보다 같거나 적어야합니다

 

조상타입의 참조변수로 자손타입의 인스턴스를 참조할수있습니다

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

 

 

 

 

 

참조변수의 형변환   

사용할 수 있는 맴버의 갯수를 조절하는 것입니다

조상 자손 관계의 참조변수는 서로 형변환이 가능합니다.

 

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

 

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

 

 

 

 

참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용되지 않습니다

그래서 참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인하는것이 중요합니다

 

instanceOf 연산자

 

형 변환 가능여부 확인후 사용    가능하면 true 반환 합니다.

 

조상 >자손  조상<자손

 

형변환이 가능한지 확인하고 형변환을 합니다

 

class A { }
class B extends A { }   // A 클래스를 상속

public static void main(String[] args) {
    A a= new A();
    B b = new B();

    System.out.println(a instanceof A);   // true 출력
    System.out.println(b instanceof A);   // true 출력 : A를 상속 받았기 때문
    System.out.println(a instanceof B);    // false 출력
    System.out.println(b instanceof B);    // true 출력
}

 

참조변수의 형변환

기본형 변수와 같이 참조변수도 형변환이 가능하다.
단, 서로 상속관계에 있는 클래스 사이에서만 가능하기에
자손타입의 참조변수를 조상타입의 참조변수로,
조상타입의 참조변수를 자손타입의 참조변수로 의 형변환만 가능합니다

기본형 변수의 형변환에서 작은 자료형에서 큰 자료형의 형변환은 생략이 가능하듯,
참조형 변수의 형변환에서도 자손타입의 참조변수를 조상타입으로 형변환할 경우에는 형변환을 생략할 수 있습니다.

다운 캐스팅 : 조상타입의 참조변수 -> 자손타입의 참조변수
업캐스팅 : 자손타입의 참조변수 -> 조상타입의 참조변수

 

 

 

매개변수의 다형성

 

장점 

1.다형적 매개변수

2.하나의 배열로 여러종류 객체다루기

 

참조형 매개변수는 메서드 호출시 자신과 같은 타입또는 자손타입의 인스턴스를 넘겨줄수있습니다.

 

class Product {
    int price; // 제품가격
    int bonusPoint; // 제품구매 시 제공하는 보너스 점수

    Product(int price) { // 생성자
        this.price = price;
        bonusPoint = (int) (price / 10.0); // 보너스 점수는 제품가격의 10%
    }
}

class Tv extends Product {
    Tv() { // 조상클래스의 생성자 Product(int price) 호출
        super(100); // Tv의 가격을 100만원으로 함
    }

    public String toString() { return "Tv"; } // Object클래스의 toString()을 오버라이딩
}

class Computer extends Product {
    Computer() { super(200); }

    public String toString() { return "Computer"; }
}

class Buyer { // 고객
    int money = 1000; // 소유 금액
    int bonusPoint = 0; // 보너스 점수

    void buy(Product p) { // 매개변수의 다형성
        if (money < p.price) {
            System.out.println("잔액 부족");
            return;
        }

        money -= p.price;
        bonusPoint += p.bonusPoint;
        System.out.println(p +  "을/를 구입하셨습니다."); // p.toString()을 사용한 것과 완전히 같은 연산임
        // System.out.println(p.toString() +  "을/를 구입하셨습니다.");
    }
}
public class Ex21_PolyArgumentTest {
    public static void main(String[] args) {
        Buyer b = new Buyer();

        b.buy(new Tv());
        b.buy(new Computer());

        System.out.println(b.money);
        System.out.println(b.bonusPoint);
    }
}

 

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

 

 

 

'JAVA > 객체지향' 카테고리의 다른 글

인터페이스  (0) 2023.02.23
추상 클래스  (0) 2023.02.23
제어자  (0) 2023.02.23
Package와 import  (0) 2023.02.23
super & super()  (0) 2023.02.23