프로그래밍/수업일지 (39)

728x90

 

수업내용 정리 (Java)

 

1. class

  • 객체를 만들기 위한 설계도
  • 구성요소: 필드(인스턴스 변수, 멤버 변수), 생성자, 메서드

 

 1-1) 필드(인스턴스 변수, 멤버 변수)

String name = "자동차";
String tire;
String color;
int speed;
  • 객체(변수)의 값을 저장할 공간
  • 생성할 때, 값을 집어넣어도 무관하다.

 

 1-2) 생성자

// 기본 틀
public Car() {

}
// 매개변수를 사용했을때
public Car(String name, String tire, String color, int speed) {
	this.name = name;
	this.tire = tire;
	this.color = color+"색";
	this.speed = speed;
}
  • 리턴 타입이 없다.
  • 생성자 명은 class명과 동일하다.
  • 만들지 않아도 기본적으로 자동 사용된다.
  • 매개변수를 사용하는 이유: 객체를 생성함과 동시에 필드값을 세팅하기 위해 사용한다.
  • this. <- 필드에 선언한 이름과 동일한 변수명을 이용했을때, 필드명에 붙여준다.
  • 안에 실행문구가 없으면 출력 시 null, null, null, 0이 뜬다.

 

 1-3) 메서드

// 기본 틀
public (리턴타입) (이름)(){

}
public void run() {
	speed++;
}
public void run1(int a) {
	speed+=a;
}
public void print(){
	System.out.printf("%s\t%s\t%s\t%d\n",name,tire,color,speed);
}
  • 실행문
  • run의 경우, 사용할 때마다 1씩 증가하는 실행문
  • run1의 경우, 사용할 때 입력한 숫자만큼 증가하는 실행문
  • print를 메서드에 적음으로서 car1.print만 적어도 객체 안에 담긴 값을 출력할 수 있다.

 

 1-4) 객체 생성

// 생성자를 기본틀로 사용했을 경우
Car car1 = new Car();

car1.name = "그랜저"; // car1의 이름에 ""를 대입
car1.tire = "한국";
car1.color = "검정";
car1.speed = 9;
car1.run();
// 생성자에 매개변수를 사용했을 경우
Car car1 = new Car("그랜저","한국","검정",9);
  • Scanner를 사용하듯 생성한다.
  • 매개변수를 사용하지 않았을 경우, 하나하나 필드값을 설정해주어야 한다.
  • 매개변수를 사용했을 경우, 생성할 때 필드값을 설정할 수 있다.

 


 

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

 

1. 메서드

 완전히 이해하는 데에 조금 오래 걸릴 것 같다. 아직은 응용할 수 없는 단계다.

 


 

전체 피드백

 비가 와서 그런지 축 쳐져서 연이틀이나 수업에 집중하지 못했다. 건강&수면관리 열심히 해야할 것 같다..

 


728x90
728x90

 

수업내용 정리 (Java)

 

1. 예제_Account

---------- import, 변수 선언

import java.util.Scanner;
Scanner sc = new Scanner(System.in);
String[] name = new String[10];		// 이름
String[] id = new String[10];		// 아이디
String[] pw = new String[10];		// 비밀번호
String[] account = new String[10];	// 계좌번호
int[] balance = new int[10];		// 잔액
int cnt = 0;				// 회원가입한 사람 수
int loginIndex = -1;			// 상황에 따라 메뉴를 다르게 하기 위한 변수

 

 

---------- while문 사용

  • 메인 (메뉴 선택)
System.out.println("==========  은행  ==========");
	if(loginIndex == -1) {
		System.out.println("1.회원가입 2.로그인 3.회원목록 0.종료");
	}else {
		System.out.println("1.회원정보수정 2.로그아웃("+name[loginIndex]+"님) 3.입금 4.출금 5.계좌이체 0.종료");
	}
    
	System.out.printf("메뉴 선택> ");
	int menu = sc.nextInt();
  • 상황에 따라 메뉴를 다르게 출력하기 위해 if문을 이용했다.
  • loginIndex가 -1일때: 아무도 로그인하지 않은 상태
  • 그 외: 로그인 상태

 

  • 메뉴 1번 선택 시
