Menu
Coddy logo textTech

요약 - 결제 프로세서

Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 46번째.

challenge icon

챌린지

쉬움

이 장에서 배운 모든 다형성 개념을 하나로 모으는 완전한 결제 처리 시스템을 구축해 봅시다. 통합된 인터페이스를 통해 작동하는 다양한 결제 수단을 만들고, 의존성 주입(dependency injection)을 통해 모든 결제 수단을 수용하는 프로세서를 만들며, 다형성 컬렉션을 통해 여러 결제 건을 처리하게 됩니다.

코드는 다음 네 개의 파일로 구성됩니다:

  • payment.go: Process(amount float64) string 메서드를 요구하는 PaymentMethod 인터페이스를 정의합니다. 이것은 모든 결제 유형이 충족해야 하는 계약입니다.
  • methods.go: PaymentMethod 인터페이스를 각각 구현하는 세 가지 결제 유형을 만듭니다:
    • CardNumber (string)와 HolderName (string) 필드를 가진 CreditCardProcess 메서드는 Credit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]를 반환합니다.
    • Email 필드를 가진 PayPalProcess 메서드는 PayPal payment of $[amount] from [Email]를 반환합니다.
    • BankNameAccountNumber 필드를 가진 BankTransferProcess 메서드는 Bank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])를 반환합니다.
  • processor.go: PaymentMethod(주입된 의존성)를 보유하는 PaymentProcessor 구조체를 만듭니다. PaymentMethod를 인자로 받는 생성자 NewPaymentProcessor를 포함하세요. 주입된 결제 메서드에 처리를 위임하는 ExecutePayment(amount float64) string 메서드를 추가합니다. 또한 슬라이스 내의 각 결제 수단을 통해 동일한 금액을 처리하고 모든 결과를 반환하는 ProcessAll(payments []PaymentMethod, amount float64) []string 함수를 만듭니다.
  • main.go: 입력에서 결제 세부 정보를 읽고, 세 가지 결제 유형을 모두 생성하며, 의존성 주입과 다형성 컬렉션을 모두 시연합니다. 먼저 신용카드로 NewPaymentProcessor를 사용하여 결제를 실행합니다. 그런 다음 세 가지 결제 수단을 모두 슬라이스에 수집하고 ProcessAll을 사용하여 두 번째 금액으로 모두 처리합니다. 각 결과를 별도의 줄에 출력합니다.

다음 입력이 제공됩니다:

  • 1행: 신용카드 번호 (예: 4532015112830366)
  • 2행: 카드 소유자 이름
  • 3행: PayPal 이메일
  • 4행: 은행 이름
  • 5행: 계좌 번호 (예: 987654321)
  • 6행: 첫 번째 결제 금액 (단일 프로세서용)
  • 7행: 두 번째 결제 금액 (일괄 처리용)

금액은 소수점 둘째 자리까지 표시합니다. 예를 들어, 4532015112830366, John Smith, john@email.com, Chase, 987654321, 99.99, 50이 주어지면 출력은 다음과 같아야 합니다:

Credit Card 0366 charged $99.99 to John Smith
Credit Card 0366 charged $50.00 to John Smith
PayPal payment of $50.00 from john@email.com
Bank transfer of $50.00 via Chase (***321)

첫 번째 줄은 주입된 프로세서를 통한 단일 결제를 보여줍니다. 나머지 세 줄은 다형성 컬렉션을 통한 일괄 처리를 보여줍니다. 동일한 ProcessAll 함수가 모든 결제 유형을 균일하게 처리하며, 인터페이스가 어떻게 유연하고 확장 가능한 결제 시스템을 가능하게 하는지 보여줍니다.

직접 해보기

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// 입력 읽기
	cardNumber, _ := reader.ReadString('\n')
	cardNumber = strings.TrimSpace(cardNumber)

	holderName, _ := reader.ReadString('\n')
	holderName = strings.TrimSpace(holderName)

	email, _ := reader.ReadString('\n')
	email = strings.TrimSpace(email)

	bankName, _ := reader.ReadString('\n')
	bankName = strings.TrimSpace(bankName)

	accountNumber, _ := reader.ReadString('\n')
	accountNumber = strings.TrimSpace(accountNumber)

	amount1Str, _ := reader.ReadString('\n')
	amount1Str = strings.TrimSpace(amount1Str)
	amount1, _ := strconv.ParseFloat(amount1Str, 64)

	amount2Str, _ := reader.ReadString('\n')
	amount2Str = strings.TrimSpace(amount2Str)
	amount2, _ := strconv.ParseFloat(amount2Str, 64)

	// TODO: 세 가지 결제 유형(CreditCard, PayPal, BankTransfer)을 생성하세요.

	// TODO: NewPaymentProcessor를 사용하여 신용카드로 PaymentProcessor를 생성하고
	// amount1으로 결제를 실행한 후 결과를 출력하세요.

	// TODO: 세 가지 결제 유형을 모두 포함하는 PaymentMethod 슬라이스를 생성하세요.

	// TODO: ProcessAll을 사용하여 amount2로 모든 결제를 처리하고
	// 각 결과를 별도의 줄에 출력하세요.
}

객체 지향 프로그래밍의 모든 레슨