과거⚰️

메서드 ATM ||오버로딩 || this.

아무루 2020. 12. 11. 18:13

오버 로딩(over loading)

한 클래스 내에 같은 이름으로 다른 종류의 인자를 받는 메서드를 만드는 것이다.

이름은 같아야하고 매개변수의 순서 타입 개수가 달라야 한다.

오버 라이드와 이름은 비슷하지만 다름 헷갈리지 않게 주의

package Day052;

import java.util.Scanner;

/*
 * # 영수증 출력하기 : 클래스[변수]
 * 1. 햄버거 주문을 받아 영수증을 출력한다.
 * 2. 출력내용은 각 메뉴의 주문 수량과 총 금액 및 잔돈을 표시한다.
 */

class BurgerShop{

    Scanner scan = new Scanner(System.in);

    String name = "";		// 가게 이름
    int[] arPrice   = {    2500,       3800,     1500,  1000};
    String[] arMenu = {"치즈버거", "불고기버거", "감자튀김", "콜      라"};
    int[] arCount = new int[4];
    int total = 0;

    void showMeu() {
        System.out.println("===== " + name + " =====");
        for(int i=0; i<arMenu.length; i++) {
            System.out.println((i+1) + "." + arMenu[i] + ": " + arPrice[i] + "원");
        }
        System.out.println("5.종료하기");
    }

    void select1() { arCount[0] += 1; }
    void select2() { arCount[1] += 1; }
    void select3() { arCount[2] += 1; }
    void select4() { arCount[3] += 1; }

    void getReceipt() {
        System.out.println("===== 영수증 =====");
        for(int i=0; i<arMenu.length; i++) {
            System.out.println((i + 1) + "." + arMenu[i] + ": " + arCount[i] + "개");
            total += arPrice[i] * arCount[i];
        }
        System.out.println("총 금액 : " + total + "원");
    }

    void run() {
        while(true) {
            // 메뉴 출력
            showMeu();

            // 메뉴 선택
            System.out.print("메뉴를 선택하세요 : ");
            int choice = scan.nextInt();

            // 치즈버거
            if(choice == 1) { select1(); }
            // 불고기버거
            else if(choice == 2) { select2(); }
            // 감자튀김
            else if(choice == 3) { select3(); }
            // 콜라
            else if(choice == 4) { select4(); }
            // 종료 및 영수증 출력
            else if(choice == 5) {
                getReceipt();
                break;
            }
        }
    }
}

public class Day05209메서드영수증출력 {
    public static void main(String[] args) {

        BurgerShop moms = new BurgerShop();
        moms.name = "맘츠터치 햄버거";

        moms.run();

    }
}


package Day052;

import java.util.Scanner;

//# ATM

class Bank{

    Scanner scan = new Scanner(System.in);

    String name = "";

    String[] arAcc = {"1111", "2222", "3333", "", ""};
    String[] arPw  = {"1234", "2345", "3456", "", ""};
    int[] arMoney  = {87000, 34000, 17500, 0, 0};

    int count = 3;

    // 로그아웃(-1)
    int loginCheck = 2;			// 3333 로그인 중

    void showMember() {
        for(int i=0; i<count; i++) {
            System.out.println(arAcc[i] + " : " + arPw[i] + " : " + arMoney[i] + "원");
        }
    }

    void showMenu() {
        System.out.print("# 로그인 상태 : ");
        if(loginCheck == -1){
            System.out.println("로그아웃");
        }else {
            System.out.println(arAcc[loginCheck] + "님, 로그인 중...");
        }

        System.out.println("=== " + name + " ===");
        System.out.println("1.회원가입");
        System.out.println("2.회원탈퇴");
        System.out.println("3.로그인");
        System.out.println("4.로그아웃");
        System.out.println("5.입금하기");
        System.out.println("6.이체하기");
    }

    int checkAcc(String myAcc) {

        int check = 1;
        for(int i=0; i<count; i++) {
            if(arAcc[i].equals(myAcc)) {
                check = -1;
            }
        }
        return check;
    }

    int checkPw(int accCheck) {
        System.out.print("비밀번호를 입력하세요 : ");
        String myPw = scan.next();

        int pwCheck = -1;

        if(arPw[accCheck].equals(myPw)) {
            pwCheck = 1;
        }

        return pwCheck;
    }

    int checkAcc() {

        System.out.print("탈퇴할 계좌번호를 입력하세요 : ");
        String myAcc = scan.next();

        int accCheck = -1;
        for(int i=0; i<count; i++) {
            if(arAcc[i].equals(myAcc)) {
                accCheck = i;
            }
        }
        return accCheck;
    }

    void delMember() {

        // 회원탈퇴 제약조건
        if(count == 0) {
            System.out.println("탈퇴할 회원정보가 없습니다.");
            return;
        }

        // 계좌번호 유효성 검사
        int accCheck = checkAcc();

        if(accCheck != -1) {
            // 비밀번호 유효성 검사
            int pwCheck = checkPw(accCheck);
            if(pwCheck == -1) {
                System.out.println("비밀번호를 잘 못 입력했습니다.");
            }else {
                for(int i=accCheck; i<count - 1; i++) {
                    arAcc[i] = arAcc[i + 1];
                    arPw[i] = arPw[i + 1];
                    arMoney[i] = arMoney[i + 1];
                }
                count -= 1;
                System.out.println("탈퇴되었습니다.");
            }
        }else {
            System.out.println("없는 계좌번호 입니다.");
        }
    }

