본문 바로가기
JAVA

JAVA | instanceof연산자, 매개변수 다형성, 객체 배열로 다루기

by 개발송이 2022. 2. 3.

 

 

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