본문 바로가기

Com/Java

[Java] 추상 메소드, 다형성 예제 / Abstract Method, polymorphism 예제

앞에서 올린 추상 메소드와 다형성개념을 간단한 코드 예제를 통해 살펴보겠습니다.

예제 프로그램은 간단하게 생산자(Productor)와 소비자(Consumer)가 거래를 하는것으로 짜보도록 하겠습니다. 생산자와 소비자는 서로 거래를 통해 물건과 돈을 교환합니다. 여기서 거래라는 비슷한 행위가 발생하는데 이것을 추상 메소드를 통해 구현하겠습니다.

거래라는 기능을 추상 메소드를 가진 Productor 클래스와 Consumer 클래스의 슈퍼클래스를 생성합니다.

abstract class SuperClass {
    SuperClass(){
    
    }
    abstract void trade(int cost, int numOfProduct); //추상 메소드 생성 가격과 물건의 갯수를 전달인자로 받는다
}

그리고 이 슈퍼클래스를 상속받는 Productor 클래스와 Consumer 클래스를 생성한 후 trade 라는 추상 메소드를 같은 전달인자와 함께 재정의합니다.(Overriding)

public class Productor extends SuperClass{
    private int numOfProduct;
    private int income;
    public final int priceOfProduct = 500;

    Productor(){
        this.numOfProduct = 10;
        this.income = 0;
    }
    Productor(int numOfProduct){
        this.numOfProduct = (numOfProduct>0)? numOfProduct: 10;
        this.income = 0;
    }
    public int getCost(int numOfProduct){//가격을 전달인자로 넘겨주기 위해 가격을 계산하는 메소드
        return numOfProduct * priceOfProduct;
    }
    public void trade(int cost, int numOfProduct){//추상 메소드를 오버라이딩해서 기능구현
        income+=cost;
        this.numOfProduct-=numOfProduct;
    }
    public String toString(){
        return ("Number of product :"+numOfProduct+"\nIncome : "+income);
    }
}

 

public class Consumer extends SuperClass{
    private int money;
    private int numOfProduct;

    Consumer(){
        this.money = 1000;
        this.numOfProduct = 0;
    }
    Consumer(int money){
        this.money = (money>0)? money: 1000;
        this.numOfProduct = 0;
    }
    public void trade(int cost, int numOfProduct){//추상 메소드를 오버라이딩해서 기능 구현
        money-=cost;
        this.numOfProduct += numOfProduct;
    }
    public String toString(){
        return ("money : "+money+"\nNumber of product : "+numOfProduct);
    }
}

이제 추상 메소드가 어느 정도 이해되셨나요? 다음은 다형성을 이용해 거래하는것을 묘사해보겠습니다.

public class Use {
    public static void main(String[] args) {
        Productor p1 = new Productor(30);       //생산자 p1인스턴스에게 물건을 30개 주고
        Consumer c1 = new Consumer(30000); //소비자 c1인스턴스에게 3만원을 준다

        SuperClass[] obj = new SuperClass[2]; //슈퍼클래스인 SuperClass 인스턴스 생성
        obj[0] = p1;       //obj[0]에 p1 인스턴스를 넣고
        obj[1] = c1;       //obj[1]에 c1 인스턴스를 넣는다 -> 다형성(polymerphism)

        int cost = p1.getCost(5); //물건 5개의 가격을 구한다

        for(int i=0;i<2;i++)        //p1과 c1이 물건 5개를 거래한다
            obj[i].trade(cost,5);

        System.out.println("--Productor--"); //결과값 출력
        System.out.println(p1);
        System.out.println("--Consumer--");
        System.out.println(c1);
 }

}

각각 Productor, Consumer 인스턴스인 p1, c1을 각각의 슈퍼클래스인 SuperClass 에 담아서 거래를 묘사했습니다. 이렇게 슈퍼클래스에 각각의 서브클래스를 담는 것이 다형성(polymorphism)의 한 예입니다.