JAVA 객체 지향 핵심

(JAVA)다형성(Polymorphism) - 17

mynote6676 2025. 4. 22. 16:57

학습 목표

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

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

3. 다형성에 활용

 

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

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

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

 

package com.polymorphism;

public class Animal {

    public void move() {
        System.out.println("동물이 움직입니다.");
    }

    public void eatting() {
        System.out.println("먹이를 먹습니다.");
    }

}// end of class

//상소관계로 설정- 다형성
class Human extends Animal {

    @Override
    public void move() {
        System.out.println("사람이 두 발로 걷습니다.");
    }

    @Override
    public void eatting() {
        System.out.println("밥을 먹습니다.");
    }

    public void readBooks() {
        System.out.println("책을 읽습니다.");
    }
} //end of class

class Tiger extends Animal {

    @Override
    public void move() {
        System.out.println("호랑이가 네 발로 걸어요.");
    }

    public void hunting() {
        System.out.println("호랑이가 사냥을 합니다.");
    }
}

 

package com.polymorphism;

/**
 * 하나의 데이터 타입을 다양한 형태로 바로 보는 것(다형성)
 * 상세히...한 요소 : 메서드(클래스)가 여러 형태를 가질 수 있는 능력을 의미
 * 상속관계....다형성을 살펴보고있다.
 */
public class AnimalTest {

    public static void main(String[] args) {

        Animal animal1 = new Animal();
        animal1.move();;
        animal1.eatting();
        System.out.println("--------------");

        //다형성의 장점 부모 타입으로 자식 클래스를 인스터스화 할 수 있다.
        Animal animal2 = new Tiger();
        animal2.move();
        animal2.eatting();

        //코드를 작성하는 시점 ----> 컴파일 시점
        //프로그램을 실행하는 시점은  ----> 런파일 시점
        System.out.println("-------------------");
        Animal animal3 = new Human();
        animal3.move();
        animal3.eatting();

    }// end of main

}//end of class

 

package com.polymorphism;

public class AnimalTest2 {

    public static void main(String[] args) {
        // 하나의 메서드가 여러 형태를 가질 수 있다.
        //move()--->
        //하나의 변수에 통으로 데이터르 관리하고 싶다면 ...자료구조(배열)
        Animal[] animals = new Animal[3];
        animals[0] = new Animal();
        animals[1] = new Tiger();
        animals[2] = new Human();

        for(int i = 0; i < animals.length; i++){
            animals[i].move();
        }

    }// end of main
}//end of class

 

 

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

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

업캐스팅(Upcasting)

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

 

 

다운캐스팅(Downcasting)

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

public class Fruit {

    String name;
    int price;

    public void showInfo(){
        System.out.println("상품명 : " + name);
        System.out.println("가격 : " + price);
    }
}

 

package com.polymorphism;

public class FruitTest1 {

    public static void main(String[] args) {
        //다양한 형태로 바라볼 수 있다.-다향성
        Fruit fruit1 = new Banana();//업캐스팅
        Fruit fruit2 = new Peach();//업캐스팅
        fruit1.showInfo();
        System.out.println("----------");
        fruit2.showInfo();
        fruit1.showInfo();
        //사전 기반 지식으로 컴파일, 런타임정보
        //위 상황에서 바나나의 원산지를 정보를 출력하시오.
        //업캐스팅된 상태: 컴파일 시점에 부모에 있는 변수나 , 메섣드만 확인 가능
        String resultOrigin = ((Banana) fruit1).origin;// 다운 캐스팅 처리
        System.out.println("바나나 원산지 : " + ((Banana) fruit1).origin);

        //키워드 - 인스턴스오브 연산자
        //instanceof --> 예약어. 참이면 반환 거짓이면 안함
        if (fruit1 instanceof Peach) {
            System.out.println("여기 들어올까요? 1");
        }
        if (fruit1 instanceof Banana) {
            System.out.println("여기 들어올까요? 2");
        }

        //도전문제
        //fruit1 에 saleBanana() 메서드를 호출 하시오.
        ((Banana) fruit1).saleBanana();
        //검증
        fruit1.showInfo();

    }//end of main
}// end of class