AiPE
객체지향에서의 다형성(Polymorphism) - 메소드 다형성과 객체 다형성 본문
다형성(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의 부모 클래스에서 바로 나온 것이 아닌, 자식 클래스에서 오버라이딩되어 나온 것이다.
부모 클래스 타입의 변수를 사용하여 여러 자식 클래스의 인스턴스를 참조할 수 있다는 말이 바로 이 말이다.
즉, 객체 다형성은 부모 클래스 타입의 객체를 정의하고, 이 변수의 접근 권한이 부모 클래스에서 멈추지 않고 자식 클래스까지 이어질 수 있는 성질을 뜻한다.
'[XiBBaL] Study > Java' 카테고리의 다른 글
업 캐스팅(Up-casting) & 다운캐스팅(Down-casting)의 정의와 활용 예시 (0) | 2024.05.04 |
---|---|
추상 클래스(Abstract Class) 및 추상 메서드(Abstract Method)의 정의와 활용 (1) | 2024.04.03 |
Java에서 "final" 키워드의 역할 (1) | 2024.04.03 |
객체지향에서의 싱글톤 패턴(Singleton Pattern) (1) | 2024.04.03 |
Getter 메서드와 Setter 메서드 (0) | 2024.04.03 |