본문 바로가기
Java

자바 중급 034. 매개변수 다형성 : 이용하는 이유 예제)- 조상클래스 매개변수를 작성하고 자식 클래스 매개변수로 접근

by Smart Factory in 2020 2021. 9. 26.
728x90
반응형

안녕하세요. 스마트 팩토리입니다. 

자바 중급 034. 매개변수 다형성 :  이용하는 이유 예제)-  조상클래스 매개변수를 작성하고 자식 클래스 매개변수로 접근에 대해 알아보겠습니다. 

1.  매개변수 다형성

가. 매개변수 다형성

   - 참조타입의 매개변수는 메소드에 접근할때 자신과 같은 타입이거나 또는 자손 타입의 주소를 넘겨준다.
   - 조상의 매개변수로 접근할 수 있으면 자손 타입도 접근할 수 있다.  
   - 조상클래스의 매개변수가 있어서 자손 클래스의 매개변수를 접근하기 때문에 코드가 간단해진다. 하지만 접        근할 수 있는 매개변수는 조상클래스 멤버변수만 접근이 가능하다. 


나. 상속 계층도 

Product 클래스를 부모 클래스로 하여 자식 클래스는 3개 Audil 클래스,Tv 클래스, Computer 클래스 

상속관계 없는 클래스는 Product 클래스(메인 실행 클래스), Buyer 클래스 

<<Product.java 부모클래스>>

Product 클래스 로 부모 클래스를 작성함. 
가격과 보너스 포인트를 구하도록 해준다. 

public Product(int price)  매개변수로 부모 클래스의 인스턴스 변수 price를 적용

package example05;

public class Product {
int price;
int GetPoint;

public Product(int price) {
this.price=price;
this.GetPoint=(int)(price/10.0);
}
}

<<Audio. java 자식클래스2>>

Audio 자식클래스 Audio(){}; 생성자 

{} 블럭 안에 super(100) 있으므로 적용시 price=100이 적용됨.

package example05;

public class Audio extends Product{
public Audio() {
super(100);
}
 @Override
public String toString() {

return "Audio  클래스";
}
}

<<Tv.java 자식클래스2>>

Tv자식 클래스로 역시 생성자 로 내부 블럭 안에 super(300)이 있어서 price=300으로 적용됩니다.

package example05;

public class Tv extends Product{
public Tv() {
super(300);
}
 @Override
public String toString() {

return "Tv  클래스";
}
}

<<Computer.java 자식클래스3>>

Computer 자식 클래스 역시 생성자에서 조상 클래스 생성자가 적용되어 price=200으로 적용됩니다.

package example05;

public class Computer extends Product{
public Computer() {
super(200);
}
 @Override
public String toString() {

return "Computer  클래스";
}
}

<<Buyer.java 클래스: 독립클래스>>

Buryer 클래스로 구매자 클래스로 객체를 만들 수 있는 설계도입니다. 

초기값은  Totatl_money=1000, Total_GetPoint=100으로 시작하게 하였습니다. 

멤버 변수 값을 조정하여 객체에서 새롭게 적용할 수 있습니다 

