DEV/JAVA

생성자 | Constructor

devvnn 2021. 12. 16. 22:30
생성자(Constructor) 의 역할

 

  • 인스턴스를 만들고
  • 인스턴스의 속성(인스턴스 변수)들을 초기화시켜줌

 

기본 생성자

 

  • 생성자를 한 개도 정의 안 했을 경우에는 자바에서 자동으로 기본 생성자를 제공해줌

 

    Person p1 = new Person();
cs

 

생성자 정의

 

  • 생성자를 하나라도 정의하면 위의 기본 생성자는 사용할 수 없음

 

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

 


 

  • 파라미터 두개를 받는 생성자

 

    public static void main(String[] args) {
        Person p1 = new Person();
        p1.setName("summer");
        p1.setAge(28);
    }
cs

 

    public static void main(String[] args) {
        Person p1 = new Person("summer"28);
    }
cs

 

- Person 인스턴스 생성, 그 인스턴스의 변수 name에 "summer"가 저장되고, 변수 age에 28이 저장

- 한 번에 모든 인스턴스 변수의 초기값을 설정할 수 있게 됨

 

생성자 오버로딩

 

  • 파라미터의 구성을 다르게 하면 같은 이름의 메소드를 여러 개 정의할 수 있는 것 → 메소드 오버로딩
  • 마찬가지로 생성자 오버로딩도 가능함

 

public class Person {
    String name;
    int age;
    
    // 파라미터를 두개 받는 생성자
    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("summer"27); // 첫 번째 생성자
        Person p2 = new Person("kate");       // 두 번째 생성자
        
        System.out.println(p1.name); // summer
        System.out.println(p1.age);  // 27
        System.out.println(p2.name); // kate
        System.out.println(p2.age);  // 12
        
    }
}
cs

 

생성자 연습

 

Person 클래스

 

public class Person {
    String name;
    int age;
    int cashAmount; // 입금액
    private BankAccount account;
    
    //------------------------------------------
    // 생성자
    // 1.파라미터로 pName과 pAge만 받는 생성자
    public Person(String pName, int pAge) {
        // 만약 pAge가 음수라면 나이를 12로 설정
        if(pAge < 0) {
            age = 12;
        }else {
            age = pAge;
        }
        
        name = pName;
        cashAmount = 0// 정수형의 기본 값은 0이라 없어도 됨
    }
    
    // 2.파라미터로 pName, pAge, pCashAmount(잔액)를 모두 받는 생성자
    public Person(String pName,int pAge,int pCashAmount) {
        // 만약 pAge가 음수라면 나이를 12로 설정
        if(pAge < 0) {
            age = 12;
        }else {
            age = pAge;
        }
        
        // cashAmount도 음수면 안 되니까 if문 써주기
        if(pCashAmount < 0) {
            cashAmount = 0;
        }else {
            cashAmount = pCashAmount;
        }
        
        name = pName;
    }
    
    //------------------------------------------
    // set과 get
    
    public void setName(String name) {
        this.name=name;
    }
    
    public String getName() {
        return name;
    }
    
    //------------------------------------------
    
    public void setAge(int age) {
        this.age=age;
    }
    
    public int getAge() {
        return age;
    }
    
    //------------------------------------------
    
    public void setCashAmount(int cashAmount) {
        this.cashAmount=cashAmount;
    }
    
    public int getCashAmount() {
        return cashAmount;
    }
    
    //------------------------------------------
    
    public void setBankAccount(BankAccount account) {
        this.account=account;
    }
    
    public BankAccount getBankAccount() {
        return account;
    }
    
    //------------------------------------------
    // 메서드
    
    // 첫 번째 파라미터 : 받는 사람(Person)
    // 두 번째 파라미터 : 이체할 금액(정수)
    // 리턴 : 성공여부(불린)
    public boolean transfer(Person to, int amount) {
        return transfer(to.account, amount);
    }
    
