
자바(Java)와 객체지향을 공부하면서 가장 알쏭달쏭하고 어렵게 느껴지는 주제, 다형성(Polymorphism)에 대해 정리해 보려고 합니다.
다형성 이란 간단하게 하나의 객체에 여러 가지 타입을 대입할 수 있다는 것을 의미합니다. 설명으로 들었을때는 잘 모르겠지 않나요?
예시를 들어 설명드리겠습니다.
먼저 저는 편의점 알바를 하고 있어 편의점 알바생 입장에서 예시를 들어보겠습니다.
우선 편의점 알바생인 제가 결제 를 받는 상황에 있다고 할때 다형성을 모르면 다음과 같이 코드가 짜지게 됩니다.
class StorePay {
// 삼성페이 결제
public void Samsungcheckout(SamsungPay samsung) {
samsung.pay();
}
// 카카오페이 결제
public void Kakaocheckout(KakaoPay kakao) {
kakao.pay();
}
// 네이버페이가 새로 추가되면?
}
이 코드의 문제점은 새로운 결제 시스템 마다 알바생인 제가 새로운 결제 방법을 계속 배워야 한다는 단점이 있습니다. 왜냐하면 결제를 하려고 하면 카카오페이면 카카오페이 결제 버튼을 클릭해야하고, 삼성페이 결제가 들어오면 삼성페이 결제 버튼을 클릭해야하는 상황이 나오기도 하기 때문입니다.
그리고 만약 네이버 페이가 새로 추가된다면 어떻게 해야할까요 코드는
StorePay 클래스를 열어서 직접
public void Navercheckout(NaverPay Naver) {
Naver.pay();
}
이 코드를 추가 해야하고 알바생인 저는 네이버페이 결제 하는 방법을 새로 알아야한다는 문제가 있습니다.
만약 결제 수단이 100개가 넘어가면 어떨까요? 100개의 버튼을 결제수단에 맞게 클릭 해야하는 경우가 생기지않을까요?
이를 해결 하기 위해서는 다형성을 적용하여야 합니다.
알바생은 결제 버튼만 누르면 알아서 네이버페이, 카카오페이, 애플페이, 토스페이 를 나누어서 결제를 해주어야 한다는겁니다.
그럼 다형성을 적용해서 결제 시스템을 만든다고 하면
interface Payment {
void pay();
}
먼저 모든 결제 수단 객체가 공통적으로 가져야 할 기능을 정의한 Payment 인터페이스를 생성합니다.
class SamsungPay implements Payment {
public void pay() {
System.out.println("삼성페이로 결제합니다.");
}
}
class KakaoPay implements Payment {
public void pay() {
System.out.println("카카오페이로 결제합니다.");
}
}
이제 각 결제 서비스 클래스들은 Payment 인터페이스를 implements 하여, 인터페이스에 정의된 추상 메소드를 강제적으로 구현 해야 합니다.
class StorePay {
public void checkout(Payment payment) {
payment.pay();
}
}
마지막으로 StorePay 클래스에서 이제는 결제 수단별로 일일이 메소드를 만들 필요가 없습니다. 상위 타입인 Payment 인터페이스를 매개변수로 받는 checkout 메소드 하나만 선언하면 됩니다.
이렇게 작성하면, checkout 메소드를 호출할 때 매개변수로 어떤 구체적인 객체(SamsungPay, KakaoPay 등)가 들어오느냐에 따라, 그 객체에 재정의(Override)된 pay() 메소드가 자동으로 실행됩니다.
그래서 알바생인 저는 그냥 결제만 누르면 카카오페이인지, 토스페이인지, 네이버페이인지는 알아서 처리 해주는 결제 시스템이 된것입니다.
대표적인 상황은
새로운 기능을 더할 때 기존 코드를 거의 손대지 않아서 확장하기 쉬움
대체적으로 위의 상황에서 다형성을 구현하기 좋습니다.
다형성을 쓰는 이유는 나중에 코드를 덜 고치기 위해서 라고 생각합니다.
결제수단이 아무리 늘어나도 StorePay 는 단 한줄도 수정할 필요가 없고
결제수단이 추가될땐 기존 코드를 건드리지않고 pay를 오버라이딩 하여 구현한 클래스만 추가 하면 되기때문입니다.
이처럼 기능을 사용하는 코드와 실제 기능을 수행하는 코드를 분리해두면 나중에 내용물이 바껴도 시스템 전체가 고장나지 않는 프로그램을 만들 수 있고 이게 다형성의 이점 이라고 생각합니다.