본문 바로가기
스파르타 내일배움캠프/TIL(Today I learned)

25.03.07 TIL - 다형성

by pandastic 2025. 3. 7.
반응형

 

 

목차

     

     

    1. Chapter 2 - 10 : 객체지향 PART 4 - 다형성

    📖 수업 목표

    ● 다형성이 무엇인지 학습합니다.
    ● 형변환이 무엇인지 학습합니다.

     

     

    1. 다형성(Polymorphism)

        - 하나의 타입으로 여러 객체를 다룰 수 있는 객체지향의 특징.

        - 인터페이스 상속, 클래스 상속을 활용해서 추상계층 표현.

        - 추상 계층이라는 특징을 활용하여 다형성 구현 가능.

     

     

    * 인터페이스를 활용한 다형성

    public class Main {
        public static void main(String[] args) {
            // 다형성 활용
            Animal animal = new Cat();
            animal.exist(); // ✅
            animal.makeSound(); // ✅
        }
    }

     

     

    2. 형변환(Casting)

       - 부모타입으로 자식타입을 다룰 수 있는 이유는 자동으로 형변환(Casting)이 발생했기 때문.

       - 자식타입 → 부모타입 : 업캐스팅(Up Casting)

         → 작은 것을 큰 것으로 옮기는 것.

       - 부모타입 → 자식타입 : 다운캐스팅(Down Casting)

         → 큰 것을 작은 것으로 옮기는 것.

     

     

    1) 업캐스팅(UpCasting)

      - 자식 → 부모

      - 부모 타입으로 자식 타입을 다룰 수 있음.

      - 업캐스팅으로 인해 다형성을 활용할 수 있는 것이라고 생각하면 됨.

    package chapter2.polymorphism;
    public class Main {
        public static void main(String[] args) {
            //다형성 활용
            Animal animal1 = new Cat();
            Animal animal2 = new Dog();
            animal1.exist();
            animal2.makeSound();
            animal2.exist();
            animal2.makeSound();
        }
    }

     

    ❗업캐스팅 주의사항

         - 부모의 타입으로 데이터를 다룰 수 있지만 자식 클래스의 고유 기능을 활용할 수 없음.

         - 자식 클래스의 고유 기능을 사용하려면 다운캐스팅 필요.

     

     

    2) 다운 캐스팅

        - 부모 → 자식

        - 자식 클래스의 고유 메서드 사용 가능.

    public class Main {
        public static void main(String[] args) {
        // 다형성 활용
        Animal animal = new Cat();
        animal.exist();
        animal.makeSound();        
        Cat cat = (Cat) animal; // ✅ 다운캐스팅(부모Animal -> 자식Cat)
        cat.scratch(); // ✅ 자식 클래스의 기능 활용 가능
      }
    }

     

     

    ❗다운캐스팅 주의사항

        - 잘못된 다운캐스팅은 컴파일 단계에서 감지할 수 없음.

        - 컴파일러는 다운캐스팅이 문법적으로 올바른지 여부만 검사함.

          → 런타임 시에 실제 어떤 객체가 변수에 할당되는지 검사해주지 않음.

        - 컴파일 시점에는 오류 없이 통과되지만 런타임 시점에 ClassCastException 이 발생할 가능성이 있음.

     

     

    ⚠️ 그래서 다운 캐스팅 사용 시 항상  instanceof를 활용해야함!!!

          - instanceof는 객체가 특정 클래스나 인터페이스의 인스턴스인지 확인해주는 역할을 함.

          - 주로 다운캐스팅 하기 전에 타입을 검사해서 ClassCastException 예방에 활용됨.

     

     

    다형성의 장점

      - 한 가지 타입으로 유연한 프로그래밍 처리 가능.

     

     

    [실습과제]

    더보기

    💬 Q1. 클래스를 활용해서 위 내용의 3단계 계층 구조를 설계해보세요.

    💡요구사항

    • 다형성을 직접 활용해보세요.
    • 업캐스팅과 다운캐스팅을 직접 구현해보세요.
    • 다운캐스팅 시 instanceof 를 사용해보세요.

     

    정답)

     

    LifeForm.java

    abstract class LifeForm {
        public void exist() {
            System.out.println("존재합니다.");
        }
    }

     

    Animal.java

    abstract class Animal extends LifeForm {
    
        @Override
        public void exist() {
            System.out.println("동물입니다.");
        }
    
        public void makeSound() {
            System.out.println("소리를 냅니다.");
        }
    }

     

    Dog.java

    public class Dog extends Animal {
    
        @Override
        public void makeSound() {
            System.out.println("멍멍");
        }
    
        public void wag() {
            System.out.println("흔들흔들");
        }
    }

     

    Cat.java

    public class Cat extends Animal {
    
        @Override
        public void makeSound() {
            System.out.println("야옹");
        }
    
        public void scratch() {
            System.out.println("스크래치!");
        }
    }

     

    Main.java

    public class Main {
        public static void main(String[] args) {
            Animal animal = new Cat();
            animal.exist();
            animal.makeSound();
    
            // 사용불가 - 다운캐스팅 필요
    	// animal.scratch();
    
            // 다운캐스팅
            Cat cat = (Cat) animal;
            cat.scratch();
    
            // 다운캐스팅 주의사항
            Animal animal2 = new Dog();
    
            if (animal2 instanceof Cat) {
                Cat cat2 = (Cat) animal2;
                cat2.scratch();
            } else {
                System.out.println("고양이 객체가 아닙니다!");
            }
    //        cat2.scratch(); 에러발생!! ClassCastException
        }
    }

     

    반응형