728x90
수업내용 정리 (Java)
1. 복습 +a
1-1) 변수 선언, 초기화, 대입
int a;
a = 1;
a = 2;
int b = 0;
- 변수 선언: int a;
(변수는 생성되지 않음!) - 초기화: a = 1;
처음 변수에 값을 집어넣어서 변수가 생성됨 - 대입: a = 2;
변수 안 값을 다른 값으로 대체 - int ab = 0;
변수 선언과 초기화를 동시에 하는 것
2. 반복문_foreach
int[] a = {1,3,5,7,9};
// 인덱스로 확인하는 방법
for(int i=0; i<a.length; i++) {
System.out.println(a[i]);
}
// foreach
for(int i : a) {
System.out.println(i);
}
- 인덱스로 확인하는 방법
- i번째 배열에 있는 값을 출력
- foreach
- 배열을 순서대로 i에 대입
- i의 타입은 배열의 타입으로 적어야 한다.
ex)
String[] b = {"홍길동", "이순신", "심청이"};
for(String i : b) {
System.out.println(i);
}
3. 예제_grade
3-1) 변수 선언
Scanner sc = new Scanner(System.in);
String[] name = new String[10]; // 학생이름
int[] kor = new int[10]; // 국어점수
int[] eng = new int[10]; // 영어점수
int[] mat = new int[10]; // 수학점수
int[] total = new int[10]; // 총점
double[] avg = new double[10]; // 평균
char[] grade = new char[10]; // 학점
int cnt = 0; // 학생을 등록할 때마다 1 증가
- cnt를 지정해야 학생을 몇번 등록했는지 코드에 저장해두고 나중에 에러가 나지 않는다.
- ex
- for(int i=0; i<cnt; i++): 등록된 학생 수보다 적은 동안에 돌아가는 for문
- for(int i=0; i<name.length; i++): name의 크기보다 적은 동안에 돌아가는 for문
즉, 학생을 몇명 등록했는지와 상관없이 name의 크기만큼 돌아가는 for문
학생을 name의 크기보다 적게 등록하고 name[i]로 했을 경우, 에러가 난다.
3-2) 기본틀
while(true) {
System.out.println("==========학사관리시스템==========");
System.out.println("1.학생등록 2.학생리스트 3.검색 0.종료");
System.out.print("메뉴선택> ");
int menu = sc.nextInt();
if(menu == 1) {
}else if(menu == 2) {
}else if(menu == 3) {
}else if(menu == 0) {
break;
}else {
System.out.println("존재하지 않는 메뉴입니다.");
}
System.out.println();
}
System.out.println("프로그램 종료");
System.out.println("=============================");
- 메뉴는 0부터 3까지 있다.
- 0은 종료이기 때문에 break;를 넣어 while문을 나간다.
- 0~3 이외의 메뉴가 없기 때문에 else로 존재하지 않는 메뉴라는 말을 출력한다.
3-3) 메뉴 선택에서 1을 입력했다면, 1. 학생등록
if(menu == 1) {
System.out.print("학생이름> ");
name[cnt] = sc.next();
System.out.print("국어점수> ");
kor[cnt] = sc.nextInt();
System.out.print("영어점수> ");
eng[cnt] = sc.nextInt();
System.out.print("수학점수> ");
mat[cnt] = sc.nextInt();
total[cnt] = kor[cnt]+eng[cnt]+mat[cnt];
avg[cnt] = total[cnt] / (double)3; // (double)total[0] / 3; 으로도 가능
char a = ' ';
if(avg[cnt] >= 90) {
a = 'A';
}else if(avg[cnt] >= 80) {
a = 'B';
}else if(avg[cnt] >= 70) {
a = 'C';
}else if(avg[cnt] >= 80) {
a = 'D';
}else if(avg[cnt] < 60) {
a = 'F';
}
grade[cnt] = a;
System.out.println(name[cnt]+" 학생 등록완료!");
cnt++;
}
- name, kor, eng, mat에 정보가 입력되면 total에 kor, eng, mat을 더해 저장하고, avg에 total의 평균을 저장한다.
- 평균이 90, 80, 70, 60, 60미만인가에 따라 A, B, C, D, F를 a에 저장 후 grade에 대입
- 학생 등록이 완료되면 cnt 1 추가
3-4) 메뉴 선택에서 2를 입력했다면, 2. 학생 리스트
else if(menu == 2) {
System.out.println("이름\t국어\t영어\t수학\t총점\t평균\t학점");
System.out.println("==================================================");
for(int i=0; i<cnt; i++) {
System.out.printf("%s\t%d\t%d\t%d\t%d\t%.2f\t%c\n",
name[i], kor[i], eng[i], mat[i], total[i], avg[i], grade[i]);
}
- 등록된 학생들의 이름, 국어, 영어, 수학, 총점, 평균, 학점 순으로 출력한다.
3-5) 메뉴 선택에서 3을 입력했다면, 3. 검색 // 질문! ( i == cnt-1 )
else if(menu == 3) {
System.out.print("검색할 학생 이름> ");
String searchName = sc.next();
// 내가 한 방법
for(int i=0; i<cnt; i++) {
if(searchName.equals(name[i])) {
System.out.println("이름\t국어\t영어\t수학\t총점\t평균\t학점");
System.out.println("==================================================");
System.out.printf("%s\t%d\t%d\t%d\t%d\t%.2f\t%c\n",
name[i], kor[i], eng[i], mat[i], total[i], avg[i], grade[i]);
break;
}else if(i==cnt-1) {
System.out.println("리스트에 존재하지 않는 학생입니다.");
}
}
- 콘솔창에서 학생 이름을 받아오면 for문을 통해 입력받아온 이름과 name 배열 안에 있는 이름을 비교해서(.equals()) 동일할 경우, 정보를 출력한다.
- name 배열에서 찾을 수 없는 경우, 리스트에 존재하지 않는 학생입니다. 를 출력한다.
// 다른 방법! (선생님이 하신 방법)
boolean find = false;
for(int i=0; i<cnt; i++) {
if(searchName.equals(name[i])) {
System.out.println("이름\t국어\t영어\t수학\t총점\t평균\t학점");
System.out.println("==================================================");
System.out.printf("%s\t%d\t%d\t%d\t%d\t%.2f\t%c\n",
name[i], kor[i], eng[i], mat[i], total[i], avg[i], grade[i]);
find = true;
break;
}
}
if(find == false) { // !find
System.out.println("리스트에 존재하지 않는 학생입니다.");
}
- boolean을 이용해 find를 false로 선언 및 초기화해두고, 입력받아온 이름이 name 배열 안에 있으면 find를 true로 바꾸고 반복을 멈춘다.
- 입력받아온 이름이 name 배열 안에 없으면 find가 false이므로 두번째 if의 조건을 충족해서 리스트에 존재하지 않는 학생입니다. 를 출력한다.
4. 예제_account
4-1) import
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy년MM월dd일 hh:mm:ss");
Scanner sc = new Scanner(System.in);
- DateTimeFormatter
날짜를 받아올 수 있다. - Scanner
콘솔창에서 입력받아올 수 있다.
4-2) 변수 선언
String[] name = new String[10]; // 예금주
String[] account = new String[10]; // 계좌번호
int[] balance = new int[10]; // 잔액
String[] joinDate = new String[10]; // 가입날짜
int cnt = 0;
4-3) 기본 틀
while(true) {
System.out.println("=============은행=============");
System.out.println("1.계좌생성 2.입금 3.출금 4.계좌목록 0.종료");
System.out.print("메뉴 선택> ");
int menu = sc.nextInt();
if(menu == 1) {
}else if(menu == 2) {
}else if(menu == 3) {
}else if(menu == 4) {
}else if(menu == 0) {
break;
}
System.out.println();
}
System.out.println("프로그램 종료");
- 메뉴는 0부터 3까지 있다.
- 0은 종료이기 때문에 break;를 넣어 while문을 나간다.
4-4) 메뉴 선택에서 1을 입력했다면, 1. 계좌 생성
if(menu == 1) {
System.out.print("이름을 입력해주세요.\n이름 입력> ");
name[cnt] = sc.next();
System.out.print("계좌번호를 입력해주세요.\n계좌번호 입력> ");
account[cnt] = sc.next();
System.out.print("초기 잔액을 입력해주세요.\n잔액 입력> ");
balance[cnt] = sc.nextInt();
String now = dtf.format(LocalDateTime.now());
joinDate[cnt] = now;
System.out.println(name[cnt]+"님 계좌생성 완료되었습니다.");
cnt++;
}
- name, account, balance에 정보가 입력되면 입력한 시간을 String now로 불러오고, now를 joinDate에 저장한다.
- 계좌 생성이 완료되면 cnt에 1을 추가한다.
4-5) 메뉴 선택에서 2를 입력했다면, 2. 입금
else if(menu == 2) {
System.out.print("입금할 계좌번호를 입력해주세요.\n입금할 계좌번호> ");
String inAccount = sc.next();
for(int i=0; i<cnt; i++) {
if(inAccount.equals(account[i])) {
System.out.print("입금할 금액을 입력해주세요.\n입금할 금액> ");
int inMoney = sc.nextInt();
System.out.println("성공적으로 입금이 되었습니다.");
System.out.printf("입금 전 잔액: %,d원\n",balance[i]);
balance[i] += inMoney;
System.out.printf("입금 후 잔액: %,d원",balance[i]);
break;
}else if(i == cnt-1) {
System.out.println("존재하지 않는 계좌입니다.");
}
}
}
- 입금할 계좌번호를 입력받아오고 그 값이 account 배열 안에 있을 경우, 입금할 금액을 입력받고, 입금 전, 후의 잔액을 출력하고 break로 for문을 빠져나간다.
- account 배열 안에 없을 경우, 존재하지 않는 계좌입니다. 를 출력한다.
4-6) 메뉴 선택에서 3을 입력했다면, 3. 출금
else if(menu == 3) {
System.out.println("출금할 계좌번호를 입력해주세요.\n출금할 계좌번호> ");
String outAccount = sc.next();
for(int i=0; i<cnt; i++) {
if(outAccount.equals(account[i])) {
System.out.print("출금할 금액을 입력해주세요.\n출금할 금액> ");
int outMoney = sc.nextInt();
if(balance[i] < outMoney) {
System.out.println("잔액이 부족합니다.");
}else {
System.out.println("성공적으로 출금이 되었습니다.");
System.out.printf("출금 전 잔액: %,d원\n",balance[i]);
balance[i] -= outMoney;
System.out.printf("출금 후 잔액: %,d원",balance[i]);
}
}else if(i == cnt-1) {
System.out.println("존재하지 않는 계좌입니다.");
}
}
}
- 출금할 계좌번호를 입력받아오고 그 값이 account 배열 안에 있을 경우, 출금할 금액을 입력받고, 계좌 안에 남아있는 잔액보다 적을 경우에는 출금 전, 후의 잔액을 출력하고 break로 for문을 빠져나간다.
- account 배열 안에 있지만 입력받은 출금 금액이 계좌 잔액보다 클 경우, 잔액이 부족합니다. 를 출력한다.
- account 배열 안에 없을 경우, 존재하지 않는 계좌입니다. 를 출력한다.
4-7) 메뉴 선택에서 4를 입력했다면, 4. 계좌 목록
else if(menu == 4) {
System.out.println("예금주\t계좌번호\t잔액\t\t가입날짜");
System.out.println("============================");
for(int i=0; i<cnt; i++) {
System.out.printf("%s\t%s\t%,d원\t%s\n",name[i],account[i],balance[i],joinDate[i]);
}
}
- 등록된 계좌들을 예금주, 계좌번호, 잔액, 가입날짜 순으로 출력한다.
- cnt보다 적을 때 동안 반복하여 출력
질문한 내용이나 어려웠던 점 메모
3-5) : 왜 cnt가 아니라 cnt-1을 붙여야 하는지 (관련: 4-5, 4-6)
for(int i=0; i<cnt; i++)
else if(i==cnt-1) {
System.out.println("리스트에 존재하지 않는 학생입니다.");
}
- for문에 i가 cnt보다 작은 만큼 돈다고 그랬으니 else if의 조건을 i==cnt라고 해버리면 for문의 조건문에 부합하지 않으므로 for문을 돌지 않는다. 그렇기 때문에 else if는 아예 조건을 성립할 수 없게 된다.
- else if의 조건을 i==cnt-1이라고 하면, for문의 조건인 i가 cnt보다 작을 동안. 즉, cnt보다 1적을 때까지니까 for문의 마지막 반복일 때 else if를 실행하라는 조건이 된다.
- 질문한 이유: for문의 미자막 반복이면 실행한다는 조건을 넣어야 해서 i==cnt 라는 조건을 걸었더니 아예 실행되지 않았다. 해결하긴 했으나 왜 이게 되는지 몰랐다.
전체 피드백
- for문을 아직 완벽하게 이해하지 못한 것 같다. 자꾸 cnt보다 작을 때 동안 반복한다라고 알고는 있는데 cnt와 같은 값이어도 돌 것이라고 생각할 때가 있다. 선생님이 if(int i=0; i<2; i++)이라면 i의 값은 3이 된대서 이 설명을 듣고 종종 헤매는 것 같다. 그러지 않도록 많이 if문을 이용한 문제를 보는 것도 괜찮을 것 같다.
- 코드 제대로 보기!!!
728x90
'프로그래밍 > 수업일지' 카테고리의 다른 글
수업일지 8일차 (23/09/25) - Java (0) | 2023.09.25 |
---|---|
수업일지 7일차 (23/09/22) - Java (1) | 2023.09.22 |
수업일지 5일차 (23/09/20) - Java (0) | 2023.09.20 |
수업일지 4일차 (23/09/19) - Java (0) | 2023.09.19 |
수업일지 3일차 (23/09/18) - Java (1) | 2023.09.18 |