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