다형성
● 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
● 같은 코드에서 여러 다른 실행 결과가 나옴
● 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나임
● 다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있음
학습목표
1. 다형성에 대한 개념을 이해하자
2.업 캐스팅이란 무엇일까?
3.다운캐스팅이란 무엇일까?
4.instance of란 무엇일까?
다형성 예제 Animal
클래스
package ch05;
public class Animal {
public void move() {
System.out.println("동물이 움직입니다.");
}
public void eating() {
System.out.println("동물이 먹이를 먹습니다. ");
}
} // end of animal class
class Tiger extends Animal {
@Override
public void move() {
System.out.println("호랑이가 네발로 움직입니다");
}
@Override
public void eating() {
System.out.println("호랑이가 사냥을 합니다");
}
}
class Human {
public void move() {
System.out.println("사람이 두발로 걸어 다닙니다");
}
public void eating() {
System.out.println("밥을 먹습니다.");
}
public void readBooks() {
System.out.println("사람이 책을 읽습니다.");
}
}
객체
package ch05;
public class MainTest1 {
public static void main(String[] args) {
Animal animal1 = new Animal();
Tiger tiger1 = new Tiger();
Human human1 = new Human();
// 다형성을 적용
Animal animal2 = new Tiger();
Animal[] arrayAnimals = new Animal[10];
arrayAnimals[0] = tiger1;
arrayAnimals[1] = animal1;
// arrayAnimals[2] = human1;
// Animal animal3 = new Human();
// 여기까지는 컴파일 시점에서 확인되는 부분을 확인
System.out.println("-----------------------------");
tiger1.move();
tiger1.eating();
} // end of main
}
결과
-----------------------------
호랑이가 네발로 움직입니다
호랑이가 사냥을 합니다
다른 패키지에 있는 클래스 가져와서 객체 만들기
package ch05;
import starcraft.*;
public class MainTest2 {
public static void main(String[] args) {
// Unit 이라는 배열에 저글링, 질럿, 마린을 담아 보세요
// 실행도 시켜 봅시다.
Unit zealot1 = new Unit("질럿1");
Unit zergling1 = new Zergling("저글링1");
Unit Marine1 = new Marine("마린1");
Unit[] arrayUnits = new Unit[10];
arrayUnits[0] = zealot1;
arrayUnits[1] = zergling1;
arrayUnits[2] = Marine1;
for (int i = 0; i< arrayUnits.length; i++) {
if(arrayUnits[i] != null) {
System.out.println(arrayUnits[i].getName());
}
}
}
}
결과
질럿1
저글링1
마린1
다형성 예제 Fruit
Fruit 클래스
package ch05;
public class Fruit {
String name;
int price;
public Fruit(String name, int price) {
this.name = name;
this.price = price;
}
public void showInfo() {
System.out.println("상품명 : " + name);
System.out.println("가격 : " + price);
}
}
Banana 클래스 (fruit 클래스 상속받음)
package ch05;
public class Banana extends Fruit {
String origin;
public Banana(String name, int price) {
super(name, price);
origin = "필리핀";
}
}
Peach 클래스 (fruit 클래스 상속받음)
package ch05;
public class Peach extends Fruit {
public Peach(String name, int price) {
super(name, price);
}
}
fruit 객체 1
package ch05;
public class FruitMainTest1 {
public static void main(String[] args) {
// 다형성
// !용어 - 업캐스팅
Fruit fruit1 = new Banana("델몬트바나나", 2_000);
Fruit fruit2 = new Peach("청도복숭아", 3_000);
fruit1.showInfo();
fruit2.showInfo();
// 바나나 객체에 origin 변수값을 출력 해보자.
// 업캐스팅 된 상태에서는 컴파일 시점만 확인을 한다.
// System.out.println(fruit1.origin); 오류 확인
// ?? 컴파일 시점에 어떻게 origin이라는 변수를 출력할까?
// 1단계 - 다운 캐스팅
Banana banana1 = ((Banana)(fruit1));
System.out.println(banana1.origin);
// 2단계 - 다운 캐스팅
String checkOrigin = ((Banana)(fruit1)).origin;
} // end of main
} // end of class
결과
상품명 : 델몬트바나나
가격 : 2000
상품명 : 청도복숭아
가격 : 3000
필리핀
fruit 객체 2
package ch05;
public class FruitMainTest2 {
public static void main(String[] args) {
Fruit[] fruits = new Fruit[5];
fruits[0] = new Peach("복숭아1", 3_000);
fruits[1] = new Banana("델몬트바나나", 3_000);
fruits[2] = new Peach("복숭아2", 3_000);
// 배열은 보통 반복문과 함께 많이 사용한다.
for (int i = 0; i < fruits.length; i++) {
if (fruits[i] != null) {
fruits[i].showInfo();
// 만약 바나나라면 원산지 정보도 함께 출력하시오
if(fruits[i] instanceof Banana) {
String checkOrigin = ((Banana)(fruits[i])).origin;
System.out.println("원산지 : " + checkOrigin );
}
}
}
} // end of main
} // end of class
결과
상품명 : 복숭아1
가격 : 3000
상품명 : 델몬트바나나
가격 : 3000
원산지 : 필리핀
상품명 : 복숭아2
가격 : 3000
다형성 예제 Animal(2)
Animal 클래스
package ch06;
public class Animal {
public void makeSound() {
System.out.println("동물이 소리를 내고 있습니다.");
}
}
Bird 클래스
package ch06;
public class Bird extends Animal{
@Override
public void makeSound() {
System.out.println("새가 지저귀고 있습니다.");
}
public void fly() {
System.out.println("새가 날아갑니다.");
}
}
객체
package ch06;
public class CastingExample {
public static void main(String[] args) {
// 다형성, 업캐스팅(Upcasting)
// 업캐스팅은 하위 클래스의 객체를 상위 클래스 타입으로
// 변환하는 것을 말합니다. 이 경우에는 데이터 손실이 없습니다.
// 업캐스팅 자동적으로 이루어지므로 별도의 형변환 연산자가
// 필요 없습니다.
Animal animal = new Bird();
//animal.fly();
// 다운 캐스팅이란
// 다운 캐스팅이란 업캐스팅된 객체를 다시 원래의 하위
// 클래스 타입으로 변환하는 것을 말합니다. 다운캐스팅은
// 수동적으로 형변환 연산자를 사용하여 이루어집니다.
// 업캐스팅된 객체를 하위 클래스의 메서드나 속성을 사용하기 위해
// 필요합니다.
Bird bird = (Bird)animal;
bird.fly();
Animal[] animals = new Animal[3];
animals[0] = new Animal();
animals[1] = new Bird();
animals[2] = new Animal();
System.out.println("====================");
// 0 -- Animal
// 1 -- Bird -> if --> true
// 2 -- Animal --> if -- false
for (Animal a : animals) {
a.makeSound();
// a.fly(); 데이터 타입을 확인하고 싶다면 instance of 연산자
if(a instanceof Bird) {
Bird targetbird = (Bird)animal;
targetbird.fly();
}
System.out.println("---------------------");
}
} // end of main
} // end of class
결과
새가 날아갑니다.
====================
동물이 소리를 내고 있습니다.
---------------------
새가 지저귀고 있습니다.
새가 날아갑니다.
---------------------
동물이 소리를 내고 있습니다.
---------------------
인형뽑기 예제
인형뽑기 클래스
package ch05;
public class clawMachineGame {
String name;
public clawMachineGame(String name) {
this.name = name;
}
public void showInfo() {
System.out.println("상품명 : " + name);
}
}
아이폰 클래스
package ch05;
public class Iphone extends clawMachineGame {
int price;
public Iphone(String name) {
super(name);
price = 137;
}
}
인형 클래스
package ch05;
public class Doll extends clawMachineGame {
public Doll(String name) {
super(name);
}
}
양주 클래스
package ch05;
public class Liquor extends clawMachineGame {
public Liquor(String name) {
super(name);
}
}
인형뽑기 객체
package ch05;
import java.util.Iterator;
import java.util.Scanner;
public class gameMainTest1 {
public static void main(String[] args) {
int a=1;
double b=1.0;
clawMachineGame[] games = new clawMachineGame[10];
games[0] = new Iphone("아이폰x");
games[1] = new Doll("쿼카인형");
games[2] = new Liquor("앱솔루트");
System.out.println("번호를 입력하세요 : ");
Scanner sc = new Scanner(System.in);
int c = sc.nextInt();
if (games[c] != null) {
games[c].showInfo();
if(games[c] instanceof Iphone) {
int checkOrigin = ((Iphone)(games[c])).price;
System.out.println("가격은 : " + checkOrigin);
}
}
// for (int i = 0; i < games.length; i++) {
// if (games[i] != null) {
// games[i].showInfo();
// if(games[i] instanceof iphone) {
// int checkOrigin = ((iphone)(games[i])).price;
// System.out.println("가격은 : " + checkOrigin);
// }
// }
// }
} // end of main
} // end of class
결과
0을 입력한 경우
번호를 입력하세요 :
0
상품명 : 아이폰x
가격은 : 137
1을 입력한 경우
번호를 입력하세요 :
1
상품명 : 쿼카인형
'JAVA' 카테고리의 다른 글
[JAVA] 인터페이스 (0) | 2023.08.10 |
---|---|
[JAVA] 추상 클래스 (0) | 2023.08.10 |
[JAVA] 상속 (0) | 2023.08.07 |
[JAVA] 배열 (0) | 2023.08.04 |
[JAVA] this 사용법과 스타크래프트 게임 만들기 그리고 CRUD (0) | 2023.08.02 |