AiPE

객체지향에서의 다형성(Polymorphism) - 메소드 다형성과 객체 다형성 본문

[XiBBaL] Study/Java

객체지향에서의 다형성(Polymorphism) - 메소드 다형성과 객체 다형성

Oshimaker XiBBaL 2024. 4. 3. 17:11
반응형

다형성(Polymorphism)은 객체지향 프로그래밍의 핵심 개념 중 하나이다.

 

다형성은 한 가지 인터페이스나 부모 클래스를 여러 가지 형태로 구현하거나 확장할 수 있는 능력을 의미한다.

즉, 쉽게 말하면 "하나를 만들면 그걸 얼마나 여러 군데에 살짝씩 바꾸어 써먹을 수 있냐"는 의미이다.

말 그대로 "많은 태를 가질 수 있는 속"이다.

 

따라서, 다형성이 높으면 코드의 재사용성이 높으며 효율적인 프로그래밍이 가능해진다.

 

다형성은 크게 "메서드 다형성(Method Polymorphism)"과 "객체 다형성(Object Polymorphism)"의 두 가지로 나뉜다.

 

 

 

1. 메서드 다형성(Method Polymorphism)

부모 클래스(혹은 인터페이스)로부터 비롯된 다양한 자식 클래스들을 사용할 수 있는 것을 의미한다.

 

- 오버로딩(Overloading)을 통해 같은 메서드 이름을 가진 여러 메서드가 서로 다른 클래스에서 구현될 수 있다.

- 오버라이딩(Overriding)을 통해 부모 클래스의 메서드를 자식 클래스에서 재정의하여 다양한 형태로 사용이 가능하다.

 

 

아래는 메서드 다형성을 잘 보여주는 예시이다.

예시는 ChatGPT에서 가져왔다.

 

class Animal {
    void makeSound() {
        System.out.println("Some sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Meow");
    }
}

 

동일한 부모 클래스를 오버라이딩을 이용해 자식 클래스에서 사용하고 있다.

 

지금은 부모 클래스에 별 내용이 없지만, 부모 클래스가 수많은 메서드를 포함하고 있다면

자식 클래스에서 이 중 바꾸고자 하는 한 두개의 클래스만 수정해 사용할 수 있다는 장점이 있다.

 

 

 

2. 객체 다형성(Object Polymorphism)

부모 클래스 타입의 변수를 사용하여 여러 종류의 자식 클래스의 인스턴스를 참조할 수 있는 것을 의미한다.

말이 좀 어려운데, 아래 코드를 보면서 설명해야 이해가 쉬울 것이다.

 

예시는 ChatGPT에서 가져왔다.

 

# 코드_1

class Animal {
    void makeSound() {
        System.out.println("Some sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Meow");
    }
}

 

# 코드_2

Animal animal1 = new Dog();
Animal animal2 = new Cat();

animal1.makeSound(); // "Bark" 출력
animal2.makeSound(); // "Meow" 출력

 

코드_2를  살펴보면 Dog와 Cat이라는 클래스를 각각 animal1과 animal2라는 변수 안에 담았음을 알 수 있다.

이 animal1과 animal2라는 변수의 데이터타입은 Animal인데, 이 데이터 타입은 코드_1의 부모 클래스 타입과 동일하다.

 

코드_2의 출력 결과를 보면 makeSound()라는 메서드를 이용해 "Bark"와 "Meow"를 출력하고 있는데,

이 출력 결과는 코드_1의 부모 클래스에서 바로 나온 것이 아닌, 자식 클래스에서 오버라이딩되어 나온 것이다.

 

부모 클래스 타입의 변수를 사용하여 여러 자식 클래스의 인스턴스를 참조할 수 있다는 말이 바로 이 말이다.

 

즉, 객체 다형성은 부모 클래스 타입의 객체를 정의하고, 이 변수의 접근 권한이 부모 클래스에서 멈추지 않고 자식 클래스까지 이어질 수 있는 성질을 뜻한다.

반응형