본문 바로가기
Language/Java

다형성(Polymorphism)

by Zayne 2023. 5. 7.

객체 지향 프로그래밍의 특징에는 추상화, 상속, 다형성, 캡슐화가 있다.

그 중 객체 지향 프로그래밍의 꽃이라고 할 수 있는 다형성에 대해 한번 정리하고 가려한다.

다형성이란 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가실 수 있는 성질을 의미한다.

 

설명보다는 코드로 한번 보는게 훨씬 이해가 빨라진다.

 

class Animal {
    public void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("The dog barks");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("The cat meows");
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        myAnimal.makeSound();
        myDog.makeSound();
        myCat.makeSound();
    }
}

 

위 코드를 보면 Animal 부모 클래스가 있고

자식 클래스인 Dog 클래스와 Cat 클래스가 Animal 클래스를 상속받고 있다.

 

김영한님의 강의를 듣다보면 나오는 문장이 '부모는 자식을 담을 수 있다'

이것이 다형성이다.

 

main 메소드 안을 보면 Animal 부모 클래스 자료형이 Dog 객체와 Cat 객체를 담고 있는 것을 볼 수 있다.

그리고 해당 객체들의 메소드를 호출한 결과이다.

 

The animal makes a sound
The dog barks
The cat meows

 

자식 클래스에서는 오버라이딩 된 메소드가 호출된 것을 볼 수 있다.

 

다음은 오버라이딩 되지 않은 자식 클래스만이 가지고 있는 메소드의 호출 예이다.

 

class Animal {
    public void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("The dog barks");
    }

    public void walk() {
        System.out.println("the dog walks");
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        Animal myDog = new Dog();

        ((Dog) myDog).walk();
    }
}

 

다형성으로 Animal 부모 클래스가 Dog 자식 클래스를 담고 있다.

그리고 Dog 클래스의 walk() 메소드를 호출하기 위해서는 위와 같이 명시적 형변환이 필요하다.

'Language > Java' 카테고리의 다른 글

Java access modifiers  (0) 2023.05.24
Super  (0) 2023.05.11
스트림  (0) 2023.03.08
Optional 클래스  (0) 2023.03.07
메소드 참조  (0) 2023.03.06