열심히 끝까지

[코딩문제] - 6/20 카드 사용 문제 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(과제)

[코딩문제] - 6/20 카드 사용 문제

노유림 2022. 6. 20. 17:56

class Card
 String name 카드사용자
 int money 현재까지 사용한 금액
 boolean flag 제한금액 여부
 int limit 제한금액
 void pay(int money) money만큼 결제
 void alert() "제한금액을 초과하여 사용할수없습니다!"라는 경고문구를 출력
 Card("홍길동") -> 제한금액 없음
 Card("홍길동",10000) -> 제한금액 있음(10000원으로 설정됨)
출력시 : ㅇㅇ님 현재까지 사용한 금액은 ㅁㅁ원입니다. 제한금액 O: xxx원
  제한금액 X

class CreditCard
 int cnt 제한금액을 초과하는 결제 횟수를 카운팅
 void alert() "제한금액을 초과하여 사용할수없습니다! [총 N회 경고]"라는 경고문구를 출력
 CreditCard("홍길동",10000) -> 제한금액 있음(10000원으로 설정됨)
출력시 : ㅇㅇ님 현재까지 사용한 금액은 ㅁㅁ원입니다. 제한금액 O: xxx원

class BusCard
 int age 카드사용자의 나이
 int check() 카드사용자의 나이가 ~12 0원 / 13~19 1000원 / 20~65 2000원 / 66~ 0원을 반환
 void pay() 카드사용자의 나이에 맞게 결제
 BusCard("홍길동",21) -> 나이 21세.제한금액 없음
 BusCard("홍길동",21,10000) -> 나이 21세.제한금액 있음(10000원으로 설정됨)
단, 나이는 0~200까지만 유효하게 설정되며
0미만이거나 200초과의 값에 대해서는 20으로 설정됨
출력시 : ㅇㅇ님(21세) 현재까지 사용한 금액은 ㅁㅁ원입니다. 제한금액 O: xxx원
제한금액 X

 

1. this(name, age, limit) + flag = false 삽입문

package class04;
class Card{
	String name; // 카드 사용자
	int money; // 현재까지 사용한 금액
	boolean flag; // 제한금액 여부
	int limit; // 제한 금액
	void pay(int money) { // money만큼 결제!
		if(flag) { // flag = true(제한이 존재)
			if(this.money+money > this.limit) { // 제한금액보다 돈이 클 때
				alert(); // 경고
			}
			else { // 제한금액보다 크지 않을 때
				this.money += money; // 돈에 사용한 금액 추가
				System.out.println(this.name+ "님 현재까지 사용한 금액은 " + this.money +
						"원입니다. 제한금액 O : " + this.limit + "원");
			}
		}
		else { // 제한 금액 존재하지 않음
			this.money += money; // 돈에 사용한 금액 추가
			System.out.println(this.name+ "님 현재까지 사용한 금액은 " + this.money +" 입니다. 제한금액 X");
		}
	}
	void alert() { // 경고문구 출력
		System.out.println("제한금액을 초과하여 사용할 수 없습니다!");
	}
	Card(String name){ // 이름만 존재
		this(name, 0);
		this.flag = false; // 제한값 존재하지 않음
	}
	Card(String name, int limit){ // 이름과 제한금액이 존재
		this.name = name;
		this.limit = limit;
		this.flag = true; // 제한값 존재
	}	
}
class CreditCard extends Card{
	int cnt = 0; // 횟수 증가
	void alert() {
		System.out.println("제한금액을 초과하여 사용할 수 없습니다! [총 " + ++cnt + "회 경고]");
	}
	CreditCard(String name, int limit){
		super(name, limit);
	}
}
class BusCard extends Card{
	int age;
	int check() {
		if(this.age < 13 || 66 <= this.age) { // 13보다 작거나 65보다 크면
			return 0; // 0값 돌려놓기
		}
		else if(this.age < 20) { // 20보다 작으면
			return 1000; // 1000값 돌려놓기
		}
		else { // 그 외에는 
			return 2000; // 2000값 돌려놓기
		}
	}
	void pay() {
		if(flag) { // flag = true(제한이 존재)
			if(this.money+money > limit) { // 제한금액보다 돈이 클 때
				alert(); // 경고
			}
			else { // 제한금액보다 크지 않을 때
				this.money += check(); // 돈에 사용한 금액 추가
				System.out.println(this.name+ "님(" + age + ") 현재까지 사용한 금액은 " + this.money +" 입니다. 제한금액 O : " + this.limit + "원");
			}
		}
		else { // 제한 금액 존재하지 않음
			this.money += check(); // 돈에 사용한 금액 추가
			System.out.println(this.name + "님(" + this.age + ") 현재까지 사용한 금액은 " + this.money +" 입니다. 제한금액 X");
		}
	}
	BusCard(String name, int age){ // 이름과 나이만 입력
		this(name, age, 0); // 위에 제한없는 부모Card 상속
		flag = false;
	}
	BusCard(String name, int age, int limit){
		super(name, limit); // 제한있는 부모 Card 상속
		this.age = age;
		if(this.age < 0 || 200 < this.age) { // 0보다 작거나 200보다 큰 경우
			this.age = 20; // 20으로 입력
		}
	}
}
public class Test12 {
	public static void main(String[] args) {
		Card c = new Card("홍길동", 10000);
		Card c1 = new Card("홍길동");
		CreditCard cc = new CreditCard("홍길동", 10000);
		BusCard bc = new BusCard("홍길동", 201, 10000);
		BusCard bc1 = new BusCard("아리", 13, 10000);
		BusCard bc2 = new BusCard("홍길동", 15);
		c.pay(20000);
		c1.pay(30000);
		c.pay(10000);
		c1.pay(30000);
		c.pay(5000);
		System.out.println();
		cc.pay(20000);
		cc.pay(10000);
		cc.pay(5000);
		System.out.println();
		bc.pay();
		bc.pay();
		bc1.pay();
		System.out.println(bc2.check());
		bc2.pay();
	}
}

