반응형

다형성(Polymorphism) 이란?

  • 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미
    • 객체들의 타입이 다르면 똑같은 메세지(같은 메소드명)가 전달되더라도 서로 다른 동작을 함
    • ex) cat.speak() => 야옹, dog.speak() => 멍멍
  • 다형성은 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나임

다형성 예제

public class Test {

    public static void main(String[] args) {
        Dog dog = new Dog();
        Animal animal = new Dog();
        // Animal animal = (Animal) new Dog(); 와 동일
        animal.speak();
        animal.speak2();            // 에러 발생

        Dog dog2 = new Animal();    // 에러 발생
    }

    static class Dog extends Animal {
        @Override
        void speak() {
            System.out.println("멍멍");
        }

        void speak2() {
            System.out.println("왈왈");
        }
    }

    static class Animal {
        void speak() {
            System.out.println("동물이 웁니다.");
        }
    }
}
  • 위 코드로 알 수 있는 정보
    1. Animal = 부모클래스, Dog = 자식클래스
    2. Dog 객체는 Dog Type, Animal Type 둘 다 가질 수 있음
    3. Animal animal = new Dog() 실행 가능 원인 : 자식은 부모부터 메모리에 올리기 때문에 가능
      • new Dog() 실행 시, Animal class도 메모리에 같이 올라감
    4. Dog dog = new Animal() 에러 발생 원인 : new Animal() 실행 시, Dog은 메모리에 없음
      • 자식 -> 부모 형변환은 가능하지만, 부모 -> 자식 형변환은 불가능
      • "자식 = 부모", "오버라이딩은 자식이"
    5. speak2() 에러 발생 원인 : animal이 Dog객체이지만 Animal Type이므로 speak2 메소드는 Animal 클래스에 없음

다형성의 활용 옞 (UpCating, DownCasting)

public static void main(String[] args) {
    Animal animal = (Animal) new Dog();    // UpCasting
    Dog dog = (Dog) animal;        // DownCasting
}
  • 위에서 부모 -> 자식 형변환은 불가능하다고 했지만, 이를 가능하게 해주는 것이 DownCasting
  • 단, 미리 자식으로 메모리에 올라가 있는 경우에만 가능함
  • 따라서 Dog dog = (Dog) new Animal(); 은 안되지만 Dog dog = (Dog) animal; 은 가능

instanceof 연산자

  • 변수명 instanceof 클래스타입 => 해당 변수가 해당 클래스타입인지 확인
  • 객체의 실제 타입 확인을 위해 사용, 이 때 클래스타입은 참조형만 가능
public class Test {

    public static void main(String[] args) {

        String str = "hi";
        System.out.println(str instanceof String);  // true 출력
        int x = 10;
        System.out.println(x instanceof int);       // 에러 발생

        Animal animal = (Animal) new Dog();
        Dog dog = (Dog) animal;

        animal.speak();     // 멍멍 출력

        if(animal instanceof Animal) System.out.println("animal은 Animal Type 입니다.");
        else if(animal instanceof Dog) System.out.println("animal은 Dog Type 입니다.");     
        // animal은 Animal Type 입니다. 출력

        dog.speak();        // 멍멍 출력

        if(dog instanceof Animal) System.out.println("dog은 Animal Type 입니다.");
        else if(dog instanceof Dog)  System.out.println("dog은 Dog Type 입니다.");
        // dog은 Animal Type 입니다. 출력
    }

    static class Dog extends Animal {
        @Override
        void speak() {
            System.out.println("멍멍");
        }
    }

    static class Animal {
        void speak() {
            System.out.println("동물이 웁니다.");
        }
    }
}
반응형

↓ 클릭시 이동

복사했습니다!