분류 전체보기 (135)

728x90

 

수업내용 정리 (Java)

 

1. 복습!

 1-1) a 배열에서 짝수의 합과 홀수의 개수 출력

// 문제) a 배열에서 짝수의 합과 홀수의 개수 출력
int[] a = {45,78,54,48,6};

int a1 = 0;
int a2 = 0;

for(int i=0; i<a.length; i++) {
	if(a[i]%2 == 0) {
		a1 += a[i];
	}else {
		a2++;
	}
}
  • for문이 i가 a 배열의 크기보다 작을 동안 돌아간다.
  • a 배열의 i번째 배열이 2로 나눴을 때 나머지가 없는 경우, a1에 i번째 배열의 값을 더한다.
  • 그렇지 않을 경우, a2에 1씩 더한다.

 

 1-2) 반복하면서 숫자를 입력받는데, 짝수만 b 배열에 저장하기. (*홀수만 입력 시 무한반복)

// 문제2) 반복하면서 숫자를 입력받는데 짝수만 b 배열에 저장하기 *홀수만 입력 시 무한반복
int[] b = new int[5];

for(int i=0; i<b.length; i++) {
	System.out.print("숫자 입력> ");
	int num = sc.nextInt();
	if(num%2 == 0) {
		b[i] = num;
	}else {
		i--;
	}
}
  • for문이 i가 b 배열의 크기보다 작을 동안 돌아간다.
  • 숫자 하나를 한 변수에 저장해두고 그 변수가 2로 나눴을 때, 나머지가 0이라면 b 배열의 i번째 인덱스에 저장한다.
  • 그렇지 않다면, i를 1씩 뺀다.

 

 1-3) 인덱스를 한 칸씩 땡기기

// 고난이도 문제) 인덱스를 한 칸씩 땡기기
int[] a = {45,78,54,48,6};
// 내가 한 방법!
int num1 = a[0];
for(int i=0; i<a.length; i++) {
	if(i == a.length-1) {
		a[i] = num1;
	}else {
		a[i] = a[i+1];
	}
}
  • 변수를 하나 만들어 a의 0번째 인덱스 값을 저장해둔다.
  • for문이 i가 a 배열의 크기보다 작은 만큼 돌아간다.
  • for문을 마지막으로 돌릴 때 a 배열의 [i]번 인덱스에 변수에 저장해둔 값을 대입한다.
  • 그렇지 않을 경우, a 배열의 i번째 인덱스에 i+1번째 인덱스 값을 대입한다.
// 선생님이 하신 방법 1
int temp = 0;
for(int i=0; i<a.length; i++) {
	if(i==0) {
		temp = a[i];
	}else{
		a[i-1] = a[i];
		if(i == a.length-1) {
			a[i] = temp;
		}
	}	
}
  • 변수를 하나 만들어둔다.
  • for문이 i가 a 배열의 크기보다 작은 만큼 돌아간다.
  • i가 0일때, 만들어둔 변수에 a의 i번 인덱스 값을 대입한다.
  • 그렇지 않을때, a의 i-1번 인덱스에 i번 인덱스를 저장한다.
    • 만약 i가 a 배열의 크기보다 1 작다면, a의 i번 인덱스에 변수 값을 대입한다.
// 선생님이 하신 방법 2
for(int i=1; i<a.length; i++) {
	int temp = a[i];
	a[i] = a[i-1];
	a[i-1] = temp;
}
  • for문이 i가 a 배열의 크기보다 작은 만큼 돌아간다.
  • 변수 하나를 지정하면서 a의 i번 인덱스 값으로 초기화한다.
  • a의 i번 인덱스에는 a의 i-1번 인덱스 값을 대입한다.
  • a의 i-1번 인덱스에는 변수의 값을 대입한다.

 

 

2. 예제_sign

 2-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
    콘솔창에서 입력받아올 수 있다.

 

 2-2) 변수 선언

String[] name = new String[10];	// 이름
String[] id = new String[10];	// 아이디
String[] pw = new String[10];	// 비밀번호
String[] date = new String[10];	// 회원가입 날짜
int cnt = 0;
int loginIndex = -1;
  • loginIndex: 의미없는 값 -1 / 인덱스 값을 담아야 하는데 인덱스는 0부터 시작하기 때문에

 

 2-3) 기본 틀

while(true) {
	System.out.println("========= 홈페이지 ==========");
	if(loginIndex == -1) {
		System.out.print("1.회원가입 2.로그인 3.회원목록 0.종료\n메뉴선택> ");
	}else {
		System.out.printf("1.정보수정 2.로그아웃 3.내정보(%s님) 0.종료\n메뉴선택> ",name[loginIndex]);
	}
	
	int menu = sc.nextInt();
	
	if(menu == 1) {
		if(loginIndex == -1) { // 회원가입

				}else { //정보수정
                
				}
			}else if(menu == 2) { // 로그인
				if(loginIndex == -1) {

					}
				}else { //로그아웃

				}
			}else if(menu == 3) { // 회원목록
				if(loginIndex == -1) {

					}
				}else { //내정보
				}
			}else if(menu == 0) { // 종료
				break;
			}
			
			System.out.println();
		}
		System.out.println("프로그램 종료");
  • 메뉴는 0부터 3까지 있다.
    • 로그인 시 메뉴가 바뀐다.
  • 0은 종료이기 때문에 break;를 넣어 while문을 나간다.

 

 2-4) 메뉴 선택에서 1을 입력 

  • 로그인 상태가 아닐 때, 회원가입
