조상클래스 타입의 참조변수로조상 자손 관계의 참조변수는 서로 형 자손 클래스의 인스턴스를 참조할 수 있도록 하였습니다
참조변수가 사용할 수 있는 맴버의 개수는 인스턴스의 맴버 개수보다 같거나 적어야합니다
조상타입의 참조변수로 자손타입의 인스턴스를 참조할수있습니다
반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없습니다
참조변수의 형변환
사용할 수 있는 맴버의 갯수를 조절하는 것입니다
조상 자손 관계의 참조변수는 서로 형변환이 가능합니다.
자손타입 ->조상타입 :형변환 생략가능
자손타입 <-조상타입 : 형변환 생략 불가
참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용되지 않습니다
그래서 참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인하는것이 중요합니다
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 |