    void joinMember() {

        // 회원가입 회원 수는 5명까지만 허용
        if(count == 5) {
            System.out.println("더이상 가입할 수 없습니다.");
            return;
        }

        // 계좌번호 중복검사
        System.out.print("가입할 계좌번호를 입력하세요 : ");
        String myAcc = scan.next();
        int check = checkAcc(myAcc);

        if(check == -1) {
            System.out.println("계좌번호가 중복됩니다.");
        }else {
            System.out.print("비밀번호를 입력하세요 : ");
            String myPw = scan.next();

            arAcc[count] = myAcc;
            arPw[count] = myPw;
            arMoney[count] = 1000;

            count += 1;
            System.out.println("회원가입을 축하합니다.");
        }
    }

    void login() {

        if(loginCheck != -1) {
            System.out.println("로그아웃 후 진행해주세요.");
            return;
        }
        System.out.print("계좌번호를 입력하세요 : ");
        String myId = scan.next();
        System.out.print("패스워드를 입력하세요 : ");
        String myPw = scan.next();

        // 계좌번호와 패스워드 유효성 검사
        for(int i=0; i<count; i++) {
            if(myId.equals(arAcc[i]) && myPw.equals(arPw[i])) {
                loginCheck = i;
            }
        }

        if(loginCheck == -1) {
            System.out.println("계좌번호와 패스워드를 확인해주세요.");
        }else {
            System.out.println("로그인 성공!");
        }
    }

    void logOut() {
        if(loginCheck == -1) {
            System.out.println("로그인 후 진행해주세요.");
        }else {
            loginCheck = -1;
            System.out.println("로그아웃 되었습니다.");
        }
    }

    void income() {
        System.out.print("입금할 금액을 입력하세요 : ");
        int money = scan.nextInt();

        arMoney[loginCheck] += money;
        System.out.println("입금을 완료하였습니다.");
    }

    void trans() {
        System.out.print("이체할 계좌번호를 입력하세요 : ");
        String transAcc = scan.next();

        // 이체 계좌번호 유효성 검사
        int check = -1;
        for (int i = 0; i < count; i++) {
            if (arAcc[i].equals(transAcc)) {
                check = i;
            }
        }

        if (check == -1) {
            System.out.println("계좌번호를 확인해주세요.");
        } else {
            System.out.print("이체할 금액을 입력하세요 : ");
            int transMoney = scan.nextInt();

            // 이체 금액 유효성 검사
            if (arMoney[loginCheck] >= transMoney) {
                arMoney[loginCheck] -= transMoney;
                arMoney[check] += transMoney;
                System.out.println("이체를 완료하였습니다.");
            } else {
                System.out.println("계좌잔액이 부족합니다.");
            }
        }
    }

    void run() {

        while(true) {
            // 전체 회원정보 출력
            showMember();
            // 메뉴 출력
            showMenu();
            // 메뉴 선택
            System.out.print("메뉴를 선택해주세요 : ");
            int choice = scan.nextInt();
            // 회원가입
            if(choice == 1) { joinMember(); }
            // 회원탈퇴
            else if(choice == 2) { delMember();	}
            // 로그인
            else if(choice == 3) { login(); }
            // 로그아웃
            else if(choice == 4) { logOut(); }
            // 입금
            else if(choice == 5) { income(); }
            // 이체
            else if(choice == 6) { trans(); }
        }
    }
}


public class Day05210메서드ATM {
    public static void main(String[] args) {

        Bank woori = new Bank();
        woori.name = "우리은행";

        woori.run();

    }
}


package Day052;

/*
 * # 메서드 오버로딩(overloading)이란?
 * 메서드를 같은 이름으로 만들어도
 * 전달되는 값이 다르면 서로 다른 메서드로 인식하겠다는 의미
 */

class MethodOverloading{
    int add(int x, int y) {
        return x + y;
    }

    int add(int x, int y, int z) {
        return x + y + z;
    }

    int add(int[] arr) {
        int total = 0;
        for(int i=0; i<arr.length; i++) {
            total += arr[i];
        }
        return total;
    }
}

public class Day05211메서드오버로딩 {
    public static void main(String[] args) {

        MethodOverloading mol = new MethodOverloading();

        int[] arr = {1, 2, 3, 4, 5};

        int r1 = mol.add(10, 3);
        int r2 = mol.add(10, 3, 1);
        int r3 = mol.add(arr);

        System.out.println("r1 = " + r1);
        System.out.println("r2 = " + r2);
        System.out.println("r3 = " + r3);

    }
}


package Day052;

class Test {
    int x;

    void check() {

        // check() 메서드 안의 x변수와 메서드 밖의 x는 서로 다른 x이다.
        int x = 10;

        // 메서드 안의 x변수와 메서드 밖의 x변수를 구분짓는 방법은
        // 메서드 밖의 x변수에 this를 붙여주는 것이다.
        // 본래 메서드 안에서 메서드 밖의 변수들은 this.을 붙여주는 것이 원칙이지만, 생략이 가능하다.
        // 하지만 명확성을 위해 붙여주는 것이 좋다.
        this.x = 100;

        System.out.println("지역변수 x = " + x);
        System.out.println("클래스 영역의 x변수 = " + this.x);
    }
}

public class Day05212this {
    public static void main(String[] args) {


    }
}