728x90

오늘은 객체지향의 다형성 개념을 알아보았다.

 

다형성이 무엇일까?

구글에서는

다형성(polymorphism)이란? 다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다. 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있습니다.

라고 정의하고 있다.

 

막상 다형성이라는 개념을 알아보니 잘 이해가 되지 않았다.

 

이 클래스 다이어그램을 보면 

상위 클래스 Animal을 상속 받는 하위 클래스 dog, cat, monkey가 있다.

 

dog 클래스는 Animal의 필드와 메서드를 그대로 갖고 있다.

그럼 과연 dog는 Animal이라고 할 수 있을까?

 

그렇다

이는 일상생활에서 찾아봐도 나오는 답이다.

개는 동물이다. 

하지만 동물이라고 개가 될 수는 없다.

동물이 개만 있는게 아니라 고양이가 될 수도, 원숭이가 될 수도 있기 때문이다.

 

그러면 위 구글이 정의한 다형성과 비교 및 정리 해보자

 

개는 개와 동물이라는 두가지의 타입을 갖을 수 있다. 또한 개를 동물이라고 부를 수도 있다. 

 

 

왜 다형성이 필요할까?

다형성은 "코드의 재사용성"이라는 장점을 가지고 있다.

위의 코드를 다형성 없이 작성한다면 dog, cat, monkey라는 클래스를 작성할 때 중복된 내용똑같이 작성해야 한다.

 

만약 중복된 내용이 엄청 많고, 그와중에 오류가 난다면? 머리 아프다.

하지만 중복된 내용을 하나의 클래스(Animal)로 정리함으로써 코드의 작성 시간간결함이 엄청나게 해소될 것이다.

 

또한 동물이라는 인스턴스를 모두 가져와야하는 상황이라면? 끔찍하다.

dog... cat... monkey... 정의된 동물 클래스만큼의 타입을 싸그리 모아서 가져와야 한다.

이 또한 중복된 내용으로 정리된 하나의 클래스(Animal)로써 정리될 수 있다. 

왜? 개도 동물이고, 고양이도 동물이고, 원숭이도 동물이니까. Animal의 타입만을 가져와도 된다.

 

 

코드로 정리해보자

- Animal class

package polymorphism;

abstract class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    abstract void bark(); // 추상 메서드
}

 

 

 

- Dog class

    package polymorphism;

    public class Dog extends Animal{
        public Dog(String name) {
            super(name);
        }

        @Override
        void bark() {
            System.out.println("왈왈");
        }
    }

- Cat class

package polymorphism;

public class Cat extends Animal{
    public Cat(String name) {
        super(name);
    }

    @Override
    void bark() {
        System.out.println("냐옹");
    }
}

- Monkey class

package polymorphism;

public class Monkey extends Animal{
    public Monkey(String name) {
        super(name);
    }

    @Override
    void bark() {
        System.out.println("우끼끼");
    }
}
728x90

'JAVA' 카테고리의 다른 글

백준 알고리즘 17255  (0) 2024.03.29
JAVA TIL - 04 Java.base 모듈 - java.lang  (0) 2024.03.15
JAVA TIL - 03 JVM  (0) 2024.03.12
JAVA TIL - 02 abstract 추상 메서드/클래스  (0) 2024.03.12

+ Recent posts