본문 바로가기

프로그래밍/Java

Java_객체지향언어(7)_instanceof연산자, 매개변수의 다형성, 객체배열

① instanceof 연산자

- 참조변수의 형변환 가능여부 확인에 사용. 가능하면 true를 반환한다.

- 반드시 형변환 전에 instanceof로 확인해야 함. 

FireEngine fe=new FireEngine();

System.out.println(fe instanceof Object);
System.out.println(fe instanceof Car);
System.out.println(fe instanceof FireEngine);	//fe의 조상이라는 전제 하에 전부 true 반환.

Object obj=(Object)fe;	//ok
Car c=(Car)fe;		//ok

 

② 매개변수의 다형성

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

- 하나의 배열로 여러 종류 객체를 다룰 수 있다. 

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

class Tv1 extends Product{
    Tv1(){
    	super(100);
    }
    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+"을/를 구입하셨습니다.");
    }
}

class JavaJungsuk_basic_Ex7_8{
    public static void main(String args[]){
    	Buyer b=new Buyer();
        
        b.buy(new Tv1());
        b.buy(new Computer());
        
        System.out.println("현재 남은 돈은 "+b.money+"만원입니다.");
        System.out.println("현재 보너스점수는 "+b.bonusPoint+"점입니다.");
    }
}
결과
Tv을/를 구입하셨습니다.
Computer을/를 구입하셨습니다.
현재 남은 돈은 700만원입니다.
현재 보너스점수는 30점입니다.

→ void buy(Product p) 메서드에서 Product p는 new Tv1()과 new Computer()이다. 

→ Product p=new Tv1();

    b.buy(p);                      를 한 줄로 줄여서 b.buy(new Tv1()); 와 같이 표현할 수 있다. 

 

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

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[2]=new Audio();

배열로 다루어 코드간의 관계성을 더 높여준다.

 

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

class Tv2 extends Product2{
    Tv2(){ super(100) };
    public String toString(){return "Computer";}
}

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

class Audio2 extends Product2{
    Audio2(){ super(50); }
    public String toString(){return "Audio";}
}

class Buyer2{
    int money=1000;
    int bonusPoint=0;
    Product2[] cart=new Product2[10];
    int i=0;
    
    void buy(Product2 p){
    	if(money<p.price){
            System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
            return;
        }
        
        money-=p.price;
        bonusPoint+=p.bonusPoint;
        cart[i++]=p;
        System.out.println(p+"을/를 구입하셨습니다.");
    }
    
    void summary(){
    	int sum=0;
        String itemList="";
        
        for(int i=0; i<cart.length; i++){
            if(cart[i]==null) break;
            sum+=cart[i].price;
            itemList+=cart[i]+", ";
        }
        
        System.out.println("구입하신 물품의 총 금액은 "+sum+"만원입니다.");
        System.out.println("구입하신 제품은 "+itemList+"입니다.");
    }
}

class JavaJungsuk_basic_Ex7_9{
    public static void main(String args[]){
    	Buyer2 b=new Buyer2();
        
        b.buy(new Tv2());
        b.buy(new Computer2());
        b.buy(new Audio2());
        b.summary();
    }
}

결과
Tv을/를 구입하셨습니다.
Computer을/를 구입하셨습니다.
Audio을/를 구입하셨습니다.
구입하신 물품의 총 금액은 350만원입니다.
구입하신 제품은 Tv, Computer, Audio, 입니다.

→ 구입한 제품을 저장하기 위한 배열(cart)을 만들어 객체 배열을 이용하여 제품을 구입하고 구입한 제품과 총금액을 출력하는 코드이다. 

→ 구입한 제품 목록의 마지막에 출력되는 , 가 거슬린다면

itemList += cart[i] + ", ";를 itemList += (i==0) ? "" + cart[i] : ", " + cart[i];와 같이 변경하면 된다.