유니버셜(universal) 다형성
과 임시(Ad Hoc)다형성
으로 분류할 수 있다. 유니버셜 다형성
: 매개변수(Parametric) 다형성 + 포함(Inclusion) 다형성임시 다형성
: 오버로딩(Overloading) 다형성 + 강제(Coercion) 다형성self
참조다.println
이라는 메소드 시그니처를 호출하여 원하는 내용을 출력하는 기능을 수행한다. public class PrintStream {
...
public void println() {
this.newLine();
}
public void println(boolean x) {
synchronized(this) {
this.print(x);
this.newLine();
}
}
public void println(char x) {
synchronized(this) {
this.print(x);
this.newLine();
}
}
public void println(int x) {
synchronized(this) {
this.print(x);
this.newLine();
}
}
...
}
public abstract class Figure {
protected int dot;
protected int area;
public Figure(final int dot, final int area) {
this.dot = dot;
this.area = area;
}
public abstract void display();
// getter
}
public class Triangle extends Figure {
public Triangle(final int dot, final int area) {
super(dot, area);
}
@Override
public void display() {
System.out.printf("넓이가 %d인 삼각형입니다.", area);
}
}
public static void main(String[] args) {
Figure figure = new Triangle(3, 10); // 도형 객체 추가 또는 변경 시 이 부분만 수정
for (int i = 0; i < figure.getDot(); i++) {
figure.display();
}
}
public static void main1(String[] args) {
int dot = SCANNER.nextInt();
if (dot == 3) {
Triangle triangle = new Triangle(3, 10);
for (int i = 0; i < triangle.getDot(); i++) {
triangle.display();
}
} else if(dot == 4) {
Rectangle rectangle = new Rectangle(4, 20);
for (int i = 0; i < rectangle.getDot(); i++) {
rectangle.display();
}
}
....
}
public enum Operator {
PLUS("+", (a, b) -> a + b),
MINUS("-", (a, b) -> a - b),
MULTIPLY("*", (a, b) -> a * b),
DIVIDE("/", (a, b) -> a / b);
private final String sign;
private final BiFunction<Long, Long, Long> bi;
Operator(String sign, BiFunction<Long, Long, Long> bi) {
this.sign = sign;
this.bi = bi;
}
public static long calculate(long a, long b, String sign) {
Operator operator = Arrays.stream(values())
.filter(v -> v.sign.equals(sign))
.findFirst()
.orElseThrow(IllegalArgumentException::new);
return operator.bi.apply(a, b);
}
}
public static void main(String[] args) {
String question = "4*7";
String[] values = question.split("");
long a = Long.parseLong(values[0]);
long b = Long.parseLong(values[2]);
long result = Operator.calculate(a, b, values[1]);
System.out.println(result); //28
}
변화에 유연한 소프트웨어를 만들기 위해서 객체 지향 패러다임을 사용하는 것이라면, 그러한 목적 달성에 중추적인 방법으로 다형성
을 적용할 수 있다.
정리하면 다형성은 하나의 타입에 여러 객체를 대입할 수 있는 성질이고, 이것을 구현하기 위해서는 여러 객체들 중 공통 특성으로 타입을 추상화하고 그것을 상속(인터페이스라면 구현)해야한다. 이 특성들을 유기적으로 잘 활용했을 때, 비로소 객체 지향에 가까운 코드를 작성할 수 있을 것이라 생각한다.