- do_while을 사용해보기
> do , while 사용
> do를 이용한 반복문 사용의 예시입니다
> 메소드에서 사용되었다는 점을 참고해주세요!
public static char genderCheak() { > 사용자의 성별 선택에 대한 메소드 입니다
do {
System.out.println("성별 (1.남자 2.여자)>");
String gender = sc.next();
if(gender.equals("1")) {
return 'M';
}else if(gender.equals("2")) {
return 'F';
}else {
System.out.println("잘못된 성별입니다");
}
}while(true);
}
> do , while은 실행문의 조건이 false가 될때까지 반복합니다
> 하지만 이번 예시에서는 메소드에서 사용되었고
> 메소드는 return을 만나면 무조건 빠져나가기 때문에
> 사용자가 성별 선택지인 1번과 2번이 아닌 다른 선택지를 고르는 경우
> while에 조건을 두지 않고 ture를 넣어 무한히 반복하게 하였습니다
> 이번 예시로 do , while을 사용하는 방법을 알아보는 시간이었습니다
- try_catch_finally를 사용해보기
> try , catch , finally에 대한 사용 예시입니다
> 사용 양식과 사용을 알여보는 시간이었습니다
> 트라이캐치 사용 양식
try {
> 에러(예외)가 발생할 가능성이 있는 소스코드를 작성하는 곳
}catch(Exception e) {
> 에러(예외)가 발생하면 대체할 소스코드를 작성하는 곳
}
try {
int[] array = new int[5];
System.out.println(array[5]);
}catch(ArithmeticException a) {
> 캐치는 여러개 사용 가능하다
}catch(Exception e) {
> ()안에는 자리에 대비할 오류코드를 넣어 캐치로 해당 오류의 대체 소스를 출력하게 할 수 있다
System.out.println("인덱스 초과");
}finally {
> finally는 무조건 실행됨
System.out.println("무조건 실행");
}
System.out.println("프로그램 끝");
}
}
> 쉽게말하면 try와 catch는 에러가 발생할 수 있는 위험이 있는 소스코드를 try에 넣어두고
> 사용자가 실행할경우 오류가 발생되면 catch하여 대체할 수 있는 소스코드를 실행하게 하는 에러를 잡는 문법입니다
> finally는 try와 catch에 상관없이 마지막에 꼭 실행되는 실행문입니다
> 하지만 finally의 경우 독립적으로는 사용 불가능하고 try , catch와 사용가능합니다
- 다형성을 알아보자
> 다형성의 사용법과 사용예시를 알아봤습니다
> 수업의 남은 시간이 부족했기 때문에 약식으로만 알아두고 넘어갔습니다
Animal a = new Animal();
Animal ab = new Dog(); > 다형성
> 부모 클래스를 자식의 생성자로 생성하는게 다형성
> 특이점은 자식객체에서 오버라이딩 된 것만 자식메소드를 사용가능하다
a = new Dog();
> 필드에도 상속받는 객체를 넣을 수 있다
}
}
> Animal을 상속자받아 cry를 오버라이딩
class Animal{
public void eat() {
System.out.println("먹다");
}
public void cry() {
System.out.println("울다");
}
}
class Dog extends Animal{
public void cry() {
System.out.println("멍멍");
}
}
class Cat extends Animal{
public void cry() {
System.out.println("야옹");
}
}
> 이해한 내용을 작성해보겠습니다
> 다형성은 부모 클래스를 상속받아은 클래스들이 부모 클래스의 메소드를 오버라이딩하여
> 기능을 추가했을 경우 , 부모클래스에서도 다형성을 이용하여 그 기능을 사용 가능합니다
> 하지만 부모클래스의 메소드를 오버라이딩 한경우에만 가져와 사용이 가능합니다
> 그외에 자식 클래스에서 새로 만들어진 메소드의 경우 오버라이딩 하지 않는 새로우 메소드이기 때문에
> 사용이 불가능합니다
> 아직까지는 다형성을 어떤 경우에 사용하는지 잘 모르겠습니다
- 만들어보기_ClientMain
> 배운 내용을 반복적으로 사용하며 익히기 위해 만들어보는 시간이었습니다
> 선생님과 함께 만들었기 때문에 기능이 아주 매끄럽게 잘 실행됩니다
> 저장용으로 나중에 읽어보면 상당히 도움이 될 것같아 저장합니다
package day13;
import java.util.Scanner;
public class ClientMain {
public static void main(String[] args) {
ClientService service = ClientService.getInstance();
Scanner sc = new Scanner(System.in);
boolean loginOk = false;
while (true) {
System.out.println("====카카오뱅크====");
if (loginOk) {
System.out.println("1.입출금조회 2.입금 3.출금 4.계좌이체 5.비밀번호수정 6.회원탈퇴 7.로그아웃 0.종료");
} else {
System.out.println("1.회원가입 2.로그인 3.리스트 0.종료");
}
int menu = sc.nextInt();
if (menu == 1) {
if (loginOk) {
service.findById();
} else {
service.save();
}
} else if (menu == 2) {
if (loginOk) {
service.deposit();
} else {
loginOk = service.loginCheak();
}
} else if (menu == 3) {
if (loginOk) {
service.withdraw();
} else {
service.findAll();
}
} else if (menu == 4 && loginOk) {
service.transfer();
} else if (menu == 5 && loginOk) {
service.update();
} else if (menu == 6 && loginOk) {
loginOk = service.delete();
} else if (menu == 7 && loginOk) {
service.logout();
loginOk = false;
} else if (menu == 0 && loginOk) {
break;
} else {
System.out.println("다시입력");
}
System.out.println();
}
System.out.println("프로그램 종료");
}
}
- 만들어보기_ClientService
package day13;
import java.util.List;
import java.util.Scanner;
public class ClientService {
private Scanner sc = new Scanner(System.in);
// 싱글톤패턴
ClientRepository repository = ClientRepository.getInstance();
private static ClientService service = new ClientService();
> 싱글톤패턴 - ClientService의 경우 여러객체가 필요하지 않기 때문에
> 사용방법을 익힐 겸 싱글톤으로 만들었습니다
private ClientService() {}
public static ClientService getInstance() {
return service;
}
// 싱글톤패턴
private String loginId = null; < 세션이 따로 없기 때문에
private String loginPw = null; < 사용자의 로그인 id와 pw를 저장하기 위해 만든 필드
public void save() { < 회원 가입 정보를 받아 가공하는 메소드
ClientDTO clientDTO = new ClientDTO();
System.out.print("id >");
clientDTO.setId(sc.next());
System.out.print("password >");
clientDTO.setPassword(sc.next());
System.out.print("이름 >");
clientDTO.setName(sc.next());
if (repository.save(clientDTO)) {
System.out.println("회원가입 완료");
} else {
System.out.println("회원가입 실패");
}
}
public boolean loginCheak() { < 로그인 id와 pw를 받아 가공하는 메소드
System.out.print("id >");
String id = sc.next();
System.out.print("pw >");
String pw = sc.next();
if(repository.loginCheak(id , pw)) {
System.out.println("로그인 성공");
loginId = id;
loginPw = pw;
return true;
}else {
System.out.println("로그인 실패");
return false;
}
}
public void findAll() { < repository에서 리스트를 가져오는 메소드
List<ClientDTO> cList = repository.findAll();
System.out.println("계좌번호\t\t아이디\t비밀번호\t예금주\t잔액\t가입일");
System.out.println("----------------------------------------------------");
for(ClientDTO c : cList) {
System.out.println(c.toString());
}
}
public void logout() { < 로그아웃 메소드 로그인 정보가 저장된 필드를 null로 초기화
loginId = null;
loginPw = null;
System.out.println("로그아웃");
}
public boolean delete() { < 사용자의 계정 정보를 삭제하는 메소드 삭제할 유저의 정보를 받아 가공후 전달
if(repository.delete(loginId , loginPw)) {
System.out.println("삭제 성공");
return false;
}else {
System.out.println("삭제 실패");
return true;
}
}
public void update() { < 수정메소드 사용자를 확인하고 맞다면 수정 정보를 받아 가공하는 메소드
System.out.print("비밀번호 확인 >");
String passowrd = sc.next();
if(loginPw.equals(passowrd)) {
System.out.print("수정할 비밀번호 >");
String updatePassword = sc.next();
if(repository.update(loginId , loginPw ,updatePassword)) {
loginPw = updatePassword;
System.out.println("업데이트 성공");
}else {
System.out.println("업데이트 실패");
}
}else {
System.out.println("세션 만료");
}
}
public void deposit() { < 입금 정보를 받아 가공하는 메소드
String account = repository.getAccount(loginId , loginPw);
if(account == null) {
System.out.println("이걸본 당신 최고야");
}else {
System.out.print("입금 금액 >");
long money = sc.nextLong();
if(repository.deposit(account,money)) {
System.out.println("입금 성공");
}else {
System.out.println("입금 실패");
}
}
}
public void findById() { < 입출금 받아 내역을 repository에서 전달받아 출력하는 메소드
ClientDTO clientDTO = repository.findById(loginId , loginPw);
if(clientDTO == null) {
System.out.println("이걸본 당신 최고야");
}else {
System.out.println("----------------------------▼사용자정보▼-----------------------------");
System.out.println("계좌번호\t\t아이디\t비밀번호\t예금주\t잔액\t가입일");
System.out.println("------------------------------------------------------------------");
System.out.println(clientDTO.toString());
List<BreakdownDTO> bList = repository.breakList(clientDTO.getAccount());
if(bList.size()==0) {
System.out.println("----------------------------▼입출금내역▼-----------------------------");
System.out.println("입출금 내역이 없습니다");
}else {
System.out.println("----------------------------▼입출금내역▼-----------------------------");
System.out.println("계좌번호\t\t거래내역\t거래액\t잔액\t가입일");
for(BreakdownDTO b : bList) {
System.out.println(b.toString());
}
}
System.out.println("-----------------------------------------------------------------");
}
}
public void withdraw() { < 출금 정보를 받아 가공하여 repository에 전달하는 메소드
String Account = repository.getAccount(loginId, loginPw);
if(Account == null) {
System.out.println("이걸본 당신 최고야");
}else {
System.out.print("출금 금액 >");
long money = sc.nextLong();
if(repository.withdraw(Account,money)) {
System.out.println(money+"원 출금 완료");
}else {
System.out.println("잔액 부족");
}
}
}
public void transfer() { < 계좌이체 정보를 받아 가공하는 메소드
String Account = repository.getAccount(loginId, loginPw);
if(Account == null) {
System.out.println("로그인 오류");
return;
}
System.out.println("이체받는 계좌 >");
String transferAccount = sc.next();
System.out.println("이체받는 금액 >");
long transferMoney = sc.nextLong();
if(repository.transferCheck(transferAccount)) {
if(repository.withdraw(Account, transferMoney)) {
if(repository.deposit(transferAccount, transferMoney)) {
System.out.println("이체 완료");
}
}else {
System.out.println("출금계좌 잔액 부족");
}
}else {
System.out.println("이체 계좌 확인");
}
}
}
- 만들어보기_ClientRepository
package day13;
import java.util.ArrayList;
import java.util.List;
public class ClientRepository {
> 싱글톤패턴 - ClientRepository 또한 여러객체가 필요하지 않기 때문에
> 사용방법을 익힐 겸 싱글톤으로 만들었습니다
List<ClientDTO> cList = new ArrayList<>();
List<BreakdownDTO> bList = new ArrayList<>();
private static ClientRepository repository = new ClientRepository();
private ClientRepository() {
}
public static ClientRepository getInstance() {
return repository;
}
> 싱글톤 패턴
public boolean save(ClientDTO clientDTO) {
return cList.add(clientDTO);
}
> ClientService에서 입력받아 가공한 회원가입 정보를
> clist에 저장하는 메소드
public boolean loginCheak(String id, String pw) {
for (ClientDTO c : cList) {
if (c.getId().equals(id) && c.getPassword().equals(pw)) {
return true;
}
}
return false;
}
> ClientService에서 입력받은 로그인 정보를 매개변수로 받아
> 저장된 리스트에 있다면 로그인
> 없다면 로그인 실패
public List<ClientDTO> findAll() {
return cList;
}
> 회원 리스트를 ClientService에 넘겨주는 메소드
public boolean delete(String loginId, String loginPw) {
for (ClientDTO c : cList) {
if (c.getId().equals(loginId) && c.getPassword().equals(loginPw)) {
cList.remove(c);
return true;
}
}
return false;
}
> ClientService에 저장된 사용자의 로그인 정보를 확인하고
> 로그인 사용자의 정보를 cList에서 삭제함
public boolean update(String loginId, String loginPw, String updatePassword) {
for (ClientDTO c : cList) {
if (c.getId().equals(loginId) && c.getPassword().equals(loginPw)) {
c.setPassword(updatePassword);
return true;
}
}
return false;
}
> ClientService에 저장된 사용자의 로그인 정보를 매개변수로 확인하고
> 사용자가 수정하기 원하는 비밀번호 또한 매개변수로 사용
> 로그인 정보가 맞다면 수정하고 아니라면
> 오류이기 때문에 해당하는 출력문을 ClientService에서 실행
public String getAccount(String loginId, String loginPw) {
for (ClientDTO c : cList) {
if (c.getId().equals(loginId) && c.getPassword().equals(loginPw)) {
return c.getAccount();
}
}
return null;
}
> 사용자의 로그인 정보를 매개로 list에서 사용자의 계좌를 찾아 전달해주는 메소드
public boolean deposit(String Account, long money) {
for (ClientDTO c : cList) {
if (c.getAccount().equals(Account)) {
c.setBalance(c.getBalance() + money);
BreakdownDTO breakdownDTO = new BreakdownDTO();
breakdownDTO.setAccount(Account);
breakdownDTO.setDivision("입금");
breakdownDTO.setDealMoney(money);
breakdownDTO.setTotalMoney(c.getBalance());
bList.add(breakdownDTO); < 입금이 성공하면 입출금 내역을 위해 blist에 저장
return true;
}
}
return false;
}
> getAccount를 이용해 찾은 계좌를 매개로 계좌가 맞다면 사용자가 입금할 돈을 입금한다
> 계좌가 맞지 않다면 해당 문구를 프린트
public boolean withdraw(String Account, long money) {
for (ClientDTO c : cList) {
if (c.getAccount().equals(Account)) {
if (c.getBalance() >= money) {
c.setBalance(c.getBalance() - money);
BreakdownDTO breakdownDTO = new BreakdownDTO();
breakdownDTO.setAccount(Account);
breakdownDTO.setDivision("출금");
breakdownDTO.setDealMoney(money);
breakdownDTO.setTotalMoney(c.getBalance());
bList.add(breakdownDTO); < 출금이 성공하면 입출금 내역을 위해 bList에 저장
return true;
}else {
return false;
}
}
}
return false;
}
> getAccount를 이용하여 찾은 계좌를 매개로 리스트에 저장된 정보를 찾고
> 해당 계좌의 잔액이 출금하는 잔액보다 많거나 같으면 출금이 가능하게 만듬
public ClientDTO findById(String loginId, String loginPw) {
for (ClientDTO c : cList) {
if (c.getId().equals(loginId) && c.getPassword().equals(loginPw)) {
return c;
}
}
return null;
}
> 사용자의 로그인 정보를 매개로 리스트에서 사용자의 정보를 찾아 전달해주는 메소드
public List<BreakdownDTO> breakList(String Account) {
List<BreakdownDTO> list = new ArrayList<>();
for (BreakdownDTO b : bList) {
if (b.getAccount().equals(Account)) {
list.add(b);
}
}
return list;
}
> 사용자의 입출금 내역을 전달하는 메소드
public boolean transferCheck(String Account) {
for(ClientDTO c : cList) {
if(c.getAccount().equals(Account)) {
return true;
}
}
return false;
}
}
> 이체 받을 계좌의 정보가 맞는지 확인하는 메소드
- 만들어보기_ClientDTO
> DTO는 정말 중요하기 때문에 어떻게 설계한건지 한번 꼭 읽어보자
package day13;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
public class ClientDTO {
private static int firstNumber = 100;
private static int number = 1000;
private final static DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yy/MM/dd hh:mm:ss");
private String account;
private String id;
private String password;
private String name;
private long balance;
private String joinDate;
public ClientDTO() {
if(number+1 == 1011) {
firstNumber++;
number = 1000;
}
this.account = firstNumber+"-"+number++;
this.joinDate = DTF.format(LocalDateTime.now());
}
public String getAccount() {
return account;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getBalance() {
return balance;
}
public void setBalance(long balance) {
this.balance = balance;
}
public String toString() {
String str = account+"\t"+id+"\t"+password+"\t"+name+"\t"+balance+"\t"+joinDate;
return str;
}
}
- 만들어보기_BreakdownDTO
> DTO는 정말 중요하기 때문에 어떻게 설계한건지 한번 꼭 읽어보자
package day13;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class BreakdownDTO {
private final static DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yy/MM/dd hh:mm:ss");
private String account;
private String division;
private long dealMoney;
private long totalMoney;
private String dealDate;
public BreakdownDTO() {
this.dealDate = DTF.format(LocalDateTime.now());
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getDivision() {
return division;
}
public void setDivision(String division) {
this.division = division;
}
public long getDealMoney() {
return dealMoney;
}
public void setDealMoney(long dealMoney) {
this.dealMoney = dealMoney;
}
public long getTotalMoney() {
return totalMoney;
}
public void setTotalMoney(long totalMoney) {
this.totalMoney = totalMoney;
}
public String toString() {
String str = account +"\t"+ division +"\t"+ dealMoney +"\t"+ totalMoney +"\t"+ dealDate;
return str;
}
}
'나의 수업일지' 카테고리의 다른 글
인천 일보 아카데미 14일차 git_github ? -2 (0) | 2023.03.13 |
---|---|
인천 일보 아카데미 14일차 git_github ? (0) | 2023.03.13 |
숙제)아이디 중복 체크 저장용 (0) | 2023.03.12 |
인천 일보 아카데미 12일차_2 만들며 익히기 (반복학습) (0) | 2023.03.10 |
인천 일보 아카데미 12일차_1 만들며 익히기 (반복학습) (0) | 2023.03.09 |