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
복사