2020/04/10 - [개발자/Java] - Java (자바) ATM 저금통, BMI
Java (자바) ATM 저금통, BMI
1. BMI 계산해서 비만, 정상, 저체중 등 출력하기. import java.util.Scanner; public class BMI_Calculator_executionClass { public static void main(String[] args) { BMI_Calculator bmi = new BMI_Calculato..
greendreamtrre.tistory.com
의 2번 문제 풀이에 생성자와 다형성을 적용한다.
Q ) ATM을 만드세요.
조건 1 ) 종료 조건이 입력되면 잔고를 출력후 종료. (기존 문제에서 1번만 조금 바뀌었다.)
조건 2 ) 메시지를 남기면 메시지와 금액을 출력.
조건 3 ) 메시지를 남기지 않으면 '딸그랑'과 금액을 출력.
1. 실행 클래스
import java.util.Scanner;
public class Box_executionClass {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 초기정보.
// Box box = new Box(); // 생성자 1.에 걸린다.
// Box box = new Box(5000); // 생성자 2.에 걸린다.
Box box = new Box(5000,"보너스"); // 생성자 3.에 걸린다.
for (int i = 0; i < 999999; i++) {
System.out.println("원하는 기능을 입력하세요. 1) 저금할 액수 입력, 2) 메세지 + 저금액수, -1) 종료");
int selectMenu = scanner.nextInt();
scanner.nextLine(); // nextInt() return 소거용.
// try catch는 전체를 묶기 보다는 오류 발생할만한 부분마다 넣어주면 각각의 오류를 잡을 수 있어서 더 좋다.
try {
// 실행 1.
if (selectMenu == 1) { // 조건 1.실행
// 금액
System.out.println("저금할 금액을 입력해주세요.");
int amount = scanner.nextInt();
scanner.nextLine(); // nextInt() return 소거용.
box.deposit(amount);
// 실행 2.
} else if (selectMenu == 2) { // 조건 2.실행
// 메세지 + 금액
System.out.println("메세지를 입력해주세요.");
String message = scanner.nextLine();
System.out.println("저금할 금액을 입력해주세요.");
int amount = scanner.nextInt();
scanner.nextLine(); // nextInt() return 소거용.
box.deposit(amount, message);
} else if (selectMenu == -1) { // 조건 -1.실행
break;
}
} catch (Exception e) {
System.out.println("1, 2, -1 값만 입력해주세요.");
}
}
}
}
2. 함수 메소드가 있는 클래스
public class Box {
private int amount = 0;
// 생성자. new를 통해 처음 들어올 때 초기값을 넣어줄 때 사용. 클래스명을 그대로 만들면 된다. 메모리 주소 할당하며 해당 데이터를 넣고 시작하겠단 의미.
// 생성자도 아래 메소드의 다형성처럼 인풋 파라미터에 따라 다형성을 가질 수 있다.
// 생성자 1. RunClass에서 new Box()로 초기화 한 경우 여기 걸린다.
Box() {
this.amount = 10000;
}
// 생성자 2. RunClass에서 new Box(숫자)로 초기화 한 경우 여기 걸린다.
Box(int amount) {
this.amount = amount;
}
// 생성자 3. RunClass에서 new Box(숫자, "문자")로 초기화 한 경우 여기 걸린다.
Box(int amount, String name) {
this.amount = amount * 100;
}
// 왜 이렇게 되냐??? RunClass에서 호출할 때 클래스.메소드(값) 으로 호출하는데 이 때 '값'을 클래스로 우선 받고, 클래스가 메소드에 던져준다. (클래스로 바로 들어가는게 아님.)
// 로직 메소드 1.
public void deposit(int amount) {
// // 1. 일반적인 각각의 작동 메소드 2개 만들기.
// this.amount = this.amount + amount;
// System.out.println("딸그랑");
// System.out.println("현재 잔액은 " + this.amount + " 입니다.");
// 2. 메소드에서 다른 메소드를 호출해서 메소드를 넘기기. <<메소지의 다형성, 오버라이드 : 입력 받는거에 따라서 같은 이름의 메소드가 각각 다른 기능을 할 수 있다.>>
this.deposit(amount, "딸그랑"); // 금액만 입력 받은 경우 어차피 금액과 딸그랑을 출력할거니까 입력된 금액에 "딸그랑"이라는 메시지를 붙여 아래 메소드로 보낸다.
}
// 로직 메소드 2.
// 메소드 이름이 같아도 서로 다른 인풋 파라미터로 각각 다르게 작동하게 할 수 있다.
public void deposit(int amount, String message) {
this.amount = this.amount + amount;
System.out.println("message");
System.out.println("현재 잔액은 " + this.amount + " 입니다.");
}
// // setter
// public void setAmount(int amount) {
// this.amount = amount;
// }
// // getter
// public int getAmount() {
// return this.amount;
// }
}
클래스 2개가 있고, 라인이 넘어갈 때마다 매번 클래스가 나오면 가서 불러오는 개념으로 생각하지 말자. 이렇게 선언을 하는 순간 Box_executionClass 의 Box box = new Box(); 이 부분에 재귀함수마냥 Box() 클래스 덩어리를 가져다 붙여 놓는다 생각하자.
Box box = new Box(); -> 클래스 Box의 이름은 box다. 그리고 이 box는 '메모리에 할당해라 Box()'이다.
Box box = new Box(5000); -> 클래스 Box의 이름은 box다. 그리고 이 box는 '메모리에 할당해라 Box(5000)'이다.
이런식으로 클래스를 선언하고 가져오면 여기에 이 클래스 덩어리를 오려다 붙여 넣는거다. (클래스를 왔다갔다 하는 개념으로 생각 X) 즉, '이 자리에다 box란 이름으로 Box()을 오려다 붙여넣는다.' 이런 의미다. 앞으로 이걸 클래스 방을 생성한다고 하겠다.
그리고 Box()의 생성자는 Box_executionClass에서 new 가 붙을 때만 실행된다. (왜냐하면 그 다음부턴 box.메소드이름 으로 box의 메소드만 불러올거니까.)
cf. 이클립스에서 실행 버튼을 누르면 해당 클래스만 실행되는게 아니라 그 자바 프로젝트 전체가 실행된다. (비록 우리는 이클립스 하단 콘솔에 하나만 보이겠지만...) 실행 클래스, 메소드 로직 클래스 이렇게 만들고 메소드 로직 클래스에서 실행 버튼 눌러도 실행 클래스까지 같이 다 실행된다.
'개발자 > Java' 카테고리의 다른 글
Java (자바) nextInt() 이후 nextLine() 넘어가는 문제 (추가 : nextInt() 문자 입력시 예외처리) (1) | 2020.04.14 |
---|---|
Java (자바) 생성자, 객체데이터의 활용 (0) | 2020.04.13 |
Java (자바) ATM 저금통, BMI (0) | 2020.04.10 |
Java (자바) 예외처리 try catch (0) | 2020.04.09 |
Java (자바) private, this., setter, getter (0) | 2020.04.09 |