[JAVA] 다형성

다형성

● 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
● 같은 코드에서 여러 다른 실행 결과가 나옴
● 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나임
● 다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있음

 

학습목표

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