Java/Java이론
[Java 문법] 다형성 (polymorphism)
chocoz
2019. 4. 5. 17:51
단형성 체계를 가진 언어에서는 함수는 각각 한가지 의미로 식별되는 이름과 결합되어 있어 다른 동작을 구현하기 위해서는 다른 이름을 써야 한다.
예를 들어 어떤 값을 문자열 형식으로 변환하는 단순한 경우를 생각해보자. 다형성 형태 체계를 가지지 못하면 다음과 같이 개별 함수로 되어 있을 것이다.
숫자를 문자열로 바꾸는 경우
string = StringFromNumber(number);
날짜를 문자열로 바꾸는 경우
string = StringFromDate(date);
한편 다형성 체계를 가진 언어에서는, StringValue와 같은 범용 메소드 이름을 정의하여 형태에 따라 각각 적절한 변환 방식을 정의해둠으로써 객체의 종류와 상관없는 추상도가 높은 변환 형식을 구현할 수 있다.
숫자를 문자열로 바꾸는 경우
string = number.StringValue();
날짜를 문자열로 바꾸는 경우
string = date.StringValue();
아래의 코드를 통해 실제 Java 의 toString 메소드에 다형성이 적용되어 있음을 알 수 있다.
import java.util.Date;
public class ToStringEx {
public String toString(){
return "TO STRING";
}
public static void main(String[] args) {
ToStringEx se = new ToStringEx();
System.out.println(se); //Object.toString() -> 재정의 가능
System.out.println(se.toString());
String str = "Hello";
System.out.println(str); //String.toString()
Date date = new Date();
System.out.println(date); //date.toString()
//toString() 이 각 객체마다 다시 오버라이딩 되어있어서 지정한 대로 출력 가능
}
}
추상클래스와 상속을 예시로도 설명할 수 있다.
다형성은 추상클래스, 인터페이스, 일반 클래스로도 구현이 가능하다.
여러개의 클래스들 중 하나를 골라서 사용할 수 있다.(호출은 부모의 메소드를 사용하지만, 실제 실행은 오버라이드 된 자식의 메소드를 사용하게 된다)
아래의 코드 예시를 통해 확인할 수 있다.
abstract class Design {
int a=5, b=7;
double area;
public abstract void calc();
public abstract void disp();
}
class Rect extends Design {
int c = 4;
public void calc(){
area = a*b;
}
public void disp(){
System.out.println(area);
}
}
class Tri extends Design{
int c = 4;
public void calc(){
area = a*b/2;
}
public void disp(){
System.out.println(area);
}
}
class Circle extends Design{
int c = 4;
public void calc(){
area = Math.PI*a*a/4;
}
public void disp(){
System.out.println(area);
}
}
public class PolyEx {
public static void main(String[] args) {
Design de[] = {new Rect(), new Tri(), new Circle()};
for (Design d : de) {
d.calc();
d.disp();
}
// Rect r =new Rect();
// Tri t = new Tri();
// Circle c = new Circle();
// r.calc();
// r.disp();
// t.calc();
// t.disp();
// c.calc();
// c.disp();
}
}