Part15 - polymorphism

uglyduck.dev·2020년 9월 27일
0

예제로 알아보기 👀

목록 보기
15/22
post-thumbnail
post-custom-banner

Ex01_polymorphism

package com.mywork.ex;

class Product {
	
	// Method
	public void info() {
		System.out.println("Product");
	}
	
}

class Computer extends Product {
	
	// Method
	@Override
	public void info() {
		System.out.println("Computer");
	}
	
}

class Notebook extends Computer {
	
	// Method
	@Override
	public void info() {
		System.out.println("Notebook");
	}
	
}

public class Ex01_polymorphism {

	public static void main(String[] args) {

		// 여기는 상점이다.
		// 컴퓨터 10대, 노트북 10대
		Computer[] computers = new Computer[10];
		Notebook[] notebooks = new Notebook[10];
		
		for (int i = 0; i < computers.length; i++) {
			computers[i] = new Computer();
		}
		
		for (int i = 0; i < notebooks.length; i++) {
			notebooks[i] = new Notebook();
		}
		
		// 업캐스팅(UpCasting)을 활용하자!
		// 부모(Product) <= 자식(Computer, Notebook)
		Product[] products = new Product[20];
		
		// products[0] = new Product();	// 의미 없고, 존재하면 안 되는 코드!
		products[0] = new Computer();
		products[1] = new Computer();
		products[2] = new Notebook();
		
		// 다형성의 확인
		products[0].info();		// Computer
		products[1].info();		// Computer
		products[2].info();		// Notebook
		
	}

}

Ex02_polymorphism

package com.mywork.ex;

class Shape {
	
	// Method
	public double calcArea() {
		return 0;	// 리턴의 의미는 없음!
	}
	
}

class Rect extends Shape {
	
	// Field
	private int width;
	private int height;
	
	// Constructor
	public Rect(int width, int height) {
		this.width = width;
		this.height = height;
	}
	
	// Method
	@Override
	public double calcArea() {
		return width * height;
	}
	
}

class Circle extends Shape {
	
	// Field
	double radius;
	
	// Constructor
	public Circle(double radius) {
		this.radius = radius;
	}
	
	// Method
	@Override
	public double calcArea() {
		return Math.PI * Math.pow(radius, 2);
	}
	
}

class Triangle extends Shape {
	
	// Field
	private int width;
	private int height;
	
	// Constructor
	public Triangle(int width, int height) {
		this.width = width;
		this.height = height;
	}
	
	// Method
	@Override
	public double calcArea() {
		return (width * height) / 2.0;
	}
	
}

public class Ex02_polymorphism {

	public static void main(String[] args) {
		
		// 도형 관리 (모든 도형의 부모는 Shape 이다.)
		Shape[] arr = new Shape[3];
		
		arr[0] = new Rect(2, 3);		// 사각형, 너비2, 높이3
		arr[1] = new Triangle(2, 3);	// 삼각형, 너비2, 높이3
		arr[2] = new Circle(1);			// 원, 반지름1

		for (int i = 0; i < arr.length; i++) {
			System.out.println("크기 : " + arr[i].calcArea());
		}
		
	}

}

Ex03_polymorphism

package com.mywork.ex;

class Animal {
	
	// Method
	public void move() {
		
	}
	
}

class Dog extends Animal {
	
	// Method
	@Override
	public void move() {
		System.out.println("개가 달린다.");
	}
	
}

class Dolphin extends Animal {
	
	// Method
	@Override
	public void move() {
		System.out.println("돌고래는 헤엄친다.");
	}
	
}

class Eagle extends Animal {
	
	// Method
	@Override
	public void move() {
		System.out.println("독수리는 난다.");
	}
	
	// Eagle 만 가지는 메소드 fly()
	public void fly() {
		
	}
	
}

public class Ex03_polymorphism {

	public static void main(String[] args) {

		Animal[] animals = new Animal[3];
		
		animals[0] = new Dog();
		animals[1] = new Dolphin();
		animals[2] = new Eagle();
		
		for (int i = 0; i < animals.length; i++) {
			animals[i].move();
		}
		
		// 개가 달린다.
		// 돌고래가 헤엄친다.
		// 독수리가 난다.
		
		// animals[2].fly();	// 부모클래스는 fly() 메소드가 없기 때문에
								// 호출할 수 없다.
		
		if (animals[2] instanceof Eagle) {
			Eagle eagle = (Eagle) animals[2];
			eagle.fly();
		}
		
		((Eagle) animals[2]).fly();
		
	}

}






Ex04_polymorphism

package com.mywork.ex;

class Person {
	
	// Method
	public void eat(String food) {
		System.out.println(food + " 먹는다.");
	}
	public void sleep() {
		System.out.println("잔다.");
	}
	
}

class Student extends Person {
	
	// Method
	public void study() {
		System.out.println("공부한다.");
	}
	
}

class Worker extends Person {
	
	// Method
	public void work() {
		System.out.println("일한다.");
	}
	
}

public class Ex04_polymorphism {

	public static void main(String[] args) {

		Person person1 = new Student();       // 업캐스팅!!
		
		person1.eat("밥");
		person1.sleep();
		// person1.study();		person1은 Person 타입이기 때문에!
		
		// 다운캐스팅 : Person -> Student 강제 변환
		if (person1 instanceof Student) {        // person1이 Student 인스턴스(객체)인가?
			Student student = (Student)person1;	 // 다운캐스팅!!
			student.eat("밥");
			student.sleep();
			student.study();
		}
		
		
		Person person2 = new Worker();          // 업캐스팅!!
		
		if (person2 instanceof Worker) {        // 형변환 가능 여부 확인 후	
			Worker worker = (Worker)person2;    // 다운캐스팅!!
			worker.work();
		}
		
		
		Person person3 = new Student();         // 업캐스팅!!
		((Student)person3).study();             // 다운캐스팅!!
		
		
	}

}

Ex05_polymorphism

package com.mywork.ex;

class Car {
	
	// Method
	public void drive() {
		
	}
	
}

class Ev extends Car {
	
	// Method
	public void charging() {
		
	}
	
}

class Hybrid extends Ev {
	
	// Method
	public void addOil() {
		
	}
	
}

public class Ex05_polymorphism {

	public static void main(String[] args) {

		Car[] motors = new Car[2];
		
		motors[0] = new Ev();
		motors[0].drive();
		((Ev)motors[0]).charging();
		
		motors[1] = new Hybrid();
		motors[1].drive();
		((Hybrid)motors[1]).charging();
		((Hybrid)motors[1]).addOil();
		
		
		// 잘못된 다운캐스팅
		((Hybrid)motors[0]).drive();
		((Hybrid)motors[0]).charging();
		((Hybrid)motors[0]).addOil();	// 문제 소지가 있는 부분!
		
		
		// 잘못된 다운캐스팅을 막기 위해 확인 후 캐스팅하자!
		if (motors[0] instanceof Hybrid) {
			((Hybrid)motors[0]).drive();
			((Hybrid)motors[0]).charging();
			((Hybrid)motors[0]).addOil();
		}
		
	}

}
profile
시행착오, 문제해결 그 어디 즈음에.
post-custom-banner

0개의 댓글