if(loginIndex == -1) {
	// 이름, 아이디, 비밀번호, 계좌번호, 초기잔액 입력 회원가입
	System.out.println("\t회원가입==============");
	System.out.printf("회원가입 할 이름> ");
	name[cnt] = sc.next();
	System.out.printf("회원가입 할 아이디> ");
	id[cnt] = sc.next();
	System.out.printf("회원가입 할 비밀번호> ");
	pw[cnt] = sc.next();
	System.out.printf("회원가입 할 계좌번호> ");
	account[cnt] = sc.next();
	System.out.printf("계좌 초기 잔액> ");
	balance[cnt] = sc.nextInt();
	
    System.out.println(name[cnt]+"님, 회원가입이 완료되었습니다.");
	cnt++;
}
  • loginIndex가 -1일때: 회원가입

 - 배열 name, id, pw, account, balance를 입력받아 각 cnt번째에 저장한다.

 - 회원가입이 완료되면 cnt를 1씩 증가한다.

 

else {
	// 회원정보수정 /비밀번호, 계좌번호 수정
	System.out.println("\t정보수정==============");
	System.out.println("1.아이디 2.비밀번호 3.계좌번호");
	System.out.print("메뉴 선택> ");
	menu = sc.nextInt();
	if(menu == 1) {
		System.out.print("변경할 아이디 입력> ");
		id[loginIndex] = sc.next();
		System.out.println("아이디 변경이 성공적으로 완료되었습니다.");
	}else if(menu == 2) {
		System.out.print("변경할 비밀번호 입력> ");
		pw[loginIndex] = sc.next();
		System.out.println("비밀번호 변경이 성공적으로 완료되었습니다.");
	}else if(menu == 3) {
		System.out.print("변경할 계좌번호 입력> ");
		account[loginIndex] = sc.next();
		System.out.println("계좌번호 변경이 성공적으로 완료되었습니다.");
	}else {
		System.out.println("존재하는 메뉴를 선택해주세요.");
	}
}
  • loginIndex가 -1이 아닐때: 회원정보 수정

 - 변경할 정보를 입력받아 해당하는 배열의 loginIndex번째 인덱스에 저장한다.

 

  • 메뉴 2번 선택 시
if(loginIndex == -1) {
	System.out.println("\t로그인===============");
	// 아이디, 비밀번호 입력받아서 로그인 기능 수행
	System.out.print("아이디 입력> ");
	String loginId = sc.next();
	System.out.print("비밀번호 입력> ");
	String loginPw = sc.next();
	boolean find = false;
	for(int i=0; i<cnt; i++) {
		if(loginId.equals(id[i]) && loginPw.equals(pw[i])) {
		System.out.println("로그인 성공!");
		find = true;
		loginIndex = i;
		break;
		}
	}
	if(!find) {
		System.out.println("로그인 실패");
	}
}
  • loginIndex가 -1일때: 로그인

 - i가 cnt보다 작은 동안에 loginId와 loginPw가 id와 pw 배열에 있는지 확인하고, 있으면 find를 true로 바꾸고 liginInex는 i 값을 대입한다.

 - break를 넣어 for문을 나가준다.

 - 만약 for문을 나왔는데 find가 true가 아니라면 로그인 실패 문구를 출력한다.

 

else {
	// 로그아웃
	loginIndex = -1;
	System.out.println("성공적으로 로그아웃되셨습니다.");
}
  • loginIndex가 -1이 아닐때: 로그아웃

 - loginIndex에 -1을 대입한다.

 

  • 메뉴 3번 선택 시
if(loginIndex == -1) {
	// 회원목록 출력
	System.out.println("\t회원목록==============");
	System.out.println("이름\t아이디\t비밀번호\t계좌번호\t잔액");
	System.out.println("==================================");
	for(int i=0; i<cnt; i++) {
		System.out.printf("%s\t%s\t%s\t%s\t%,d원\n",
				name[i],id[i],pw[i],account[i],balance[i]);
	}
	System.out.println();
}
  • loginIndex가 -1일때: 회원목록

 - 회원가입 한 사람들이 가입 할 때 입력한 정보가 출력된다.

 

else {
	// 입금 /입금금액 받아서 입금
	System.out.println("\t입금================");
	System.out.print("입금할 금액을 입력해주세요.\n입금 금액> ");
	int inMoney = sc.nextInt();
	balance[loginIndex] += inMoney;
	System.out.println("성공적으로 입금이 완료되었습니다.");
	System.out.printf("입금 금액: %,d원\n입금 후 잔액: %,d원",
			inMoney,balance[loginIndex]);
}
System.out.println();
  • loginIndex가 -1이 아닐때: 입금

 - 로그인 되어있는 아이디의 계좌에 돈을 입금한다.

 - 입금할 금액을 입력받으면 입금 금액과 입금 후 잔액을 출력한다.

 

  • 메뉴 4번 선택 시