System.out.println("=====> 회원 가입");
System.out.print("회원가입 할 이름을 입력해주세요.\n이름 입력> ");	
name[cnt] = sc.next();
System.out.print("회원가입 할 아이디를 입력해주세요.\n아이디 입력> ");
id[cnt] = sc.next();
System.out.print("회원가입 할 비밀번호를 입력해주세요.\n비밀번호 입력> ");
pw[cnt] = sc.next();
String now = dtf.format(LocalDateTime.now());
date[cnt] = now;
System.out.println("\n"+name[cnt]+"님 회원가입을 축하드립니다.");
cnt++;
  • 이름, 아이디, 비밀번호를 각각 name, id, pw의 cnt번 인덱스에 넣고, 저장한 시각을 String now를 통해 date의 cnt번 인덱스에 저장한다.
  • 저장이 완료되면 cnt를 1씩 추가한다.

 

  • 로그인 상태일 때, 정보수정
System.out.print("1.아이디 변경 2.비밀번호 변경\n메뉴 선택> ");
int menu2 = sc.nextInt();
if(menu2 == 1) {
	System.out.println("수정할 아이디를 입력해주세요.");
	System.out.print("수정할 아이디> ");
	id[loginIndex] = sc.next();
}else if(menu2 == 2) {
	System.out.println("수정할 비밀번호를 입력해주세요.");
	System.out.print("수정할 비밀번호> ");
	pw[loginIndex] = sc.next();
}
  • 아이디를 변경할건지, 비밀번호를 변경할건지 메뉴를 선택받는다.
    • 1일 경우, id 배열의 loginIndex번 인덱스의 아이디를 입력받은 값으로 대입한다.
    • 2일 경우, id 배열의 loginIndex번 인덱스의 비밀번호를 입력받은 값으로 대입한다.

 

 2-5) 메뉴 선택에서 2을 입력

  • 로그인 상태가 아닐 때, 로그인
System.out.println("=====> 로그인");
System.out.print("아이디 입력> ");
String inId = sc.next();
System.out.print("비밀번호 입력> ");
String inPw = sc.next();
boolean find = false;				// 기억할 것!
for(int i=0; i<cnt; i++) {
	if(inId.equals(id[i]) && inPw.equals(pw[i])) {
		System.out.println("로그인 성공!");
		loginIndex = i;
		find = true;
		break;
	}
}
if(!find) {
	System.out.println("로그인 실패..");
}
  • 아이디와 비밀번호를 각각 inId, inPw에 입력받는다.
  • boolean 타입을 이용해 false를 지정해둔다.
  • for문이 i가 cnt보다 작을 동안에 돌아간다.
    • 만약 inId와 inPw가 id와 pw의 i번 값과 같다면, 로그인 성공! 을 출력한다.
    • loginIndex에 i 값을 대입한다.
    • find는 true를 대입한다.
    • break를 걸어서 for문을 빠져나간다.
  • !find

 

  • 로그인 상태일 때, 로그아웃
System.out.println("로그아웃이 성공적으로 완료됐습니다.");
loginIndex = -1;
  • 로그아웃이 완료됐다는 말을 출력한다.
  • loginIndex에 -1를 대입한다.

 

 2-6) 메뉴 선택에서 3을 입력

  • 로그인 상태가 아닐 때, 회원목록
System.out.println("=====> 회원 목록");
System.out.println("이름\t아이디\t비밀번호\t가입일\n===================================");
for(int i=0; i<cnt; i++) {
	System.out.printf("%s\t%s\t%s\t%s\n",
			name[i], id[i], pw[i], date[i]);
}
  • 이름, 아이디, 비밀번호, 가입일 순으로 출력한다.

 

  • 로그인 상태일 때, 내정보
System.out.println("=====> 회원 정보");
System.out.println("이름\t아이디\t비밀번호\t가입일\n===================================");
System.out.printf("%s\t%s\t%s\t%s\n",
		name[loginIndex], id[loginIndex], pw[loginIndex], date[loginIndex]);
  • name, id, pw, date의 loginIndex번 인덱스 값만 출력한다.

 


 

질문한 내용이나 어려웠던 점 메모

1. 2-5) boolean을 이용한 코드

boolean find = false;
for(int i=0; i<cnt; i++) {
	if(inId.equals(id[i]) && inPw.equals(pw[i])) {
		System.out.println("로그인 성공!");
		loginIndex = i;
		find = true;
		break;
	}
}
if(!find) {
	System.out.println("로그인 실패..");
}
  • !find 다시 물어볼것
  • 내가 했던 방법은 마지막 반복일 때 아이디와 비밀번호가 일치하지 않다면 로그인 실패를 띄우게 하는 방법이었는데, 오늘 다시 해보니 1, 3번째는 되는데 2번째 아이디와 비밀번호로 로그인 시도 시 맞게 했는데도 로그인 실패가 떴다. 내 계산대로라면 되어야 할 텐데 안 되어서 해결은 나중에 하더라도 이 방법을 외우는 것이 나을 것 같다. 이해가 어렵다면 일단 이해하기 전에 외우기!

 


 

전체 피드백

 

 


728x90
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
202230920
1 ··· 15 16 17 18 19 20 21 ··· 45