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("가을", 25, 100000);
// 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 |