ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 생성자(Constructor)
    Java/OOP 2022. 10. 1. 13:06

    생성자는 두가지 역할을 한다 

    1. 인스턴스를 만든다 

    2. 인스턴스의 속성(인스턴스변수)들을 초기화 시켜준다 

     

    // 기본 생성자
    // 생성자를 따로 정의하지 않았을 경우에는 기본 생성자를 사용하면은 된다  
    Person p1 = new Person();
    
    
    // 생성자 정의 
    
    public class Person {
    	String name; 
        int age; 
        
        // parameter를 2개받는 생성자를 작성
        public Person(String pName, int pAge){      
        	name = pName; 
            age = pAge;     
        } 
    }
    // 생성자 정의 전 
    
    public static void main(String[] args) {
    	Person p1 = new Person(); 
        p1.setName("yunajoe"); 
        p1.setAge(27);    
    }
    
    // 생성자 정의 후  
    public static void main(String[] args){
    	Person p1 = new Person("yunajoe", 27); 
    
    }

    생성자 오버로딩

    // parameter를 두개 받는 생성자 
    public Person(String pName, int pAge) {
    	name = pName;
        age = pAge; 
    
    }
    
    // parameter를 한개 받는 생성자 
    public Person(String pName){
    	name = pName; 
    	age = 100;
    
    
    // 2개의 생성자를 이용하여 만들어보기 
    public static void main(String[] args) {
    	Person p1 = new Person("yunajoe", 30); // parameter를 두개를 받는 생성자 사용 
        Person p2 = new Person("여나당"); // parameter를 한개 받는 생성자 사용
    
        System.out.println(p1.name);
        System.out.println(p1.age);
        System.out.println(p2.name);
        System.out.println(p2.age);
    }

     

    실습

     

    // Person 
    
    
    Person의 생성자 2개를 만들 것입니다.
    
    (1) 파라미터로 '이름'을 뜻하는 String형 값 pName과 '나이'를 뜻하는 int형 값 pAge를 받고
    초기값을 설정합니다. 인스턴스 변수 cashAmount은 0으로 시작합니다. 
    단, pAge가 음수면 인스턴스 변수 age는 12로 설정
    
        public Person(String pName, int pAge){
            name = pName;
            cashAmount = 0;
            if (pAge < 0){
                age = 12;
            }else{
                age = pAge;
            }
        }    
    
    
    (2) 파라미터로 '이름'을 뜻하는 String형 값 pName, '나이'를 뜻하는 int형 값 pAge, 
    그리고 '보유 현금'을 뜻하는 int형 값 pCashAmount를 받고 초기값을 설정합니다
    (1)번과 마찬가지로 pAge가 음수인 경우에는 age를 12로 설정합니다.
    pCashAmount가 음수면 인스턴스 변수 cashAmount를 0으로 설정
    
        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;
                }
            }
            
    // BankAccount
    
    (1) 파라미터로 '잔액'을 뜻하는 int형 값 pBalance를 받습니다.
    파라미터로 받은 잔액은 음수가 될 수 없습니다. 
    음수 입력이 있을 경우 0으로 설정
    
        public BankAccount(int pBalance){
        if(pBalance <0 ){
            balance = 0;
        }else{
            balance = pBalance;
            }
        }
    
    
    (2) 파라미터로 '소유자'를 뜻하는 Person형 값 pOwner를 받습니다. 
    pOwner를 인스턴스 변수 owner에 지정해주고, 잔액은 0으로 시작
    
    public BankAccount(Person pOwner){
            owner = pOwner;
            balance = 0;
        } 
    
    (3) 파라미터로 '잔액'을 뜻하는 int형 값 pBalance와 '소유자'를 뜻하는 
    Person형 값 pOwner를 받습니다. 마찬가지로 balance와 owner를 설정해주고,
    파라미터로 받은 잔액이 음수인 경우에는 balance를 0으로 설정
    
        public BankAccount(int pBalance, Person pOwner){
            owner = pOwner;
            if(pBalance < 0){
                balance = 0;
            }else{
                balance = pBalance;
            }
    
        }
        
        
     // 테스트 
     
    1. Person의 1번 생성자를 사용해서 인스턴스 p1을 만듭니다. 
    생성 후 보유 현금은 30000으로 재설정해줍니다.
    Person p1 = new Person("yuna", 30);
    p1.setCashAmount(3000);
    
    
    2. Person의 2번 생성자를 사용해서 인스턴스 p2를 만듭니다.
    보유 현금 초기값은 100000으로 설정해줍니다.
    Person p2 = new Person("yuna2", 30, 100000);
     
    
    
    3. BankAccount의 2번 생성자를 사용해서 인스턴스 a1을 만듭니다. 
    파라미터로 p1을 넘겨줘서 p1과 a1을 연결해줍니다. 
    생성 후 잔액을 100000으로 재설정해줍니다.
    BankAcount a1 = new BankAccount(p1);
    a1.setbalance = 100000;
    p1.setAccount(a1);
    
    
    4. BankAccount의 3번 생성자를 사용해서 인스턴스 a2을 만듭니다.
    파라미터로 p2을 넘겨줘서 p2과 a2을 연결해줍니다. 잔액 초기값은 500000입니다.
    BankAccount a2 = new BankAccount(500000,p2);
    p2.setAccount(a2);

     

    실습

    public class Person{
        // 인스턴스 변수명 지정하기
        private String name;
        private int age;
        private int cashAmount;
        // BankAccount 클래스를 자료형으로 받고 account라는 변수로 만듬
        private BankAccount account;
    
        // 생성자 정의하기 - 1
        public Person(String pName, int pAge){
            name = pName;
            cashAmount = 0;
            if (pAge<0) {
                age = 12;
            }else{
                age= pAge;
            }
        }
        // 생성자 정의하기 - 2
        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;
            }
        }
    
        // set, get 메서드
        public void setName(String pName){
            name = pName;
        }
        public String getName(){
            return name;
        }
    
        public void setAge(int pAge){
            age = pAge;
        }
        public int getAge(){
            return age;
        }
        public void setCashAmount(int pCashAmount){
            cashAmount = pCashAmount;
        }
        public int getCashAmount(){
            return cashAmount;
        }
    
        public void setAccount(BankAccount pAccount){
            account = pAccount;
        }
    
        public BankAccount getAccount(){
            return account;
        }
    
        // 메서드1
        public boolean transfer(Person to, int amount){
    
            return account.transfer(to.getAccount(), amount);
        }
    
        // 메서드2
        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){
            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;
            }
        }
        // get, set 메서드
        public void setBalance(int pBalance){
            balance = pBalance;
        }
        public int getBalance(){
            return balance;
        }
    
        public void setOwner(Person pOwner){
            owner = pOwner;
        }
        public Person setOwner(){
            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 || amount >balance){
                System.out.println("출금 실패입니다 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
                return false;
            }
            balance -= amount;
            owner.setCashAmount(owner.getCashAmount() + amount);
            System.out.println(amount + "원 출금하였습니다 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
            return true;
        }
    
        //
        public boolean transfer(Person to, int amount){
            return transfer(to.getAccount(), amount);
        }
    
        public boolean transfer(BankAccount to, int amount){
            if(amount < 0 || amount > balance){
                System.out.println("false - from: " + owner.getName() + ", to: " + to.owner.getName() + ", amount: " + amount + ", balance: " + balance);
                return false;
            }else{
                balance -= amount;
                to.balance += amount;
                System.out.println("true - from: " + owner.getName() + ", to: " + to.owner.getName() + ", amount: " + amount + ", balance: " + balance);
                return true;
            }
        }
    
    
    
    
    
    
    
    
    }
    public class BankDriver {
        public static void main(String[] args) {
            // 사람  1
            Person p1 = new Person("yuna1", 30);
            p1.setCashAmount(30000);
    
            // 은행 계좌 1
            BankAccount acc1 = new BankAccount(p1);
            acc1.setBalance(100000);
            p1.setAccount(acc1);
    
            // 사람 2
            Person p2 = new Person("yuna2", 30, 100000);
    
            // 은행 계좌 2
            BankAccount acc2 = new BankAccount(500000, p2);
            p2.setAccount(acc2);
    
            // 계좌 이체 테스트
            acc2.transfer(acc1,200000); // BankAccount 클래스에 있는 transfer 메서드 에서 transfer(BankAccount to, int amount)사용 
            acc1.transfer(p2, 150000); // BankAccount 클래스에 있는 transfer 메서드 에서 transfer(Person to, int amount)사용 
            p2.transfer(acc1, 270000); // Person 클래스에 있는 transfer(BankAccount to, int amount)사용
            p1.transfer(p2,130000); //  Person클래스에 있는 transfer(Person to, int amount)
        }
    }

    'Java > OOP' 카테고리의 다른 글

    접근제어자  (0) 2022.10.20
    실습  (0) 2022.10.08
    this  (0) 2022.10.01
    메소드 오버로딩(method overloading)  (0) 2022.09.24
    객체  (0) 2022.09.18

    댓글

Designed by Tistory.