Languages/Java

[자바 객체 지향 프로그래밍] 02. 객체 설계하기

Dev다D 2021. 1. 28. 21:34
반응형

생성자 연습

두 클래스에 생성자를 만들어 봅시다.

Person 클래스

Person의 생성자 2개를 만들 것입니다.

(1) 파라미터로 '이름'을 뜻하는 String형 값 pName과 '나이'를 뜻하는 int형 값 pAge를 받고 초기값을 설정합니다. 인스턴스 변수 cashAmount0으로 시작합니다. 단, pAge가 음수면 인스턴스 변수 age12로 설정합니다.

public Person(String pName, int pAge) {
    // 코드를 입력하세요
}

(2) 파라미터로 '이름'을 뜻하는 String형 값 pName, '나이'를 뜻하는 int형 값 pAge, 그리고 '보유 현금'을 뜻하는 int형 값 pCashAmount를 받고 초기값을 설정합니다. (1)번과 마찬가지로 pAge가 음수인 경우에는 age를 12로 설정합니다. pCashAmount가 음수면 인스턴스 변수 cashAmount0으로 설정합니다.

public Person(String pName, int pAge, int pCashAmount) {
    // 코드를 입력하세요
}

BankAccount 클래스

BankAccount의 생성자 3개를 만들 것입니다.

(1) 파라미터로 '잔액'을 뜻하는 int형 값 pBalance를 받습니다. 파라미터로 받은 잔액은 음수가 될 수 없습니다. 음수 입력이 있을 경우 0으로 설정합니다.

public BankAccount(int pBalance) {
    // 코드를 입력하세요
}

(2) 파라미터로 '소유자'를 뜻하는 Person형 값 pOwner를 받습니다. pOwner를 인스턴스 변수 owner에 지정해주고, 잔액은 0으로 시작합니다.

public BankAccount(Person pOwner) {
    // 코드를 입력하세요
}

(3) 파라미터로 '잔액'을 뜻하는 int형 값 pBalance와 '소유자'를 뜻하는 Person형 값 pOwner를 받습니다. 마찬가지로 balanceowner를 설정해주고, 파라미터로 받은 잔액이 음수인 경우에는 balance0으로 설정합니다.

public BankAccount(int pBalance, Person pOwner) {
    // 코드를 입력하세요
}

테스트

Main 클래스의 main 메소드에:

  1. Person의 1번 생성자를 사용해서 인스턴스 p1을 만듭니다. 생성 후 보유 현금은 30000으로 재설정해줍니다.

  2. Person의 2번 생성자를 사용해서 인스턴스 p2를 만듭니다. 보유 현금 초기값은 100000으로 설정해줍니다.

  3. BankAccount의 2번 생성자를 사용해서 인스턴스 a1을 만듭니다. 파라미터로 p1을 넘겨줘서 p1a1을 연결해줍니다. 생성 후 잔액을 100000으로 재설정해줍니다.

  4. BankAccount의 3번 생성자를 사용해서 인스턴스 a2을 만듭니다. 파라미터로 p2을 넘겨줘서 p2a2을 연결해줍니다. 잔액 초기값은 500000입니다.

위의 지시에 따라 프로그램을 수정하여 오류가 나오지 않도록 하고, 테스트 케이스는 유지하여 이전 문제와 같이 아래의 출력값이 나오도록 해야 합니다.

 

> true - from: 문종모, to: 김신의, amount: 200000, balance: 300000

> true - from: 김신의, to: 문종모, amount: 150000, balance: 150000

> true - from: 문종모, to: 김신의, amount: 270000, balance: 180000

> true - from: 김신의, to: 문종모, amount: 130000, balance: 290000


public class BankAccount {
    private int balance;
    private Person owner;

    public BankAccount(int pBalance) {
        if (pBalance < 0) {
            balance = 0;
        } else {
            balance = pBalance;
        }
    }

    public BankAccount(Person pOwner) {
        owner = pOwner;
        balance = 0;
    }

    public BankAccount(int pBalance, Person pOwner) {
        owner = pOwner;
        if (pBalance < 0) {
            balance = 0;
        } else {
            balance = pBalance;
        }
    }

    public void setBalance(int newBalance) {
        if (newBalance >= 0) {
            balance = newBalance;
        }
    }