2. super(name) + this.age + if 삽입문

package class04;
class Card{
	String name; // 카드 사용자
	int money; // 현재까지 사용한 금액
	boolean flag; // 제한금액 여부
	int limit; // 제한 금액
	void pay(int money) { // money만큼 결제!
		if(flag) { // flag = true(제한이 존재)
			if(this.money+money > this.limit) { // 제한금액보다 돈이 클 때
				alert(); // 경고
			}
			else { // 제한금액보다 크지 않을 때
				this.money += money; // 돈에 사용한 금액 추가
				System.out.println(this.name+ "님 현재까지 사용한 금액은 " + this.money +
						"원입니다. 제한금액 O : " + this.limit + "원");
			}
		}
		else { // 제한 금액 존재하지 않음
			this.money += money; // 돈에 사용한 금액 추가
			System.out.println(this.name+ "님 현재까지 사용한 금액은 " + this.money +" 입니다. 제한금액 X");
		}
	}
	void alert() { // 경고문구 출력
		System.out.println("제한금액을 초과하여 사용할 수 없습니다!");
	}
	Card(String name){ // 이름만 존재
		this(name, 0);
		this.flag = false; // 제한값 존재하지 않음
	}
	Card(String name, int limit){ // 이름과 제한금액이 존재
		this.name = name;
		this.limit = limit;
		this.flag = true; // 제한값 존재
	}	
}
class CreditCard extends Card{
	int cnt = 0; // 횟수 증가
	void alert() {
		System.out.println("제한금액을 초과하여 사용할 수 없습니다! [총 " + ++cnt + "회 경고]");
	}
	CreditCard(String name, int limit){
		super(name, limit);
	}
}
class BusCard extends Card{
	int age;
	int check() {
		if(this.age < 13 || 66 <= this.age) { // 13보다 작거나 65보다 크면
			return 0; // 0값 돌려놓기
		}
		else if(this.age < 20) { // 20보다 작으면
			return 1000; // 1000값 돌려놓기
		}
		else { // 그 외에는 
			return 2000; // 2000값 돌려놓기
		}
	}
	void pay() {
		if(flag) { // flag = true(제한이 존재)
			if(this.money+money > limit) { // 제한금액보다 돈이 클 때
				alert(); // 경고
			}
			else { // 제한금액보다 크지 않을 때
				this.money += check(); // 돈에 사용한 금액 추가
				System.out.println(this.name+ "님(" + age + ") 현재까지 사용한 금액은 " + this.money +" 입니다. 제한금액 O : " + this.limit + "원");
			}
		}
		else { // 제한 금액 존재하지 않음
			this.money += check(); // 돈에 사용한 금액 추가
			System.out.println(this.name + "님(" + this.age + ") 현재까지 사용한 금액은 " + this.money +" 입니다. 제한금액 X");
		}
	}
	BusCard(String name, int age){ // 이름과 나이만 입력
		super(name); // 제한 없는 부모 Card 상속
		this.age = age;
		if(this.age < 0 || 200 < this.age) { // 0보다 작거나 200보다 큰 경우
			this.age = 20; // 20으로 입력
		}
	}
	BusCard(String name, int age, int limit){
		super(name, limit); // 제한있는 부모 Card 상속
		this.age = age;
		if(this.age < 0 || 200 < this.age) { // 0보다 작거나 200보다 큰 경우
			this.age = 20; // 20으로 입력
		}
	}
}
public class Test12 {
	public static void main(String[] args) {
		Card c = new Card("홍길동", 10000);
		Card c1 = new Card("홍길동");
		CreditCard cc = new CreditCard("홍길동", 10000);
		BusCard bc = new BusCard("홍길동", 201, 10000);
		BusCard bc1 = new BusCard("아리", 13, 10000);
		BusCard bc2 = new BusCard("홍길동", 15);
		c.pay(20000);
		c1.pay(30000);
		c.pay(10000);
		c1.pay(30000);
		c.pay(5000);
		System.out.println();
		cc.pay(20000);
		cc.pay(10000);
		cc.pay(5000);
		System.out.println();
		bc.pay();
		bc.pay();
		bc1.pay();
		System.out.println(bc2.check());
		bc2.pay();
	}
}

