-
학습목표
다형성 : 다양한 형태로 데이터 타입을 바라 볼 수 있다.
업캐스팅 상태 : 부모 타입으로 자식 클래스를 생성해서 담을 수 있다.
다운 캐스팅 : 강제 형 변환→ 자식 클래스 명시 하는 것
보통 반복문과 함께 쓰이는 instaceof 연산자를 이해 하자다형성이란?
하나의 코드가 여러 자료형으로 구현되어 실행되는것
같은 코드에서 여러 다른 실행 결과가 나옴
정보은닉, 상속과 더불어 객체 지향 프로그래밍의 가장 큰특징 중 하나
다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있다.
다형성을 사용하더라도 실제 동작하는 기능은 초기화된 객체에 동작이다.
아래 코드를 보며 이해하자
package ch11; public class Animal { public void move() { System.out.println("동물이 움직입니다"); } public void eating() { System.out.println("먹이를 먹습니다."); } } class Human extends Animal{ @Override public void move() { System.out.println("사람이 두발로 걷습니다."); } @Override public void eating() { System.out.println("밥을 먹습니다."); } public void readBooks() { System.out.println("책을 읽습니다."); } } class Tiger extends Animal{ @Override public void move() { System.out.println("호랑이가 네발로 걸어요"); } public void hunting() { System.out.println("호랑이가 사냥을 합니다."); } }
package ch11; public class AnimalMainTest { public static void main(String[] args) { // Human human = new Human(); //다형성을 적용하게 된다면 부모 타입으로 데이터 타입을 선언할 수 있고 //실제 메모리에 올라가는 객체를 다형이 적용되는 클래스를 인스턴스화 할 수 있다. Animal animalH = new Human(); Animal animalT = new Tiger(); //다형성에 효용 // 배열 --> 연관된 데이터 타입으로 모아서 관리할 수 있다. Animal[] arrayanimals = new Animal[10]; arrayanimals[0] = animalT; arrayanimals[1] = animalH; for(int i = 0; i < arrayanimals.length; i++) { if(arrayanimals[i] != null) { arrayanimals[i].move(); arrayanimals[i].eating(); } } } //end of main }
출력값 호랑이가 네발로 걸어요 먹이를 먹습니다. 사람이 두발로 걷습니다. 밥을 먹습니다.
코드를 보면 부모(Animal)에게 자식들(Human,Tiger)가 부모 메서드를 각자 상속받고 재정의하였다.
출력값을 보면 move 메서드의 하나의 코드가 재정의 되어서 호랑이가 네발로 걷는다는지 사람이 두발로 걷는다고 여러다른 실행 출력값을 볼 수 있다. 이처럼 하나의 코드가 여러 자료형으로 구현되어 실행되는것을 다형성이라고 한다. 다형성을 사용하면 다양한 형태로 바라볼 수있다.이번에는 업캐스팅과 다운캐스팅에 대해 알아보자
package ch11; 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); } }
package ch11; public class Banana extends Fruit{ String origin; public Banana() { super("델몬트 바나나", 5000); this.origin = "필리핀"; } }
package ch11; public class Peach extends Fruit{ public Peach() { super("복숭아",8000); } }
package ch11; import java.util.Iterator; public class fruitMainTest { public static void main(String[] args) { // 다양한 형태로 클래스(타입)를 바라 볼 수 있다 --> 다형성 Fruit fruit1 = new Banana(); // 업 캐스팅 //컴파일 시점에는 컴파일러가 앞에 선언된 데이터 타입만 확인한다. Peach fruit2 = new Peach(); // 0 , 1 Fruit[] fruits = new Fruit[2]; fruits[0] = fruit1; fruits[1] = fruit2; // 다운 캐스팅 개념을 알자 !! String bananaOrigin = ((Banana)fruit1).origin; //강제 형 변환 System.out.println("다운 캐스팅 된 값 확인 : "+bananaOrigin); //반복문 // instanceof for(int i = 0; i <fruits.length; i++ ) { fruits[i].showInfo(); if(fruits[i] instanceof Banana) { //바나나 타입 맞다면 여기 코드 안으로 들어 온다. //다운 캐스팅 가능 String orgin = ((Banana)fruits[i]).origin; System.out.println("바나나 원산지" + bananaOrigin); } // 바나나 이면 원산지를 출력 하시오. if (fruits[i] instanceof Banana) { String origin = ((Banana)fruits[i]).origin; System.out.println("바나나 원산지 : " +origin); } System.out.println("================"); // 주소값 == 주소값 if (fruits[i] == fruit1) { String bananaOrigin2 = ((Banana) fruits[i]).origin; System.out.println(bananaOrigin2); } } } }
출력값 다운 캐스팅 된 값 확인 : 필리핀 상품명 : 델몬트 바나나 가격 : 5000 바나나 원산지필리핀 바나나 원산지 : 필리핀 ================ 필리핀 상품명 : 복숭아 가격 : 8000 ================
업캐스팅이란 자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는것을 뜻한다.
위의 코드에서 자식(Banana)를 부모(Fruit)에게 할당하는 것을 볼수있다. ( Fruit fruit1 = newBanana(); )
다운캐스팅은 업캐스팅이랑 반대개념인데 다시 원상태로 돌리는것을 말한다.
위의 코드에서 다운캐스팅 부분이 ((Banana) fruits[i]).origin; 이다.
instanceof 연산자
객체 타입을 확인하는 연산자이다.
형변환 가능 여부를 확인함져 true/false로 결과를 반환한다.
(주로 상속 관계에서 부모객체인지 자식 객체인지 확인하는데 사용한다)