결제 처리 인터페이스
📋 문제 설명
PaymentProcessor 인터페이스를 구현하여 신용카드 결제와 카카오페이 결제 기능을 만드세요.
인터페이스의 개념과 다형성을 학습합니다.
🎯 인터페이스 구조
Java
PaymentProcessor (인터페이스)
├── CreditCardPayment (신용카드 구현)
└── KakaoPayPayment (카카오페이 구현)
💻 코드 구조
PaymentProcessor 인터페이스
Java
public interface PaymentProcessor {
// 결제 처리하는 함수
boolean processPayment(double amount);
// 환불하는 함수
void refund(double amount);
// 결제 방법 가져오는 함수
String getPaymentMethod();
}
인터페이스 메서드 (구현 클래스에서 모두 구현해야 함)
processPayment(double amount)- 결제 처리 (성공 시 true 반환)refund(double amount)- 환불 처리getPaymentMethod()- 결제 방법 이름 반환
⚠️ 인터페이스: 모든 메서드가 추상 메서드 (구현 없이 선언만)
CreditCardPayment 클래스 (신용카드 결제)
Java
public class CreditCardPayment implements PaymentProcessor {
private String cardNumber;
private String cardHolderName;
// 디폴트 생성자
public CreditCardPayment() {
}
// 매개변수가 있는 생성자
public CreditCardPayment(String cardNumber, String cardHolderName) {
// cardNumber와 cardHolderName을 초기화하세요.
}
@Override
public boolean processPayment(double amount) {
// 1. "[cardHolderName]의 카드 [cardNumber]로 [amount]원 결제 시도" 메시지 출력
// 2. true를 리턴하시오.
}
@Override
public void refund(double amount) {
// "[cardHolderName]의 카드 [cardNumber]로 [amount]원 환불 처리" 메시지 출력
}
@Override
public String getPaymentMethod() {
// "Credit Card" 문자열 반환
}
}
필드
private String cardNumber- 카드 번호private String cardHolderName- 카드 소유자 이름
구현 메서드
- 모든 인터페이스 메서드를
@Override하여 구현
KakaoPayPayment 클래스 (카카오페이 결제)
Java
public class KakaoPayPayment implements PaymentProcessor {
private String phoneNumber;
// 디폴트 생성자
public KakaoPayPayment() {
}
// 매개변수가 있는 생성자
public KakaoPayPayment(String phoneNumber) {
// phoneNumber를 초기화하세요.
}
@Override
public boolean processPayment(double amount) {
// 1. "[phoneNumber]로 카카오페이 [amount]원 결제 시도" 메시지 출력
// 2. true를 리턴하시오.
}
@Override
public void refund(double amount) {
// "[phoneNumber]로 카카오페이 [amount]원 환불 처리" 메시지 출력
}
@Override
public String getPaymentMethod() {
// "KakaoPay" 문자열 반환
}
}
필드
private String phoneNumber- 전화번호
구현 메서드
- 모든 인터페이스 메서드를
@Override하여 구현
📝 Main 클래스 테스트
Java
public class Main {
public static void main(String[] args) {
// CreditCardPayment 객체 생성
CreditCardPayment cardPayment = new CreditCardPayment(
"1234-5678-9012-3456",
"홍길동"
);
// KakaoPayPayment 객체 생성
KakaoPayPayment kakaoPayment = new KakaoPayPayment("010-1234-5678");
// PaymentProcessor 배열로 다형성 테스트
PaymentProcessor[] payments = {cardPayment, kakaoPayment};
// 각 결제 방식에 대해 반복
for (PaymentProcessor payment : payments) {
System.out.println("=== " + payment.getPaymentMethod() + " ===");
// 결제 처리
boolean success = payment.processPayment(50000);
System.out.println("결제 성공: " + success);
// 환불 처리
payment.refund(30000);
System.out.println(); // 빈 줄
}
}
}
예상 출력:
Java
=== Credit Card ===
홍길동의 카드 1234-5678-9012-3456로 50000원 결제 시도
결제 성공: true
홍길동의 카드 1234-5678-9012-3456로 30000원 환불 처리
=== KakaoPay ===
010-1234-5678로 카카오페이 50000원 결제 시도
결제 성공: true
010-1234-5678로 카카오페이 30000원 환불 처리
💡 학습 포인트
1. 인터페이스 (Interface)
interface키워드로 선언- 모든 메서드가 추상 메서드 (구현 없음)
implements키워드로 구현- 다중 구현 가능 (한 클래스가 여러 인터페이스 구현 가능)
2. 강제성
- 인터페이스를 구현하면 모든 메서드를 반드시 구현해야 함
- 하나라도 빠뜨리면 컴파일 에러 발생
3. 다형성 (Polymorphism)
PaymentProcessor타입으로 모든 구현체를 다룰 수 있음- 배열이나 리스트에 담아 일괄 처리 가능
- 실제 결제 시스템에서 많이 사용되는 패턴
4. 추상 클래스 vs 인터페이스
| 구분 | 추상 클래스 | 인터페이스 |
|---|---|---|
| 상속 | 단일 상속만 가능 | 다중 구현 가능 |
| 메서드 | 일반 메서드 + 추상 메서드 | 모든 메서드가 추상 |
| 필드 | 인스턴스 변수 가능 | 상수만 가능 |
| 용도 | "is-a" 관계 | "can-do" 관계 |