Java

다형성(Polymorphism)

H_u 2024. 4. 24. 16:36
728x90
반응형
SMALL

💡 학습 목표

  1. 다형성에 대한 개념을 이해하자.
  2. 업캐스팅과 다운캐스팅이란?
  3. 다형성에 활용

 

1. 다형성에 대한 개념을 이해하자.

다형성은 하나의 데이터 타입이 다양한 형태로 바라볼 수 있는 것

다형성(Polymorphism)은 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다. 이는 한 요소(예: 메서드, 클래스)가 여러 형태를 가질 수 있는 능력을 의미합니다. 다형성은 코드의 유연성과 재사용성을 높여주며, 상속, 추상화, 인터페이스와 함께 사용됩니다.

 

 

시나리오 코드 1

package basic.ch20;

 

public class Animal {

 

public void move() {

System.out.println("동물이 움직입니다");

}

 

public void eating() {

System.out.println("먹이를 먹습니다");

}

 

}

 

package basic.ch20;

 

public class Human extends Animal {

 

@Override

public void move() {

System.out.println("사람이 두발로 걷습니다");

}

 

@Override

public void eating() {

System.out.println("밥을 먹습니다");

}

 

public void readBooks() {

System.out.println("책을 읽습니다");

}

 

}

 

package basic.ch20;

 

public class Tiger extends Animal {

 

@Override

public void move() {

System.out.println("호랑이가 네발로 걸어요");

}

 

@Override

public void eating() {

System.out.println("호랑이가 사냥을 합니다");

}

 

}

 

package basic.ch20;

 

public class AnimalTest {

 

public static void main(String[] args) {

 

Animal animal = new Animal();

animal.move();

animal.eating();

System.out.println("---------------");

 

Animal 주소2 = new Tiger();

주소2.move();

주소2.eating();

System.out.println("---------------");

 

Animal 주소3 = new Human();

주소3.move();

주소3.eating();

 

int n1 = (int)10.5;

((Human)주소3 ).readBooks();

System.out.println("-----------------");

 

 

 

} // end of main

 

} // end of class

 

 

 

2. 업캐스팅과 다운캐스팅이란?

업캐스팅(Upcasting)과 다운캐스팅(Downcasting)은 객체 지향 프로그래밍에서 다형성을 활용할 때 사용되는 개념입니다.

업캐스팅(Upcasting)

  • 업캐스팅은 부모 클래스의 참조 변수로 자식 클래스의 객체를 참조하는 것을 말합니다.
  • 부모 클래스의 데이터 타입으로 자식 클래스의 객체를 대입하는 것을 의미합니다.
  • 업캐스팅은 자동으로 이루어집니다.

Animal animal = new Dog(); // 업캐스팅

 

다운캐스팅(Downcasting)

  • 다운캐스팅은 부모 클래스의 참조 변수를 자식 클래스의 객체로 변환하는 것을 말합니다.
  • 다운캐스팅은 명시적으로 형변환을 해야 합니다.
  • 다운캐스팅은 업캐스팅된 객체가 실제로 자식 클래스의 객체일 때만 가능합니다. 그렇지 않으면 ClassCastException(예외) 이 발생할 수 있습니다.

Animal animal = new Dog(); // 업캐스팅

Dog dog = (Dog) animal; // 다운캐스팅

 

 

 

시나리오 코드 2

 

package basic.ch20;

 

public class Fruit {

 

String name;

int price;

 

public void showInfo() {

System.out.println("상품명 : " + name);

System.out.println("가격 : " + price);

}

 

}

 

package basic.ch20;

 

public class Peach extends Fruit {

 

public Peach() {

name = "복숭아";

price = 8000;

}

}

 

package basic.ch20;

 

public class Banana extends Fruit {

 

String origin;

 

public Banana() {

name = "춘식이바나나";

price = 5000;

origin = "한국";

}

 

public void saleBanana() {

System.out.println("바나나 가격을 할인 합니다.");

price -= 1000;

}

 

}

 

package basic.ch20;

 

public class FruitTest {

 

public static void main(String[] args) {

 

// 다형성

// 다양한 형태로 클래스(데이터 타입을) 바라 볼 수 있다.

 

Fruit fruit1 = new Banana(); // 업캐스팅된 상태

Fruit fruit2 = new Peach(); // 업캐스팅된 상태

 

fruit1.showInfo();

fruit2.showInfo();

 

System.out.println("-----------------");

 

// 다형을 사용하면 코드를 유연하게 작성할 수 있다.

 

Banana banana1 = new Banana();

Peach peach1 = new Peach();

Peach peach2 = new Peach();

 

// 배열

Fruit[] fruits = new Fruit[3];

fruits[0] = banana1;

fruits[1] = peach1;

fruits[2] = peach2;

 

System.out.println("---------------");

// fruits[0] --> 바나나

// 바나나에 속성인 origin 을 출력하시오

// 바나나에 기능인 saleBanana() 메서드를 호출하시오

 

// Banana bananaCasting = (Banana)fruits[0];

// bananaCasting.origin;

System.out.println(((Banana)fruits[0]).origin);

((Banana)fruits[0]).saleBanana();

 

System.out.println("---------------");

// 배열은 반복과 함께 많이 사용 된다.

 

// 0 --> 바나나

// 1 --> 복숭아

 

// instanceof 연산자를 알아야 해결 가능

// instanceof -->

// 실행 시점에 객체가 특정 클래스의 인스턴스인지 확인하는 키워드

for(int i = 0; i < fruits.length; i++) {

// 방어적 ...

if(fruits[i] instanceof Banana ) {

((Banana)fruits[i]).saleBanana();

} else {

fruits[i].showInfo();

}

}

 

} // end of main

 

} // end of class

 

 

 

 

정리!!

● 하나의 코드가 여러 자료형으로 구현되어 실행되는 것

● 같은 코드에서 여러 다른 실행 결과가 나옴

● 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나임

● 다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있음

728x90
반응형
SMALL