Java, IntelliJ/JAVA

JAVA Class 클래스 정리

고로케 2021. 6. 24.
반응형

클래스(Class)

  • 형식
public class Person {
    String name;
    int age;
    int cashAmount;
    BankAccount account;
}

은행 입출금 코드 연습

더보기

은행 입출금 코드 연습

public class BankDriver {
    public static void main(String[] args) {
        //사람  선언
//        Person01_before_생성자 p1 = new Person01_before_생성자();
//        p1.setName("고라니");
//        p1.setAge(28);
//        p1.setCashAmount(300000);

        Person p1 = new Person("김신의", 28);
        p1.setCashAmount(30000);
        // 은행 계좌 계설
        BankAccount a1 = new BankAccount(p1);
        a1.setBalance(100000);


        // 두 객체의 관계 설정
        p1.setAccount(a1);
//        a1.setOwner(p1);


        // 3. p2,a2
//        Person01_before_생성자 p2 = new Person01_before_생성자();
        Person p2 = new Person("문종모", 28, 100000);
//        p2.setName("park");
//        p2.setCashAmount(100000);

        BankAccount a2 = new BankAccount(500000, p2);
//        a2.setBalance(500000);

        p2.setAccount(a2);
//        a2.setOwner(p2);

        // 4.
/*        a2.deposit(30000);
        a2.withdraw(170000);
        a2.deposit(620000);
        a2.withdraw(890000);


        System.out.println(p1.getAccount().getBalance());
        System.out.println(a1.getOwner().getName());

        // 테스트
        System.out.println(p1.getName() + "의 계좌 잔액: " + p1.getAccount().getBalance());*/

        // 계좌 이체 테스트
        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;
        age = pAge;
        cashAmount = 0;
        if (pAge < 0){
            age = 12;
        }
    }

    public Person(String pName, int pAge, int pCashAmount) {
        // 코드를 입력하세요
        name = pName;
        age = pAge;
        cashAmount = pCashAmount;
        if (pAge < 0){
            age = 12;
        }
        if (pCashAmount < 0){
            cashAmount = 0;
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    public int getCashAmount() {
        return cashAmount;
    }

    public void setCashAmount(int cashAmount) {
        this.cashAmount = cashAmount;
    }

    public BankAccount getAccount() {
        return account;
    }
    public void setAccount(BankAccount account) {
        this.account = account;
    }

    // 첫 번째 파라미터: 받는 사람 (Person)
    // 두 번째 파라미터: 이체할 금액 (정수)
    // 리턴 : 성공여부 (불린)

    // account와 account 간의 거래이므로, 첫째로 BankAccount 클래스의 transfer 메소드를 써야함.
    // 둘째로 Person to의 정보를 to의 account 정보로 바꾸어 호출.
    public boolean transfer(Person to, int amount) {
        return account.transfer(to.getAccount(), amount);
    }

    // account와 account 간의 거래이므로, BankAccount 클래스의 transfer 메소드를 써야함.
    public boolean transfer(BankAccount to, int amount) {
        return account.transfer(to, amount);
    }
}
public class BankAccount {
    private int balance;
    private Person owner;

    public BankAccount(int pBalance) {
        // 코드를 입력하세요
        balance = pBalance;
        if (balance < 0){
            balance = 0;
        }
    }
    public BankAccount(Person pOwner) {
        // 코드를 입력하세요
        balance = 0;
        owner = pOwner;
    }
    public BankAccount(int pBalance, Person pOwner) {
        // 코드를 입력하세요
        balance = pBalance;
        owner = pOwner;

        if (pBalance<0){
            balance =0;
        }
    }


    public int getBalance() {
        return balance;
    }

    public void setBalance(int balance) {
        this.balance = balance;
    }

    public Person getOwner() {
        return owner;
    }

    public void setOwner(Person owner) {
        this.owner = owner;
    }

    // 파라미터 : 입금할 액수(정수)
    // 리턴 : 성공여부(불린)
    boolean deposit(int amount) {
        // 1. write code here
        if (owner.getCashAmount() < amount || amount < 0) {
            System.out.println("입금 실패입니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
            System.out.println("false");
            return false;
        }


        balance += amount;
        owner.setCashAmount(owner.getCashAmount() - amount);
        System.out.println(amount + "원 입금하였습니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
        System.out.println("true");
        return true;
    }

    public boolean deposit(double amount, double exchangeRate) {
        return deposit((int) (amount * exchangeRate));
    }

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

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

        if (amount < 0 || amount > balance) {
            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;
    }

    // account와 account 간의 거래이므로, Person to의 정보를 to의 account 정보로 바꾸어 호출.
    public boolean transfer(Person to, int amount) {
        return transfer(to.getAccount(), amount);
    }

}

 

 

  • 메소드 오버로딩 정리

Method Overloading 은 클래스 내에 같은 이름의 메소드를 2개 이상 정의 할 수 있게 해주는 기능이다.

같은 이름이라도 파라미터 구성이 다르면 JAVA는 알아서 구분을 할 수 있다.

 

public class Calculator {
    int add(int a, int b) {
        return a + b;
    }

    int add(int a, int b, int c) {
        return a + b + c;
    }

    double add(double a, double b) {
        return a + b;
    }
     public static void main(String[] args) {
        Calculator c = new Calculator();

        System.out.println(c.add(2, 4));        // test 1
        System.out.println(c.add(2, 4, 8));     // test 2
        System.out.println(c.add(3.14, 2.54));  // test 3
    }
}

 

  • 선언 위치에 따른 변수의 종류
변수의 종류 선언 위치 언제 생성 됨?
인스턴스 변수(iv, instance variable) 클래스영역 클래스가 메모리에 올라갈 때
클래스 변수(cv, class variable) 인스턴스가 생성되었을 때
로컬 변수(lv, local variable) 클래스 영역 이외의 영역
(매서드 생성자, 초기화 블럭 내부)
변수 선언문이 수행됐을 때

 

  • 생성자 정의

생성자 : 인스턴스를 만들고 인스턴스의 변수(속성)들을 초기화해준다.

public Person(String pName, int pAge) {
    name = pName;
    age = pAge;
}
    
public static void main(String[] args) {
    Person p1 = new Person("김신의", 27);
}

 

- 오버로딩 가능하다.

public Person(String pName, int pAge) {
    name = pName;
    age = pAge;
}

public Person(String pName) {
    name = pName;
    age = 12;    // 12살을 기본 나이로 설정
}

public static void main(String[] args) {
    Person p1 = new Person("김신의", 27);  // 첫 번째 생성자
    Person p2 = new Person("박윤석");      // 두 번째 생성자
    }

 

  • this. / this() 정리

- this.  :  인스턴스 자신을 가르키는 참조 변수이다. (static 매서드에서는 this 를 사용하지 못한다.)

- this()  :  같은 클래스의 다른 생성자를 호출할 때 사용한다. 

 

예시)

public class Person {
    private String name;
    private String email;
    private String phoneNumber;

    public Person(String name) {
        this(name, null);
    }

    public Person(String name, String email) {
        this(name, email, null);
    }

    public Person(String name, String email, String phoneNumber) {
        this.name = name;
        this.email = email;
        this.phoneNumber = phoneNumber;
    }
}

 

 

 

 

반응형

댓글