5.3 instanceof연산자
-참조변수의 형변환 가능여부 확인에 사용함. 가능하면 true반환
(조상<->자손)
-형변환 전에 반드시 instanceof로 확인해야 함
(조상과 자기자신에 대해 참을 반환함)
void doWork(Car c){
if (c instanceof FireEngine) { //형변환 가능한지 확인
FireEngine fe = (FireEngine)c; //형변환
fe.water();
...
//형변환 하는 이유는 인스턴스의 원래 기능을 모두 사용하기 위해서임
//Car타입의 리모컨인 c로는 water()를 호출할 수 없으니까
//리모컨을 FireEngine타입으로 바꿔서 water()호출함
class Ex17 {
public static void main(String[] args) {
FireEngine fe = new FireEngine();
if (fe instanceof FireEngine) {
System.out.println("This is a FireEngine instance");
}
if(fe instanceof Car) {
System.out.println("This is a Car instance");
}
if(fe instanceof Object) {
System.out.println("This is an Object instance");
}
System.out.println(fe.getClass().getName());
}
}
class Car {}
class FireEngine extends Car {}
Q.참조변수의 형변환을 왜 하는지?
A.참조변수(리모컨)을 변경함으로써 사용할 수 있는 멤버의 갯수를 조절하기 위해서
Q.instanceof연산자는 언제 사용하는지?
A.참조변수를 형변환하기 전에 형변환 가능여부를 확인할 때
5.4 참조변수와 인스턴스의 연결
조상타입의 참조변수와 자손 타입의 참조변수의 차이점은 사용할 수 있는 멤버의 개수이다.
그런데 멤버변수가 조상 클래스와 자손 클래스에 중복으로 정의 된 경우,
조상타입의 참조변수 사용 시 - 조상클래스에 선언된 멤버변수 사용
자손타입의 참조변수 사용 시 - 자손클래스에 선언된 멤버변수 사용됨
중복된 경우는 참조변수의 타입에 따라 달라지지만 중복되지 않은 경우는 하나뿐이니 차이 없다.
public class Ex18 {
public static void main(String[] args) {
Parent p = new Child();
Child c = new Child();
//타입은 다르지만 참조변수 p,x둘다 Child인스턴스 참조 중
System.out.println("p,x=" + p.x); //100
p.method();
System.out.println("c.x="+ c.x); //200
c.method();
} //메서드는 참조변수 타입에 관계없이 항상 실제 인스턴스 타입인 Child클래스애 정의된 메서드 호출
} //인스턴스 변수는 참조변수의 타입에 따라 다른걸 출력함
class Parent {
int x = 100;
void method() {
System.out.println("Parent Method");
}
}
class Child extneds Parent {
int x = 200;
void method() {
System.out.println("Child Method");
}
}
5.5 매개변수의 다형성
다형성의 장점 1. 다형적 매개변수
2. 하나의 배열로 여러종류 객체 다루기
다형성이란
1.Tv t = new SmartTv(); 조상타입의 참조변수로 자손객체 다루는
2.참조변수의 형변환-리모컨 바꾸기(사용할 수 있는 멤버개수 조절)
3.instanceof연산지 - 형변환 가능 여부 체크에 사용
-참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
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() { reuturn "Computer";}
}
class Buyer {
int money = 1000;
int bonusPoint = 0;
void buy(Product p) { //이 하나의 메서드로 new Tv(), new Computer() 다 처리
if(money < p.price) {
System.out.println("잔액이 부족하여 물건 살 수 없습니다.")
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p + "을/를 구입하셨습니다."); //p.toString호출
}
}
class PolyArgumentTest {
public static void main(String args[]) {
Buyer b= new Buyer();
b.buy(new Tv()); //buy(Product p)
b.buy(new Computer()); //buy(Product p)
System.out.println("현재 남은 돈은" + b.money + "만원입니다");
System.out.println("현재 보너스점수는"+ b.bonusPoint+"점 입니다.");
}
}
제품종류가 늘어날때 마다 buy메서드를 추가해줘야 하는데
메서드의 매개변수에 다형성을 적용해 하나의 메서드로 처리함.
5.6 여러 종류의 객체를 배열로 다루기
다형성의 장점 1. 다형적 매개변수
2. 하나의 배열로 여러종류 객체 다루기
-조상타입의 배열에 자손들의 객체를 담을 수 있다.
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();
//이 코드를 Product타입의 참조변수 배열로 처리하면 다음과 같음
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[3] = new Audio();
조상타입의 참조변수 배열을 사용하면, 공통의 조상을 가진 서로 다른 종류의 객체를 배열로 묶어 다룰 수 있음
class Buyer {
int money = 1000;
int bonusPoint = 0;
Product[] item = new Product[10]; //구입한 제품을 저장하기 위한 배열 생성, 여러종류의 물건 담기 가능
int i = 0; //Product배열 item에 사용될 index
void buy(Product p) {
if(money < p.price) {
System.out.println("잔액이부족합니다");
return;
}
money -= p.price; //가진돈에서 제품 가격 뺌
bonusPoint += p.bonusPoint;
item[i++] = p; //제품을 Product[] item에 저장함
System.out.println(p + "를 구매했습니다.");
}
}
Vector()
-가변배열 기능
-Object배열을 가지고 있어서 모든 종류의 객체 저장가능
'JAVA' 카테고리의 다른 글
JAVA | final 상수 (0) | 2022.02.06 |
---|---|
JAVA | 재귀호출, 변수의 초기화 (0) | 2022.02.05 |
JAVA | 다형성, 참조변수의 형변환 (0) | 2022.01.28 |
JAVA | 오버라이딩, package, import, 제어자 (0) | 2022.01.26 |
JAVA | 상속, 포함관계 (0) | 2022.01.24 |