    // 첫 번째 파라미터 : 받는 사람의 계정(BankAccount)
    // 두 번째 파라미터 : 이체할 금액(정수)
    // 리턴 : 성공여부(불린)
    public boolean transfer(BankAccount to, int amount) {
        boolean succes = false;
        if(amount > account.getBalance() || amount < 0) {
            succes = false;
        }else {
            account.setBalance(account.getBalance() -amount);
            to.setBalance(to.getBalance() + amount);
            succes = true;
        }
        System.out.println(succes + "- from: " + name + ", to: " + to.getOwner().name 
                + ", amount: " + amount + ", balance: " + account.getBalance());
        
        return succes;
        
    }
}
cs

BankAccount 클래스

 

public class BankAccount {
    private int balance;  // 잔액
    private Person owner; // 소유자
    
    // 생성자
    // 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) {
         if(pBalance < 0) {
             balance = 0;
         }else {
             balance = pBalance;
         }
 
         owner = pOwner;
     }
    
    //------------------------------------------
    // set과 get
     
     public void setBalance(int balance) {
         this.balance=balance;
     }
     
     public int getBalance() {
         return balance;
     }
     
    //------------------------------------------
     
     public void setOwner(Person owner) {
         this.owner=owner;
     }
     
     public Person getOwner() {
         return owner;
     }
     
    //------------------------------------------
    // 메서드
    // 첫 번째 파라미터: 받는 사람 (Person)
    // 두 번째 파라미터: 이체할 금액 (정수)
    // 리턴 : 성공여부 (불린)
    public boolean transfer(Person to, int amount) {
        return transfer(to.getBankAccount(),amount);
    }
 
    // 첫 번째 파라미터: 받는 사람의 계정 (BankAccount)
    // 두 번째 파라미터: 이체할 금액 (정수)
    // 리턴 : 성공여부 (불린)
    public boolean transfer(BankAccount to, int amount) {
        boolean succes = false;
        if(amount > balance || amount < 0) {
            succes = false;
        }else {
            balance = balance - amount;
            to.setBalance(to.getBalance() + amount);
            succes = true;
        }
        System.out.println(succes+" - from: "+owner.name +", to: " 
        + to.owner.name+ ", amount: " +amount+ ", balance: "+balance);
        return succes;
    }
}
cs

Main

 

public class Main {
 
    public static void main(String[] args) {
        // 1.Person의 1번 생성자를 사용해서 인스턴스 p1을 만듭니다. 
        // 생성 후 보유 현금은 30000으로 재설정해줍니다.
        Person p1 = new Person("여름"28);
        p1.setCashAmount(30000);
        
 
        // 2.Person의 2번 생성자를 사용해서 인스턴스 p2를 만듭니다. 
        // 보유 현금 초기값은 100000으로 설정해줍니다.
        Person p2 = new Person("가을"25100000);
 
        // 3.BankAccount의 2번 생성자를 사용해서 인스턴스 a1을 만듭니다. 
        // 파라미터로 p1을 넘겨줘서 p1과 a1을 연결해줍니다. 
        // 생성 후 잔액을 100000으로 재설정해줍니다.
        BankAccount a1 = new BankAccount(p1);
        a1.setBalance(100000);
        
        p1.setBankAccount(a1); // a1과 p1 연결(Person1의 잔액과 a1의 계좌 연결)
 
        // 4.BankAccount의 3번 생성자를 사용해서 인스턴스 a2을 만듭니다. 
        // 파라미터로 p2을 넘겨줘서 p2과 a2을 연결해줍니다. 
        // 잔액 초기값은 500000입니다.
        BankAccount a2 = new BankAccount(500000, p2);
        
        p2.setBankAccount(a2); // a2와 p2 연결(Person2의 잔액과 a2 계좌 연결)
        
        //------------------------------------------
        // 계좌 이체 테스트
        a2.transfer(a1, 200000);
        a1.transfer(p2, 150000);
        p2.transfer(a1, 270000);
        p1.transfer(p2, 130000);
 
    }
 
}
 
cs

결과값

 

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
 
cs