본문 바로가기
Language/JAVA

JAVA 8일차 - 다형성

by 코젼 2022. 6. 29.
728x90
반응형

💡 다형성

Tv t = new captionTv(); // 실행 O

CaptionTv t2 = (CaptionTv)new Tv(); // 객체에서 강제 형변환 --> 에러!!!

 

📃 다형성 예제 (1)

💾 소스파일

buyer.zip
0.00MB

📂buyer 패키지

 

📝 buyerMain 클래스

package buyer;

import java.util.Scanner;

//조상타입의 참조변수로 여러 타입의 자손객체를 매개변수로 전달
public class BuyerMain {

	public static void main(String[] args) {

		Buyer buyer = new Buyer();
		buyer.productBuy();

	}

}

📝 buyer 클래스

⚡ 알게된 점?

 다형성을 사용하여 배열 인스턴스를 만들 수 있다.

Product[] arr = new Product[10];

 인스턴스를 생성하여 배열에 저장할 수 있다.

arr[index] = new Video();

arr[index] = new Computer();

arr[index] = new Audio();

 참조 변수를 메소드의 매개변수로 사용할 수 있다.

void buy(Product p)

package buyer;

import java.util.Scanner;

class Buyer {

	int money = 1000;

	void buy(Product p) {
		if (money < 0) {
			return;
		}

		money = money - p.price;
		System.out.println("현재 잔액은 " + money);
	}
	
	void productBuy() {
		
		Product p1 = new Video();
		Product p2 = new Computer();
		Product p3 = new Audio();
		
		// 길이가 10인 배열을 만든다
		// 사용자로부터 숫자 1이 입력되면 비디오, 2는 컴퓨터, 3는 오디오 구입, 4는 종료
		// 사용자가 선택한 제품의 인스턴스를 만들어서 배열에 저장하시오.
		int index = 0;
		int num = 0;
		
		Buyer buyer = new Buyer();
		
		//* 다형성 사용!!
		Product[] arr = new Product[10];

		System.out.println("사용할 기능의 숫자를 입력하세요.\n\n1. 비디오 구입\n2.컴퓨터 구입\n3. 오디오 구입\n4. 종료");
		Scanner s = new Scanner(System.in);
		num = s.nextInt();
		
		if (num < arr.length) {
			switch (num) {
			case 1:
				//* 인스턴스를 만들어서 배열에 저장한다.
				arr[index] = new Video();
				buy(p1);
				productBuy();
				break;
			case 2:
				arr[index] = new Computer();
				buy(p2);
				productBuy();
				break;
			case 3:
				arr[index] = new Audio();
				buy(p3);
				productBuy();
				break;
			case 4:
				System.out.println("남은 잔액 : " + money );
				System.out.println("종료합니다.");
				break;
			default:
				System.out.println("잘못 입력하셨습니다.");
			}
			index++;
		}
	}

}

//클래스명 Product
//멤버변수 : int price; //제품가격
//생성자 : 매개변수가 하나인 생성자, 제품가격을 전달받아 초기화
class Product {
	int price; // 제품의 가격
	
	// 기본 생성자
	Product() {
		
	}

	Product(int price) {
		this.price = price;
	}
	
	
}

//클래스명 : Tv
//생성자 : 기본생성자, 조상클래스의 생성자를 활용해 가격을 100원으로 초기화
class Video extends Product {
	Video() {
		super(100);
	}

	public String toString() {
		return "Video";
	}
}

class Computer extends Product {
	Computer() {
		super(200);
	}

	public String toString() {
		return "Computer";
	}
}

class Audio extends Product {
	Audio() {
		super(50);
	}

	public String toString() {
		return "Audio";
	}
}

💡 ArrayList 클래스

◾ ArrayList : 일반적으로 사용하는 배열과 같은 순차리스트이다.

밑의 코드에서 객체의 제한을 받지 않고 접근할 수 있는 이유는 다형성 때문이다.

📃 다형성, ArrayList 예제 (2)

💾 소스파일

 

📝 TestPloy 클래스

🚨 [📂buyer 패키지] 에 클래스를 추가해야 한다.

package buyer;

import java.util.ArrayList; // 다양한 기능(add, remove, size, isempty...)을 가진 인스턴스

