다형성

프로그래밍/자바 2008. 2. 13. 00:28

다형성이란?

다형성이란 여러가지 형태를 가질 수 있는 능력을 뜻하며,

자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현한다. 다시 말해, 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 한다.

 

다형성의 특징

-조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있다.

 그렇게 되면 조상클래스 타입의 참조변수로 자손클래스에 있는 멤버들에 접근할 수 있다.

 , 조상클래스에서 상속받은 멤버들만 접근할 수 있고, 자손클래스에서 만들어진 멤버들에는

 접근할 수 없다.

-자손타입의 참조변수로 조상타입의 인스턴스는 참조할 수 없다.

-반드시 상속관계가 이뤄져야 한다.

 

다형성은 어떤 경우에 사용하는가?

-하나의 참조변수로 여러타입의 객체를 참조할 때.

-여러(자손)클래스의 객체들을 하나의(조상)클래스의 배열로 묶어 다룰 경우.

-하나의 매개변수로 여러 타입의 참조변수를 받을 경우.

 

다형성을 사용함으로써 생기는 장점

-좀 더 객체지향적인 프로그래밍을 짤 수 있다.

-여러 클래스들을 하나의 배열로 묶어 다룰 수 있기 때문에 반복문등을 사용하는등

 편리하게 사용할 수 있다. 가령 클래스안의 특정 수들을 더하고자 할 경우 객체마다 별도로

 계산을 하려면 복잡하지만 하나의 배열로 묶으면 반복문을 사용하면 훨씬 짧은 코드로

 쉽게 구현할 수 있다.

-객체의 참조변수를 매개변수로 받을 경우, 객체의 타입마다 그 타입에 맞춰 매개변수를 생성하게 되면 매개변수의 개수도 계속 늘어나게 되어 코드가 복잡해지고 유지보수에도 어려움이 따르지만 조상클래스 타입의 참조변수 하나를 매개변수로 사용하게 되면 그 메서드 하나만으로

구현을 할 수가 있어 코드가 훨씬 간단해지고 유지보수도 수월하다.

 

다형성은 어떻게 사용하는가?

-      매개변수에 다형성을 적용하는 경우

 

class Product {
      int price;                   //
제품의 가격
      int bonusPoint;             //
제품구매 시 제공하는 보너스점수

}
class Tv extends Product {}
class Computer extends Product {}
class Audio extends Product {}

class Buyer {                   //
고객, 물건을 사는 사람

      int money = 1000;       //
소유금액

      int bonusPoint = 0;       //
보너스점수

void buy(Product p) {    //이렇게 조상클래스 하나를 매게변수로 두면
     money = money - p.price;      
//어떤 (자손)클래스의 참조변수라도 다 받을 수가 있다.
     bonusPoint = bonusPoint + p.bonusPoint;
//여기서 p 는 들어오는 참조변수마다 달라진다.
     }    
//예를 들어 Tv의 참조변수가 들어오면 Tv에 있는 멤버들을,
}        //Audio의 참조변수가 들어오면 Audio에 있는 멤버들을 각각 달리 접근하게 된다.

 

아래는 실행 예 이다.

 

 

public class buyerTest{

publc static void main( String[] args ){

Buyer b = new Buyer();

Tv t = new Tv();

Computer c = new Computer();

b.buy(t);

b.buy(c);

}

}

-      여러 개의 객체를 배열로 다룰 수 있다.

Product p[] = new Product[3];

p[0] = new Tv();

p[1] = new Computer();

p[2] = 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;                  
// 구입한 제품들을 하나 배열로 다룰 수 있다.

System.out.println(p + "/를 구입하셨습니다.");
      }
}

참고로 다형성을 비롯한 자바 객체지향에 관한 내용 대부분은 [플래쉬로배우는 자바] 참조 하였음.

Posted by 윤연식
,