Java 결제 시스템 연습
콘솔로 아래와 같이 결과가 출력되도록 카드결제와 현금결제 시스템을 구현해 보자.
파일명 : PayMentTest.java
package chap09;
public class PayMentTest {
public static void main(String[] args) throws PayException {
CardPayment card1 = new CardPayment("11번가","Java책",17000,"123-432-111","0070",0);
payProcess( card1 );
System.out.println("-------------------------------------");
CashPayment cash1 = new CashPayment("인터파크","에어컨",2400000,"198-32");
payProcess( cash1 );
System.out.println("-------------------------------------");
}
public static void payProcess( Payment p ) throws PayException {
p.pay();
System.out.println( p );
}
}
객체생성을 하면 생성자 메소드가 호출되며 생성자 메소드 안에 정의한 코드가 실행된다.
CardPayment클래스와 CashPayment클래스로 간단하게 결제정보를 주고 payProcess() 메소드를 실행한다.
payProcess() 메소드 안에는 Payment클래스의 pay()메소드를 부른다.
파일명 : Payable.java
package chap09;
public interface Payable {
public void pay() throws PayException ;
}
결제 가능한 인터페이스를 생성한다.
인터페이스를 선언할 때에는 접근 제어자(여기서는 public)와 함께 interface 키워드를 사용하면 된다.
인터페이스를 사용하는 이유는 implements함으로써 다중상속을 가능하게 하기 위함이다. 자바는 다중상속을 지원하지 않지만 implements를 이용하면 가능해진다. 결합도가 낮아지고, 유지보수에 용이하다.
파일명 : PayException.java
package chap09;
import java.lang.Exception;
public class PayException extends Exception {
public PayException(String message){
super(message);
}
}
extends 의 의미는 클래스를 확장하는 것이다. extends를 통해 Exception클래스를 상속받고 객체화하면
부모 클래스인 Exception의 메소드와 변수를 가져와 사용할 수 있다
PayException 클래스로 결제 트렌젝션의 오류 예외처리를 해준다.
파일명 : Payment.java
package chap09;
abstract public class Payment implements Payable{ // Payable을 상속받는다
protected String shopName;
protected String productName;
protected long productPrice;
public Payment() {
}
public Payment(String shopName, String productName, long productPrice) {
super();
this.shopName = shopName; // this 키워드는 인스턴스 자기 자신을 뜻한다
this.productName = productName;
this.productPrice = productPrice;
}
@Override
public abstract void pay() throws PayException; //추상메서드: 선언부만 작성하고 구현부는 작성하지 않음
// 실제 내용은 상속받는 클래스에서 구현한다.
public String getShopName() {
return shopName;
}
public void setShopName(String shopName) {
this.shopName = shopName;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public long getProductPrice() {
return productPrice;
}
public void setProductPrice(long productPrice) {
this.productPrice = productPrice;
}
}
protected 접근 제어자로 shopName, productName, productPrice을 선언하면
같은 패키지에 속해있는 클래스에서 생성자와 메소드, 필드(객체)만 호출 할 수 있다.
상속관계에 있는 클래스라면 예외로 호출이 가능하다.
이처럼 생성자 메소드를 정의할때 몇가지 규칙이 있다.
1. 클래스명과 생성자 메소드명은 대소문자까지 모두 동일한이름
2. 리턴타입,void 다 명시하지 않는다
3. 클래스를 만들때 생성자메소드를 정의하지 않으면 컴파일러가 자동으로 매개변수 없는 생성자를 만든다.
4. 일반메소드처럼 매개변수 개수나 타입을 다르게하면 여러개의 생성자를 정의(Overloading)할 수 있다
5. 클래스를 정의하면서 생성자 메소드를 한개 이상 정의하면 컴파일러가 기본생성자만들지 않음
=>기본생성자를 반드시 정의해야한다
6. 생성자메소드가 오버로딩 되어있는 경우 또다른 생성자 메소드인 '자신의 생성자'를 호출가능
파일명 : CardPayment.java
package chap09;
public class CardPayment extends Payment{
private String cardNumber;
private String cardPassword;
private int monthlyInstallment;
@Override // 부모클래스 Payment의 추상메서드를 오버라이드
public void pay() throws PayException {
if(getMonthlyInstallment()<0 | productPrice<=0) {
throw new PayException("가격이나 할부개월수가 잘못되었습니다.");
}else {
System.out.println("신용카드가 정상적으로 지불되었습니다.");
}
}
public CardPayment(){
}
public CardPayment(String shopName, String productName, long productPrice,String cardNumber, String cardPassword, int monthlyInstallment) {
super(shopName,productName,productPrice);
this.cardNumber = cardNumber;
this.cardPassword = cardPassword;
this.monthlyInstallment = monthlyInstallment;
}
@Override
public String toString() {
String msg = "[신용카드 결제 정보]";
msg += "\n상점명 : "+shopName;
msg += "\n상품명 : "+productName;
msg += "\n상품가격 : "+productPrice;
msg += "\n신용카드번호 : "+cardNumber;
msg += "\n할부개월 : "+monthlyInstallment;
return msg;
}
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getCardPassword() {
return cardPassword;
}
public void setCardPassword(String cardPassword) {
this.cardPassword = cardPassword;
}
public int getMonthlyInstallment() {
return monthlyInstallment;
}
public void setMonthlyInstallment(int monthlyInstallment) {
this.monthlyInstallment = monthlyInstallment;
}
}
파일명 : CashPayment.java
package chap09;
public class CashPayment extends Payment{
private String cashReceiptNumber;
@Override
public void pay() throws PayException {
if(productPrice<=0) {
throw new PayException("가격이 잘못되었습니다.");
}else {
System.out.println("현금이 정상적으로 지불되었습니다.");
}
}
public CashPayment(){
}
public CashPayment(String shopName, String productName, long productPrice,String cashReceiptNumber) {
super(shopName,productName,productPrice);
this.cashReceiptNumber = cashReceiptNumber;
}
@Override
public String toString() {
String msg = "[현금 결제 정보]";
msg += "\n상점명 : "+shopName;
msg += "\n상품명 : "+productName;
msg += "\n상품가격 : "+productPrice;
msg += "\n현금영수증번호 : "+cashReceiptNumber;
return msg;
}
public String getCashReceiptNumber() {
return cashReceiptNumber;
}
public void setCashReceiptNumber(String cashReceiptNumber) {
this.cashReceiptNumber = cashReceiptNumber;
}
}
'Programming > Java' 카테고리의 다른 글
Java / Networking / 소켓( socket ) 통신 프로그래밍 (0) | 2021.03.27 |
---|---|
Java / 캡슐화 / 상속 / 다형성 개념 (0) | 2021.03.26 |
Java 기본 제공 API / 패키지 / String / Random 클래스 / 개념 (0) | 2021.03.20 |
Java언어란? / 개념 정리 (0) | 2021.03.13 |
Java / OOP 객체 지향/ BufferedReader / try ~ catch (0) | 2021.03.13 |
댓글