나의 수업일지

인천 일보 아카데미 13일차 do_while / try_catch_finally / 다형성

2023. 3. 12. 22:16
  • 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
'나의 수업일지' 카테고리의 다른 글
  • 인천 일보 아카데미 14일차 git_github ? -2
  • 인천 일보 아카데미 14일차 git_github ?
  • 숙제)아이디 중복 체크 저장용
  • 인천 일보 아카데미 12일차_2 만들며 익히기 (반복학습)
GUPING
GUPING
안녕하세요 개발자를 꿈꾸는 GUPING 입니다
GUPING
개발자를 꿈꾸는 GUPING
GUPING
전체
오늘
어제
  • 분류 전체보기 (89)
    • 나의 수업일지 (88)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Paging
  • PAGE
  • 개힘드렁
  • 페이징
  • 수정
  • pagingAjax
  • 버튼 이벤트 변경
  • 로그인게시판
  • 파일이름가져오기
  • 다중프리뷰
  • 버튼2가지이벤트
  • 로그인form
  • 여러사진프리뷰
  • 네이버
  • 틀만들기
  • realative
  • 삭제
  • 파일이름(다중)
  • 버튼 이벤트 함수 변경
  • 로그인 경고문
  • 검색
  • naver
  • Ajax
  • 지식인
  • 파일 이름 가져오기
  • 페이징Controller
  • 검색결과페이징
  • 업로드파일이름출력
  • 답변 채택
  • 클래스 이름 변경

최근 댓글

최근 글

hELLO · Designed By 정상우.
GUPING
인천 일보 아카데미 13일차 do_while / try_catch_finally / 다형성
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.