OOP, 객체 지향 프로그래밍에서 다형성이란
하나의 클래스, 혹은 인터페이스의 타입을 구현하는 구현체의 방식을 다양하게 가질 수 있다는 성질이다.
이는 개념으로서도 중요하지만, 실제 예시를 살펴보는게 더 좋을 것 같다.
public class Product {
protected int price;
public Product(int price) {
this.price = price;
}
public void print() {
System.out.println(
String.format("가격은 %s 입니다.", this.price)
);
}
}
---------------------------
public class Tax extends Product {
private int tax;
public Tax(int tax, int price) {
super(price);
this.tax = tax;
}
public void print() {
System.out.println(
String.format("세금 포함 총 가격은 %s 입니다.", this.price + this.tax)
);
}
public void print(int tip) {
System.out.println(
String.format("세금 포함 총 가격은 %s 입니다.", this.price + this.tax + tip)
);
}
}
위와 같이 Product라는 Class를 구성하고,
이를 상속받은 Tax라는 Class에 대해서 위와 같이 설정을 해주었다.
원래 Product에 있던 print라는 method를 자식 Class인 Tax에서 재정의하는 것을 override라고 하고,
상속 여부와는 상관없이, 똑같은 method에 파라미터를 변경해서 사용하는 (기존에는 필요한 파라미터가 없었다가, 이후에 생기는 것도 가능) 것을 overload라고 한다.
Product product = new Product(1000);
product.print(); // 가격은 1000 입니다.
Product tax = new Tax(100, 1000);
tax.print(); // 세금 포함 총 가격은 1100 입니다.
tax.print(10); // 이 메서드는 실행 되지 않음.
그리고 위와 같이 Product라는 Type의 product라는 변수를 만들어서 Product class로 구현을 했고,
Product라는 Type의 tax라는 변수는 Tax class로 구현했다.
이렇게 했더니 Tax에서 파라미터를 넘겨줄 수 있도록 overload로 정의한 마지막 코드는 실행되지 못한다.
당연하다면 당연할 수 있겠지만 Product라는 타입,
다시 말해 Product라는 class에서의 print는 파라미터가 없는 메서드만 있기 때문이다.
다형성(Polymorphism)의 관점에서 생각해 봤을 때,
Type이 되는 interface나 class의 경우, 정의가 되어야 할(또는 정의한) 메서드들이 있다.
이러한 메서드들의 내용을 구현하거나, 혹은 기존의 내용을 덮어씌우는 override 메서드를 사용하기 위해서
class 생성자를 통해 해당 Type의 변수를 구현하게 하는 것이 다형성이라고 볼 수 있다.
즉, Type은 어떤 메서드를 사용하겠다 라는 하나의 제약 조건이 되는 것이다.
이를 염두에 두고 다시 Product class로 돌아가보자.
Product라는 타입에서 print는 파라미터가 없는 메서드만이 존재하기에
파라미터가 있는 메서드 print는 사용할 수 없다.
'정보 > 프로그래밍 언어' 카테고리의 다른 글
Error와 Exception + Java 개념 (2) | 2024.11.05 |
---|---|
JavaScript 엔진 동작 원리와 Hoisting (1) | 2024.09.11 |