본문 바로가기
Programming/Java

[JAVA] 다형성

by 공부합시다홍아 2023. 11. 14.
 

[JAVA] 접근 제한자

[JAVA] 패키지와 상속 [JAVA] 객체와 클래스 [JAVA] 스택(Stack)과 큐(Queue) [JAVA] 매서드 [JAVA] 2차원 배열 [JAVA] 배열을 이용한 문제풀이 [JAVA] 정렬과 복사 [JAVA] 배열 연습 [JAVA] 소수(Prime Number) 구하기 반

hong-study.tistory.com


다형성 ( 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