열심히 끝까지
[코딩문제] - 6/20 카드 사용 문제 본문
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);
}
}
'디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(과제)' 카테고리의 다른 글
[설계 문제] - 6/22 치킨집 프렌차이즈 (0) | 2022.06.22 |
---|---|
[코딩 문제] - 6/21 포켓몬과제 (0) | 2022.06.22 |
[코딩 문제] - 6/15 ~ 6/17 퀵 정렬 (0) | 2022.06.17 |
[수업 내용 발표] - 6/15 발표 자료 PowerPoint (0) | 2022.06.17 |
[능력 단위 평가] - 6/17 문제 코딩 (0) | 2022.06.17 |