개발/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(); <-- 자동으로 생성되는 코드를 작성하면 오류가 발생한다.
  •