public void buy(Tv tv1) {


if(this.Total_money<tv1.price) {
System.out.println(" 잔액 부족하여 , 구매를 할 수 없습니다. ");
  return; 
}

여기서 buy() 메소드 입니다. 매개변수로 Tv 클래스의 객체를 적용하였습니다.
이렇게 되면 다른 객체를 적용할 수 없고 Tv 객체만 적용됩니다. 

자손 클래스를 적용되게 하기 위해서 하나하나 다 동일한 코드를 작성하는 상황이 벌어집니다.이 때 적용할 수 있는 것이 조상 클래스의 객체를 적용하는 다형성입니다. 그렇게 되면 조상 클래스의 인스턴스 변수를 적용하기 때문에 자식 클래스도 적용할 수 있습니다. 

package example05;

public class Buyer {
int Total_money=1000;;
int Total_GetPoint=100;;

public void buy(Tv tv1) {
if(this.Total_money<tv1.price) {
System.out.println(" 잔액 부족하여 , 구매를 할 수 없습니다. ");
  return; 
}

this.Total_money-=tv1.price;
this.Total_GetPoint=tv1.GetPoint;
System.out.println(tv1+"를 구매했습니다");
}

}

<<ProductEx.java 메인 실행클래스(1)>>

Buyer buyer1=new Buyer();
Tv tv1=new Tv();
buyer1.buy( tv1);

Buyer 클래스를 호출하여 burer1 번 고객 객체를 생성했습니다.

Tv 클래스에 접근하여 tv1객체를 생성하고, 그 객체 tv1을 Buyer클래스의  buy()메소드를 실행시켰습니다. 

tv1은 객체가 생성될때 생성자를 호출하게 됩니다 tv1.price는 price=300 이 됩니다. (  Tv생성자에서 super(300) 이 있음. )
 
그 값을 가지고 Buy1.buy(tv1)을 실행하여 

해당 조건을 만족합니다.

System.out.println(tv1+"를 구매했습니다");를 출력

Tv 클래스를 구매했습니다.
출력합니다. 

다음 

System.out.println(" 잔액은 : "+ buyer1.Total_money+"만원입니다.");
System.out.println("  현재 보너스 포인트 :"+buyer1.Total_GetPoint+"점입니다.");

를 각각 출력하여 그결과

잔액은 : 700만원입니다.
현재 보너트포인트 :30점입니다. 

출력합니다.  

package example05;

public class ProductEx {
public static void main(String[] args) {
Buyer buyer1=new Buyer();
Tv tv1=new Tv();
buyer1.buy( tv1);
System.out.println(" 잔액은 : "+ buyer1.Total_money+"만원입니다.");
System.out.println("  현재 보너스 포인트 :"+buyer1.Total_GetPoint+"점입니다.");
System.out.println();

}
}

<<ProductEx.java 메인 실행클래스 2번째 >>

 Buyer buyer2=new Buyer();
    buyer2.Total_money=2000;
    buyer2.Total_GetPoint=200;
buyer2.buy(new Tv());
System.out.println(" 잔액은 : "+ buyer2.Total_money+"만원입니다.");
  System.out.println("  현재 보너스 포인트 :"+buyer2.Total_GetPoint+"점입니다.");

 

두번째 바이어를 추가하고 초기값을 2000만원, 200점으로 초기홛값을 선정하였습니다. 첫번째 바이어와 마찬가지로 Tv를 구매하였습니다. 

package example05;

public class ProductEx {
public static void main(String[] args) {
Buyer buyer1=new Buyer();
Tv tv1=new Tv();
buyer1.buy( tv1);
System.out.println(" 잔액은 : "+ buyer1.Total_money+"만원입니다.");
    System.out.println("  현재 보너스 포인트 :"+buyer1.Total_GetPoint+"점입니다.");
System.out.println();

    Buyer buyer2=new Buyer();
    buyer2.Total_money=2000;
    buyer2.Total_GetPoint=200;
buyer2.buy(new Tv());
System.out.println(" 잔액은 : "+ buyer2.Total_money+"만원입니다.");
    System.out.println("  현재 보너스 포인트 :"+buyer2.Total_GetPoint+"점입니다.");
    System.out.println();
}
}

다. 매개변수 다양성- 매개변수가 부모클래스의 객체라면

 

 

<< Buyer.java 클래스  변형>>

 buy(Tv tv1) --> buy(Product prod1) 으로 변경하였습니다.

이하 tv1 부분 모두가 prod1으로 변경하였습니다. 이는 매개변수의 형변환으로 tv 뿐만 아니라 자손 클래스인 Audio, Computer 모두 접근할 수 있습니다.

 

<<ProductEx.java 메인 실행클래스 3번째 >>

buyer1, buyer2 모두가 적용되는 것을 볼 수 있습니다. 

    buyer1.buy(new Audio());
    buyer1.buy(new Computer());
    System.out.println(" 잔액은 : "+ buyer1.Total_money+"만원입니다.");
    System.out.println("  현재 보너스 포인트 :"+buyer1.Total_GetPoint+"점입니다.");

buyer1은 Audio, Computer도 코드 한줄로 구매한 결과값을 볼 수 있습니다. 

 

package example05;

public class ProductEx {
public static void main(String[] args) {
Buyer buyer1=new Buyer();
Tv tv1=new Tv();
buyer1.buy( tv1);
System.out.println(" 잔액은 : "+ buyer1.Total_money+"만원입니다.");
    System.out.println("  현재 보너스 포인트 :"+buyer1.Total_GetPoint+"점입니다.");
System.out.println();

    Buyer buyer2=new Buyer();
    buyer2.Total_money=2000;
    buyer2.Total_GetPoint=200;
buyer2.buy(new Tv());
System.out.println(" 잔액은 : "+ buyer2.Total_money+"만원입니다.");
    System.out.println("  현재 보너스 포인트 :"+buyer2.Total_GetPoint+"점입니다.");
    System.out.println();
    
    buyer1.buy(new Audio());
    buyer1.buy(new Computer());
    System.out.println(" 잔액은 : "+ buyer1.Total_money+"만원입니다.");
    System.out.println("  현재 보너스 포인트 :"+buyer1.Total_GetPoint+"점입니다.");
             
}
}

매개변수의 다형성이 적용하면 자손클래스만 늘려주면 해당 클래스를 적용할때는 부모 클래스를 활용할 수 있습니다. 코드가 중복되는 것을 막고 코드가 단순해 진다는 것이 포인트입니다. 

728x90
반응형

댓글