Backend
home
📘

[개념 정리] 다형성

생성 일시
2025/02/25 05:43
태그
Java
게시일
2025/02/25
최종 편집 일시
2025/02/25 06:14

1. 다형성이란 무엇인가?

다형성은 객체지향 프로그래밍의 핵심 개념 중 하나이다.
다형성을 뜻하는 ‘polymorphism’ 이라는 단어는 그리스어로 ‘많은 형태’를 의미한다.
다형성은 상황에 따라 객체가 다르게 동작할 수 있도록 한다.
다형성은 메서드 오버로딩(컴파일 타임 다형성)이나, IS-A 관계(런타임 다형성)의 경우 메서드 오버라이딩을 통해 형성될 수 있다.

2. 정리

다형성은 객체지향 프로그래밍의 핵심 개념 중 하나이다. 다형성은 많은 형태를 의미한다. 객체지향 프로그래밍에서 다형성은 객체가 상황에 따라 다르게 동작할 수 있게 해주거나 어떤 동작이 다른 방법으로 동작할 수 있도록 해주는 역할을 한다. 다형성을 구현하는 방법 중 하나는 메서드 오버로딩이다. 여러 개의 메서드가 동일한 이름을 가지고 있지만 매개변수가 다른 경우 컴파일러가 오버로드된 메서드 가운데 어떤 형식을 호출할 것인지 컴파일 시간에 식별할 수 있으므로 컴파일 타임 다형성이라고도 한다. 이때 오버로드된 메서드의 형태에 따라 객체는 다르게 동작한다. 예를 들어 Triangle(삼각형) 이라는 클래스에는 서로 다른 매개변수를 가진 여러 개의 draw 메서드를 정의할 수 있다.
다형성을 구현하는 또 다른 방법은 메서드 오버라이딩이다. 메서드 오버라이딩은 IS-A 관계가 있을 때 일반적으로 사용하는 방법이며, 런타임 다형성 또는 동적 메서드 디스패치(dynamic method dispatch)라고 한다. 보통 여러 가지 메서드를 포함하는 인터페이스 구현으로 시작하며, 각 클래스는 특화된 동작을 수행하기 위해 인터페이스에 있는 메서드를 오버라이드한다. 이때 다형성이 타입에 대한 혼란 없이 이 클래스들을 부모 인터페이스와 똑같이 사용할 수 있게 한다. 런타임에 자바가 이러한 클래스를 구별할 수 있고 어느 클래스가 사용되는지 알고 있기 때문에 가능한 일이다. 예를 들어 draw 메서드를 가지는 Shape(모양)이라는 인터페이스가 있다고 할 때, Triangle, Rectangle, Circle 클래스가 Shape 인터페이스 구현에 있는 draw 메서드를 오버라이드해서 각 도형에 해당하는 모양을 그릴 수 있다.

3. 코드

메서드 오버로딩을 활용한 컴파일 타임 다형성

Triangle 클래스는 다음과 같이 세 가지의 draw 메서드를 포함한다.
package complietime; // 메서드 오버로딩: 컴파일 타임 다형성 public class Triangle { public void draw() { System.out.println("Draw default triangle ..."); } public void draw(String color) { System.out.println("Draw a triangle of color " + color); } public void draw(int size, String color) { System.out.println("Draw a triangle of color " + "color + and scale it up with the new size of " + size); } }
Java
복사
package complietime; public class Main { public static void main(String[] args) { Triangle triangle = new Triangle(); triangle.draw(); triangle.draw("red"); triangle.draw(10, "blue"); } } == 출력 == Draw default triangle ... Draw a triangle of color red Draw a triangle of color color + and scale it up with the new size of 10
Java
복사

메서드 오버라이딩을 활용한 런타임 다형성

Triangle, Rectangle, Circle 클래스는 Shape 인터페이스를 구현하고 해당하는 모양을 그리도록 draw 메서드를 오버라이드 한다.
package runtime; public interface Shape { void draw(); }
Java
복사
package runtime; public class Triangle implements Shape { @Override public void draw() { System.out.println("Draw a triangle ..."); } }
Java
복사
package runtime; public class Rectangle implements Shape { @Override public void draw() { System.out.println("Draw a rectangle ... "); } }
Java
복사
package runtime; public class Circle implements Shape { @Override public void draw() { System.out.println("Draw a circle ..."); } }
Java
복사
삼각형, 직사각형, 원의 각 클래스에 대한 인스턴스를 생성하고 draw 메서드를 호출한다.
package runtime; public class Main { public static void main(String[] args) { Shape triangle = new Triangle(); Shape rectangle = new Rectangle(); Shape circle = new Circle(); triangle.draw(); rectangle.draw(); circle.draw(); } } == 출력 == Draw a triangle ... Draw a rectangle ... Draw a circle ...
Java
복사