public class TestPloy {
	public static void main(String[] args) {
		ArrayList al = new ArrayList();
		
		// ArrayList에 add 메소드로 값을 추가할 수 있다.
		al.add("사과");
		al.add("바나나");
		al.add("복숭아");
		al.add("배");
		System.out.println(al.size());
		// ArrayList에서 toString을 오버라이딩 했기 때문에 모두 다 출력이 된다.
		System.out.println(al);
		
		System.out.println("\n두번째 데이터 삭제");
		// remove 메소드로 값을 추가할 수 있다.
		al.remove(1); // 바나나 삭제
		
		System.out.println(al.size());
		System.out.println(al); 
	}
}

📝 TestPloy2 클래스

🚨 [📂buyer 패키지] 에 클래스를 추가해야 한다.

package buyer;

import java.util.ArrayList; // 다양한 기능(add, remove, size, isempty...)을 가진 인스턴스

public class TestPloy2 {
	public static void main(String[] args) {
		ArrayList<Product> al = new ArrayList();
		
		// ArrayList를 이용하여 객체를 저장한다.
		al.add(new Video());
		al.add(new Audio());
		al.add(new Computer());
		al.add(new Video());
		
		System.out.println(al);
		System.out.println("저장한 제품의 갯수는 : " + al.size());
		
		System.out.println("\n두번째 제품을 삭제");
		// remove 메소드로 값을 추가할 수 있다.
		al.remove(1); // 바나나 삭제
		
		System.out.println(al);
		
		return;
	}
}

📃 다형성, ArrayList 예제 (3)

💾 소스파일

 

🚩 다형성 예제 (1)의 [📝 buyer 클래스]를 ArrayList를 사용하여 수정해보자!

package buyer;

import java.util.ArrayList;
import java.util.Scanner;

class Buyer {
	final int MAX_NUM = 10;

	int money = 1000;

	void buy(Product p) {
		if (money < 0) {
			return;
		}

		money = money - p.price;
		System.out.println("현재 잔액은 " + money);
	}
	
	void productBuy() {
		
		Product p1 = new Video();
		Product p2 = new Computer();
		Product p3 = new Audio();
		
		// 길이가 10인 배열을 만든다
		// 사용자로부터 숫자 1이 입력되면 비디오, 2는 컴퓨터, 3는 오디오 구입, 4는 종료
		// 사용자가 선택한 제품의 인스턴스를 만들어서 배열에 저장하시오.
		int index = 0;
		int num = 0;

		
		Buyer buyer = new Buyer();
		
		/******** 수정 ********/
		
		// ArrayList 사용!!!
		ArrayList<Product> arr = new ArrayList();

		System.out.println("사용할 기능의 숫자를 입력하세요.\n\n1. 비디오 구입\n2.컴퓨터 구입\n3. 오디오 구입\n4. 종료");
		Scanner s = new Scanner(System.in);
		num = s.nextInt();
		
		if (num < MAX_NUM) {
			switch (num) {
			case 1:
				// ArrayList의 add 메소드 사용
				arr.add(new Video());
				buy(p1);
				productBuy();
				break;
			case 2:
				arr.add(new Computer());
				buy(p2);
				productBuy();
				break;
			case 3:
				arr.add(new Audio());
				buy(p3);
				productBuy();
				break;
			case 4:
				System.out.println("남은 잔액 : " + money );
				System.out.println("종료합니다.");
				break;
			default:
				System.out.println("잘못 입력하셨습니다.");
			}
			index++;
		}
		
		/****************/
	}

}

//클래스명 Product
//멤버변수 : int price; //제품가격
//생성자 : 매개변수가 하나인 생성자, 제품가격을 전달받아 초기화
class Product {
	int price; // 제품의 가격
	
	// 기본 생성자
	Product() {
		
	}

	Product(int price) {
		this.price = price;
	}
	
	
}

//클래스명 : Tv
//생성자 : 기본생성자, 조상클래스의 생성자를 활용해 가격을 100원으로 초기화
class Video extends Product {
	Video() {
		super(100);
	}

	public String toString() {
		return "Video";
	}
}

class Computer extends Product {
	Computer() {
		super(200);
	}

	public String toString() {
		return "Computer";
	}
}

class Audio extends Product {
	Audio() {
		super(50);
	}

	public String toString() {
		return "Audio";
	}
}

 

728x90
반응형

댓글