    public int getBalance() {
        return balance;
    }

    public void setOwner(Person newOwner) {
        owner = newOwner;
    }

    public Person getOwner() {
        return owner;
    }

    boolean deposit(int amount) {
        if (amount < 0 || owner.getCashAmount() < amount) {
            System.out.println("입금 실패입니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
            return false;
        }
        balance += amount;
        owner.setCashAmount(owner.getCashAmount() - amount);
        System.out.println(amount + "원 입금하였습니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
        return true;
    }

    // 파라미터 : 출금할 액수(정수)
    // 리턴 : 성공여부(불린)
    boolean withdraw(int amount) {
        if (amount < 0 || balance < amount) {
            System.out.println("출금 실패입니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
            return false;
        }
        balance -= amount;
        owner.setCashAmount(owner.getCashAmount() + amount);
        System.out.println(amount + "원 출금하였습니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
        return true;
    }

    // 첫 번째 파라미터: 받는 사람 (Person)
    // 두 번째 파라미터: 이체할 금액 (정수)
    // 리턴 : 성공여부 (불린)
    public boolean transfer(Person to, int amount) {
        return transfer(to.getAccount(), amount);
    }

    // 첫 번째 파라미터: 받는 사람의 계정 (BankAccount)
    // 두 번째 파라미터: 이체할 금액 (정수)
    // 리턴 : 성공여부 (불린)
    public boolean transfer(BankAccount to, int amount) {
        boolean success;
        if (amount < 0 || balance < amount) {
            success = false;
        } else {
            balance -= amount;
            to.balance += amount;
            success = true;
        }
        System.out.println(success + " - from: " + owner.getName() + ", to: " + to.owner.getName() + ", amount: " + amount + ", balance: " + balance);
        return success;
    }
}
public class Main {
    public static void main(String[] args) {
        // 사람 1
        Person p1 = new Person("김신의", 28, 30000);
        // 은행 계좌 1
        BankAccount a1 = new BankAccount(p1);
        a1.setBalance(100000);
        p1.setAccount(a1);
        // 사람 2
        Person p2 = new Person("문종모", 25, 100000);
        // 은행 계좌 2
        BankAccount a2 = new BankAccount(500000,p2);
        p2.setAccount(a2);

        // 계좌 이체 테스트
        a2.transfer(a1, 200000);
        a1.transfer(p2, 150000);
        p2.transfer(a1, 270000);
        p1.transfer(p2, 130000);
    }
}
public class Person {
    private String name;
    private int age;
    private int cashAmount;
    private BankAccount account;

    public Person(String pName, int pAge) {
        name = pName;
        if (pAge < 0) {
            age = 12;
        } else {
            age = pAge;
        }
    }

    public Person(String pName, int pAge, int pCashAmount) {
        name = pName;
        if (pAge < 0) {
            age = 12;
        } else {
            age = pAge;
        }
        if (pCashAmount < 0) {
            cashAmount = 0;
        } else {
            cashAmount = pCashAmount;
        }
    }

    public void setName(String newName) {
        name = newName;
    }

    public String getName() {
        return name;
    }

    public void setAge(int newAge) {
        if (newAge >= 0) {
            age = newAge;
        }
    }

    public int getAge() {
        return age;
    }

    public void setCashAmount(int newCashAmount) {
        if (newCashAmount >= 0) {
            cashAmount = newCashAmount;
        }
    }

    public int getCashAmount() {
        return cashAmount;
    }

    public void setAccount(BankAccount newAccount) {
        account = newAccount;
    }

    public BankAccount getAccount() {
        return account;
    }

    // 첫 번째 파라미터: 받는 사람 (Person)
    // 두 번째 파라미터: 이체할 금액 (정수)
    // 리턴 : 성공여부 (불린)
    public boolean transfer(Person to, int amount) {
        return account.transfer(to.getAccount(), amount);
    }

    // 첫 번째 파라미터: 받는 사람의 계정 (BankAccount)
    // 두 번째 파라미터: 이체할 금액 (정수)
    // 리턴 : 성공여부 (불린)
    public boolean transfer(BankAccount to, int amount) {
        return account.transfer(to, amount);
    }
}

 

 


본 내용은 Codeit의  '자바 기초' 강의를
참고하여 작성한 내용입니다.

 

반응형