다형성 ( Polymorphism )
- 다형성이란 "객체가 여러 형태를 가진다" 라는 의미로 해석한다.
- 하나의 객체가 여러가지 유형으로 사용되는 것을 의미한다.
- 다형성은 상속을 전제조건으로 한다.
- 다형성을 위해 자바는 자식클래스가 부모클래스의 타입을 가질 수 있도록 허용한다.
- 즉, 부모타입에 모든 자식객체가 대입이 가능하다.
class A {}
class B extends A {}
class C extends A {}
class D extends B {}
class E extends C {}
public class basic {
// 다형성 - 다양한 형태를 지닌 성질
// 자식 객체가 부모타입을 가질 수 있는 성질
A a = new A();
B b = new B();
C c = new C();
D d = new D();
E e = new E();
A a1 = b; // B가 A로 자동형변환
A a2 = new B();
}
강제 타입 변환 ( Type Casting )
- 강제 타입 변환은 부모타입을 자식타입으로 변환하는 것을 말한다.
- 객체에서 타입 캐스팅을 사용하려면 우선 먼저 Promotion 이 일어나야 한다.
- 즉, 부모타입으로 한 번 형 변환이 된 자식 객체만 강제 타입 변환을 사용할 수 있다.
참고
Promotion이 일어나면 자식 클래스가 가지고 있는 재정의되지 않은 메서드를 사용할 수 없다는 단점이 있다.
이것을 극복을 위해, 강제 타입 변환을 사용하여 자식 메서드를 호출하는 방법을 사용한다.
public class MainClass {
public static void main(String[] args) {
Parent p = new Parent();
Child c = new Child();
c.method01();
c.method02();
c.method03();
System.out.println("---------------다형성-------------------");
Parent pc = c; // 1차 형변환
Child cc = (Child)pc; // 2차 형변환
cc.method01();
cc.method02();
cc.method03();
}
}
이종 모음 ( Heterogeneous Collection )
- 이중 모음은 배열에 다형성을 적용시키는 원리이다.
- 배열은 원래 동종모음 구조이다.
- 예를 들어 int[] Arr = new int[10]; 이런 구조의 배열이 있다면 Arr 배열에는 int형 정수 데이터만 저장가능하다.
- 하지만 다형성을 이용 시, 이종모음 구조의 객체 배열이 생성 가능하다.
매개변수의 다형
- Promotion은 멤버 변수의 값을 대입할 때도 발생하지만, 메서드를 호출할 때 사용하는 매개 변수에도 발생할 수 있다.
- 보통 메서드를 호출 할 때, 선언부에서 지정한 데이터 타입과 일치한 매개값을 전달하여 호출하지만
- 매개변수에 다형성을 적용하면 자식 객체를 전달할 수 있다.
- 객체 전달 시 타입을 클래스 타입을 적어주면 된다.
- 이때 Person의 자식클래스는 전부 전달된다.
예제 - 물건의 종류와 가격을 확인하여, 구매하는 소스코드
< Product.java >
public class Product {
public int price;
public String name;
public Product(int price, String name) {
this.price = price;
this.name = name;
}
}
< Radio.java>
public class Radio extends Product {
//Radio의 생성자는 기본생성자로 만들고, super를 통해서 가격 500원, 이름은 radio로 저장
public Radio() {
super(500, "radio");
}
}
<Computer.java>
public class Computer extends Product {
//가격 600원 이름은 com
public Computer() {
super(600, "com");
}
}
<Tv.java>
public class Tv extends Product {
//가격 400원 이름은 tv
public Tv() {
super(400, "tv");
}
}
<MyCart.java>
import java.util.Arrays;
public class MyCart {
//1. 모든 변수와 메서드에 접근제한자를 선언하세요.
private int money;
private Product[] cart = new Product[1]; //상품을 저장할 배열
private int i = 0;
Radio r = new Radio();
Tv t = new Tv();
Computer c = new Computer();;
// 2. MyCart의 생성자는 money만 받아서 초기화
MyCart(int money){
this.money = money;
}
// 3. buy(모든 상품을 받도록 선언)
public void buy(Product p) {
if(money < p.price) {
System.out.println("금액 부족");
}
money -= p.price;
add(p);
}
// 4. add(모든 상품을 받도록 선언)
public void add(Product p) {
if(i >= cart.length) {
Product[] cart2 = new Product[cart.length * 2];
for(int i=0; i<cart.length; i++) {
cart2[i] = cart[i];
}
cart = cart2;
cart[i] = p;
i++;
}else {
cart[i] = p;
i++;
}
}
// 5.info()
public void info() {
String str = "";
int sum = 0;
for(int j=0; j<i; j++) {
str += cart[j].name;
sum += cart[j].price;
}
System.out.println("장바구니 : " + str);
System.out.println("금액 총합 : " + sum);
System.out.println("잔액 : " + money);
}
}
<Main.java>
public class MainClass {
public static void main(String[] args) {
MyCart mc = new MyCart(5000);
Product r = new Radio();
Product t = new Tv();
Product c = new Computer();
mc.buy(r);
mc.buy(t);
mc.buy(c);
mc.info();
}
}
결과
728x90
'Programming > Java' 카테고리의 다른 글
[JAVA] SingleTon Design Pattern (0) | 2023.11.30 |
---|---|
[JAVA] 정적 제한자 Static (0) | 2023.11.30 |
[JAVA] 접근 제한자 (0) | 2023.11.13 |
[JAVA] 패키지와 상속 (0) | 2023.11.10 |
[JAVA] 객체와 클래스 (0) | 2023.11.08 |