// 출금 /출금금액 받아서 출금(잔액부족 확인)
System.out.println("\t출금================");
System.out.print("출금할 금액을 입력해주세요.\n출금 금액> ");
int outMoney = sc.nextInt();
if(outMoney > balance[loginIndex]) {
	System.out.println("잔액이 부족합니다.");
}else {
	balance[loginIndex] -= outMoney;
	System.out.println("성공적으로 출금이 완료되었습니다.");
	System.out.printf("출금 금액: %,d원\n출금 후 잔액: %,d원",
			outMoney,balance[loginIndex]);
}
System.out.println();
  • loginIndex가 -1이 아닐때: 출금

 - 로그인 되어있는 아이디의 계좌에서 돈을 출금한다.

 - 만약 출금액이 잔액보다 크면, 잔액이 부족하다는 안내를 출력한다.

 - 그렇지 않고 잔액이 출금액보다 크면, 출금 금액과 출금 후 잔액을 출력한다

 

  • 메뉴 5번 선택 시
// 계좌이체 /이체 할 계좌 및 금액 받아서 계좌이체(잔액부족 확인)
System.out.println("\t계좌이체==============");
System.out.print("이체하려는 계좌번호를 입력해주세요\n이체할 계좌번호> ");
String inOutAcc = sc.next();
boolean find = false;
for(int i=0; i<cnt; i++) {
	if(inOutAcc.equals(account[i])) {
		System.out.print(" > 계좌번호가 확인되었습니다.\n이체할 금액을 입력해주세요."
				+ "\n이체할 금액> ");
		int inOutB = sc.nextInt();
		balance[loginIndex] -= inOutB;
		if(balance[loginIndex] >= inOutB) {
			balance[i] += inOutB;
			System.out.println("성공적으로 계좌이체가 완료되었습니다.");
			System.out.printf("이체 금액: %,d원\n이체 후 잔액: %,d원",
					inOutB,balance[loginIndex]);
			System.out.println();
		}else {
			System.out.println("잔액이 부족합니다.");
		}
		find = true;
		break;
	}
}
if(!find) {
	System.out.println("존재하지 않는 계좌번호입니다.");
}
  • loginIndex가 -1이 아닐때: 계좌이체

 - 계좌번호를 확인하고, 계좌번호가 확인되면 이체금을 입력받는다.

 - 만약 잔액이 이체금보다 크면, 이체 금액과 이체 후 잔액을 출력한다.

 - 그렇지 않고 이체금이 잔액보다 크다면, 잔액이 부족하다는 안내를 출력한다.

 - 만약 for문을 나왔는데 find가 true가 아니라면 존재하지 않는 계좌번호라는 문구를 출력한다.

 

  • 종료
break;

 - while문을 종료한다.

 

 

 

 


 

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

 

1. 메뉴 5번 선택 시 (계좌이체)

  •  혼자 힘으로 해결하긴 했으나 자꾸 boolean을 이용해서 코드를 짜는 것보다 else 혹은 else if를 써서 먼저 짜게 되는 것 같다. 처음에 제출할 때 else로 계좌번호가 존재하지 않는다 를 출력해서 두번째 회원가입한 사람이 첫번째 회원가입한 사람한테 계좌이체를 할 때는 괜찮은데 반대로 하려니까 너무 슬프게도 계좌가 존재하지 않는대서 그제서야 for문 밖에 !find를 추가해주었다.

 


 

전체 피드백

  •  오늘은 수업에 전혀 집중하지 못했다. 속이 별로이기도 했는데, 졸리기도 해서 많이 멍때리면서 들었다. 그래도 오늘은 다행히 새로운걸 배우기 보다는 7일차에 게임 만들던 것을 계속 만들어보라고 하셔서 다른 사람들 만드는거 조금 도와주고 다녔다.
  • 이 예제를 하면서 !find는 이해한 것 같아서 다행이다!
  • 오늘 일지가 짧으니 남은 시간은 어제 완성한 게임 조금 더 손봐야겠다!

 


728x90
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
1 ··· 8 9 10 11 12 13