다형성이란 무엇이며, 어떻게 구현되나요?
다형성(Polymorphism)은 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나로, 같은 인터페이스를 통해 서로 다른 데이터 타입의 객체를 다룰 수 있게 해주는 특성을 말합니다.
즉, 동일한 메시지(메서드 호출)에 대해 각기 다른 방식으로 동작하도록 하는 능력입니다.
--- 다형성의 정의 “다형성”이라는 말은 ‘여러 형태를 가진다’는 뜻에서 유래했으며, 프로그래밍에서는 여러 클래스가 공통의 인터페이스나 부모 클래스를 기반으로, 같은 이름의 메서드를 다르게 구현하여 사용할 수 있게 하는 특성입니다.
예를 들어, `동물`이라는 부모 클래스에 `울음소리_내기()`라는 메서드가 있을 때, 고양이는 `야옹`, 강아지는 `멍멍`과 같이 각각 다르게 구현할 수 있습니다.
--- 다형성의 종류 및 구현 방법 다형성은 주로 다음 두 가지 형태로 구현됩니다.
1. 컴파일 시 다형성 (정적 다형성, Static Polymorphism) - 오버로딩(Overloading) : 같은 이름의 메서드를 매개변수의 타입이나 개수에 따라 여러 개 정의하는 것 - 예) 같은 클래스 내에서 `add(int a, int b)` 와 `add(double a, double b)` 같이 메서드를 여러 버전으로 선언 2. 실행 시 다형성 (동적 다형성, Dynamic Polymorphism) - 오버라이딩(Overriding) : 부모 클래스가 가진 메서드를 자식 클래스에서 재정의하여 사용하는 것 - 보통 부모 클래스 타입의 참조 변수가 자식 클래스 객체를 참조할 때, 호출되는 메서드는 실제 객체의 구현체가 실행됨 - 주로 상속과 가상 메서드(virtual method), 추상 메서드, 인터페이스 등을 통해 구현 --- 예시 (Java 기준) ```java class Animal { void sound() { System.out.println("동물이 소리를 낸다"); } } class Dog extends Animal { @Override void sound() { System.out.println("멍멍"); } } class Cat extends Animal { @Override void sound() { System.out.println("야옹"); } } public class Test { public static void main(String[] args) { Animal myDog = new Dog(); Animal myCat = new Cat(); myDog.sound(); // "멍멍" myCat.sound(); // "야옹" } } ``` 위 예시는 실행 시 다형성의 대표적인 사례로, 변수 타입은 `Animal`이지만 실제로는 `Dog` 또는 `Cat` 객체를 참조하여 각각 알맞은 메서드가 호출됩니다.
--- 다형성이 주는 장점 - 유지보수의 편리성 : 코드를 수정하지 않고 새로운 기능 확장 가능 - 유연성 향상 : 하나의 인터페이스로 여러 객체를 처리할 수 있어 범용성 증가 - 코드 재사용성 증가 --- 정리 - 다형성이란 하나의 인터페이스로 여러 형태의 객체를 다루는 능력 - 컴파일 시 다형성은 메서드 오버로딩으로, 실행 시 다형성은 상속과 오버라이딩으로 구현 - 객체지향 설계에서 코드 유연성과 재사용성을 크게 높여주는 핵심 기능 이처럼 다형성은 객체지향 프로그래밍의 강력한 개념으로, 코드를 더 깔끔하고 확장 가능하게 만들어 줍니다.