개발/Java
[Java] 생성자 오버로딩
suniverse
2023. 1. 17. 19:46
생성자 오버로딩
파라미터가 다른 생성자를 여러번 정의하는 것
✍
class OverloadingPerson{
String name;
int age;
boolean isHungry;
public OverloadingPerson(){ // 기본 생성자 직접 정의
name = "홍길동";
age = 20;
isHungry = true;
}
// 생성자 오버로딩
// 이름, 나이, 배고픔을 전달받아 멤버변수를 초기화하는 생성자
public OverloadingPerson(String name, int age, boolean isHungry) {
this.name = name;
this.age = age;
this.isHungry = isHungry;
}
public OverloadingPerson(String name, int age) { // 멤버변수 2개인 생성자를 하나 더 만들었다
this.name = name;
this.age = age;
}
public void print() {
System.out.println("이름: " + name);
System.out.println("나이: " + age);
System.out.println("배고픔: " + isHungry);
}
}
public class Ex2 {
public static void main(String[] args) {
OverloadingPerson op = new OverloadingPerson();
op.print();
System.out.println("---------------------------------");
OverloadingPerson op2 = new OverloadingPerson("이순신", 44, false);
op2.print();
System.out.println("---------------------------------");
OverloadingPerson op3 = new OverloadingPerson("강감찬", 44);
op3.print();
}
}
this 키워드 레퍼런스
1. 레퍼런스(Reference) this
- 자신의 인스턴스 주소가 저장되는 레퍼런스(= 참조변수)
- 개발자가 임의로 생성할 수 없으며, 인스턴스 생성시 자동으로 주소가 저장된다.
--> 각 인스턴스 마다 this에 저장되는 주소가 달라진다.
- 일반적은 참조변수와 동일한 방법으로 사용가능하다.
- 주로 생성자나 메서드 내에서 멤버변수와 로컬변수의 이름이 동일할 경우 멤버변수를 구별할 목적으로 사용된다.
- 또한, 자신의 인스턴스 내의 다른 메서드를 호출하는데에도 사용가능하다.
- 일반적으로 메서드 이름은 로컬변수처럼 중복되지 않으므로 this를 생략가능하다.
✍ this를 쓰는 이유 예시
public void setName(String name) {
name = name; // 이 경우 왼쪽은 멤버변수, 우측은 로컬변수다. 오류는 아니지만 경고발생. 아무런 효과가 없으니.
}
public void setName(String newName) {
name = newName; // 변수를 새로 만들어 줬음. 사실 이건 잘 안 쓴다.
}
- name = name; 코드에 의해 로컬변수 name의 값이 다시 자신에게 저장된다.
- 아무런 효과가 없는 코드이다.
- 새로운 로컬변수 newName의 값을 인스턴스 멤버변수 name에 저장하는 방법도 있다. 하지만 잘 쓰지 않는다.
this 키워드 생성자 this()
2. 생성자 this()
- 하나의 생성자에서 자신의 클래스 내의 "또 다른" 생성자를 호출하는 코드
- 생성자 오버로딩을 수행할 경우 멤버변수 초기화 코드가 중복될 수 있다.
--> 따라서, 코드 중복을 제거하기 위해 하나의 생성자에 작업 처리 코드를 기술하고
다른 생성자에서는 해당 생성자를 호출하여 데이터만 전달한 뒤
간접적으로 멤버변수를 초기화하도록 한다. --> 중복이 제거됨
- this() 형식으로 호출하며, 생성자에 전달할 파라미터를 소괄호()안에 기술한다.
--> 해당 파라미터 타입 및 갯수와 일치하는 생성자가 호출된다.
***주의사항***
생성자 this()는 생성자 내에서 반드시 첫문장으로 실행되어야 한다!
연습문제
✍ 클래스 만들기
class Account{
String accountNo;
String ownerName;
int balance;
public Account() { // 기본 생성자 정의
accountNo = "111-1111-111";
ownerName = "홍길동";
balance = 100000;
System.out.println("Account()의 생성자 호출됨!");
}
public Account(String accountNo, String ownerName, int balance) { // this 생성자 정의
// 파라미터 3개를 전달받아 초기화하는 생성자를 정의하였다.
this.accountNo = accountNo;
this.ownerName = ownerName;
this.balance = balance;
}
}
- Account 클래스 (설계도)를 작성하였다.
- alt + ctrl + shift + o --> 생성자 정의 가능
✍
public static void main(String[] args) {
Account acc = new Account("222-2222-222", "이순신", 100000);
}
- 생성자를 정의하였기 때문에 Account acc = new Account(); <-- 자동으로 생성되는 코드를 작성하면 오류가 발생한다.