----------------------강사님 답안

package class01;
// 1. 요구사항(조건)을 파악
class Card{ // extends Object
	String name; // 이름
	int money;
	boolean flag;
	int limit;
	void pay(int money) {
		if(this.flag && this.money + money > this.limit) { // 뉘양스 차이 + 이렇게 표현해주는 것이 좋다.
			// 제한금액이 있고 제한 금액을 넘길 경우
			this.alert();
			return; // 함수 즉시 종료
		}
		// A만큼 결제해야하고,
		// 총 누적 사용량(B)에 더해서 새로 저장
		// B = B + A => B += A
		this.money += money; // 기본 로직
		System.out.println(this.name + "님 결제완료. 누적 사용금액 : " + this.money);
	}
	void alert() {
		System.out.println(this.name + "님, 제한금액을 초과하여 사용할 수 없습니다!");
	}
	Card(String name){
		this(name, 0); 
		// 구분을 하고 싶다면 -1로 주면 된다. -> 학생부에서도 쓰인다
		this.flag = false; // 나중에 놔두어야 한다.
	}
	Card(String name, int limit){
		this.name = name;
		this.flag = true;
		this.money = 0; // 안해도 괜찮지만 가독성이 떨어지기 때문에 작성(거의 99% 쓴다)
		// 쓰는 것을 권장!!!
		this.limit = limit;
	}
	@Override
	public String toString() { // 유지보수에는 좋은 코드
		String msg = this.name + "님 현재까지 사용한 금액은 ";
		msg += this.money + "원입니다. 제한금액 ";
		if(flag) {
			msg += "O : " + this.limit + "원";
		}
		else {
			msg += "X";
		}
		return msg;
	}
}
class CreditCard extends Card{ // 부모에게 기본생성자가 없으면 및줄이 그어짐
	// 기본생성자를 추가해주면 되지만 다 짜놓은 코드를 다시 짜기에는 효율성 떨어짐
	int cnt;
	@Override // 이 것을 넣어주는 것이 오버라이딩 됬다는 것을 알 수 있게 되는 계기
	// 넣을 것을 추천
	void alert() {
		super.alert();
		this.cnt++;
		System.out.println("총 [" + this.cnt + "회 경고]");
	}
	CreditCard(String name, int limit){ 
		// 위에 있었던 문제가 알고보니 생성자 문자였다!! 라는 뜻
		// 빨간줄이 아래로 내려왔기 때문에!
		super(name, limit); // 부모클래스에게 기본생성자가 없으니까,
		// 가지고 있는 생성자를 호출하여 사용할 예정!
		this.cnt = 0;
	}	
}
class BusCard extends Card{
	int age;
	int check() {
		int fare = 0;
		if(12 < this.age && this.age < 20) {
			fare = 1000;
		}
		else if(19 < this.age && this.age < 66) {
			fare = 2000;
		}
		return fare;
	}
	// 오버라이딩 : 상속관계 / 메서드 시그니쳐가 같을 때 / 함수 재정의
	// 오버로딩 : 상속관계도 아니고 / 메서드 시그니쳐가 다를 때 / 함수명 중복정의 허용
	void pay() { 
		this.pay(this.check()); // 주어가 있어야 한다!! 
		// 본인이 수행하기 때문에 this.로 지정!!!
		// 나이에 맞게 교통요금을 결제
		// 근데 기존의 결제는 pay(???)로 진행
	}
	BusCard(String name, int age){
		this(name, age, 0);
		this.flag = false;
	}
	BusCard(String name, int age, int limit){
		super(name, limit);
		this.age = age; // 이상한 값
		if(this.age < 0 || 200 < this.age) { // 여기서는 이상한 값이 저장될 수도 있다!
			// age가 여기서 멀쩡해진다
			age = 20; // t
		}
		this.age = age; // 사용자를 위해서는 if문 안이 아닌 밖에서 정의해주는 것이 좋다. 
	}
}
public class Test01 {
	public static void main(String[] args) {
		Card c1 = new Card("아무무");
		Card c2 = new Card("아리", 5000);
		c1.pay(100000);
		c2.pay(3000);
		c2.pay(4000);
		System.out.println(c1);
		System.out.println(c2);
		System.out.println();
		CreditCard cc = new CreditCard("티모", 2000);
		cc.pay(1000);
		System.out.println(cc);
		System.out.println();
		BusCard bc1 = new BusCard("나르", 13, 500);
		BusCard bc2 = new BusCard("가렌", 250);
		bc1.pay();
		bc2.pay();
		System.out.println(bc1);
		System.out.println(bc2);
	}
}