안녕하세요, 여행벌입니다.

오늘은 자바 클래스에서 중요한 역할을 하는 '생성자' 혹은 '생성자 메소드' 에 대해서 다뤄보겠습니다.


생성자(Constructor)

 클래스는 데이터 + 메소드로 이루어진 집합체라고 저번 포스팅에서 설명했습니다. 생성자는 생성자 메소드로 일종의 메소드입니다! 그러나 다음과 같은 부분에서 일반적인 메소드와 차이가 있습니다.

● 생성자의 이름은 클래스의 이름과 동일해야 한다.

● 생성자는 값을 반환하지 않고 반환형도 표시하지 않는다.

 위의 두 조건이 생성자가 되기 위한 조건입니다. 위의 조건을 모두 만족하면 자바 컴파일러에 의해서 생성자로 인식하게 됩니다.

 그럼 생성자는 어떤 역할을 할까요?? 생성자는 클래스에 있는 인스턴스 변수(데이터) 를 초기화 하는 역할을 진행합니다! 즉, 인스턴스 생성 과정에서 초기화를 위해 자동으로 호출되는 일종의 메소드입니다.

 

 저번 포스팅에서 정의했던 계좌 클래스를 불러와서 생성자를 만들어보겠습니다.

package Hello;

public class BankAccount {
	private String accountInfo = "1002-***-******"; // 계좌번호
	private int balance = 0; // 현재 잔액
	// 계좌 번호를 알려주는 메소드(기능)
	public void printAccountInfo() {
		System.out.println("게좌 번호는 : " + accountInfo + "입니다");
	}
	// 잔고를 알려주는 메소드(기능)
	public void printBalance() {
		System.out.println("현재 계좌 잔고는 : " + balance + "입니다");
	}
	// 입금하는 메소드(기능)
	public void deposit(int amount) {
		System.out.println(amount + "원을 입금하셨습니다.");
		balance += amount;
	}
	// 출금하는 메소드(기능)
	public void withdraw(int amount) {
		if(amount > balance)
			System.out.println("잔고보다 많은 금액을 인출하려고 합니다.");
		else {
			System.out.println(amount + "원을 출금하셨습니다.");
			balance -= amount;
		}
	}
	public static void main(String args[]) {
		BankAccount account1 = new BankAccount();
		account1.printAccountInfo();
		account1.printBalance();
		account1.deposit(10000);
		account1.printBalance();
		account1.withdraw(9000);
		account1.printBalance();
	}
}

 클래스의 이름이 BankAccount 이므로 생성자 조건에 의해 생성자 메소드의 이름은 BankAccount 가 되고, 인스턴스 변수가 계좌번호와 현재 잔액 2가지가 있으므로 매개 변수로 String, int 를 입력받아야합니다. 또, 값을 반환하지 않고 반환형도 표시하지 않아야되므로 다음과 같이 생성자를 만들 수 있습니다.

public BankAccount(String info, int money){
	accountInfo = info;
	balance = money;
}

 최종적으로 다음과 같이 생성자를 포함한 클래스를 만들 수 있습니다.

package Hello;

public class BankAccount {
	private String accountInfo = "1002-***-******"; // 계좌번호
	private int balance = 0; // 현재 잔액
	// 생성자
	public BankAccount(String info, int money){
		accountInfo = info;
		balance = money;
	}
	// 계좌 번호를 알려주는 메소드(기능)
	public void printAccountInfo() {
		System.out.println("게좌 번호는 : " + accountInfo + "입니다");
	}
	// 잔고를 알려주는 메소드(기능)
	public void printBalance() {
		System.out.println("현재 계좌 잔고는 : " + balance + "입니다");
	}
	// 입금하는 메소드(기능)
	public void deposit(int amount) {
		System.out.println(amount + "원을 입금하셨습니다.");
		balance += amount;
	}
	// 출금하는 메소드(기능)
	public void withdraw(int amount) {
		if(amount > balance)
			System.out.println("잔고보다 많은 금액을 인출하려고 합니다.");
		else {
			System.out.println(amount + "원을 출금하셨습니다.");
			balance -= amount;
		}
	}
    
}

 위에서 생성자는 인스턴스를 만들 때 인스턴스 변수를 초기화하는 역할을 한다고 했습니다. 그러면 어떻게 생성자를 이용해 인스턴스를 선언할 수 있을까요??

    public static void main(String args[]) {
    	BankAccount account = new BankAccount("1002-000-0000", 1000);
    	account.printAccountInfo();
    	account.printBalance();
    }

 위와 같이 인스턴스를 생성할 때, 생성자 함수에 매개 변수를 같이 입력해주면 됩니다.

 결과는 다음과 같이 인스턴스를 선언하기만 했는데 초기화가 되어있는 것을 확인할 수 있습니다.

디폴트 생성자(Default Constructor)

 인스턴스를 생성하면서 인스턴스 변수를 초기화하는 생성자에 대해서 위에서 다뤄보았습니다. 그러면 저번 포스팅에서 다뤘던 생성자가 없는 클래스들은 제대로된 클래스가 아닐까요?? 먼저, 모든 인스턴스 생성의 마지막 단계는 생성자 호출입니다. 즉, 생성자 호출이 생략된 인스턴스는 인스턴스가 아닙니다. 

 그럼 우리가 생성자 없이 정의했던 클래스들은 모두 잘못 정의된 클래스인데 에러가 나지않고 컴파일이 진행된 것일까요??

 생성자를 생략한 상태의 클래스를 정의하면 자바 컴파일러가 '디폴트 생성자' 라는 것을 클래스 정의에 자동으로 넣어줍니다. 그래서 생성자가 없어도 에러가 나지 않고 클래스 정의가 진행된 것입니다.

 위와 같이 생성자 없기 클래스를 정의하면 아래와 자동으로 디폴트 생성자가 추가되어 다음과 같은 클래스가 정의됩니다.

public class BankAccount{
	private String accountINfo ="";
	private int balance;
	public BacnkAccount() { 
		// Empty 실제로 비어 있음.
	}; 
	public void printAccountInfo() {
		// ~ 코드 ~
	}
	public void printBalance() {
		// ~ 코드 ~
	}
	public void deposit(int amount) {
		// ~ 코드 ~
	}
	public void withdraw(int amount) {
		// ~ 코드 ~
	}
}

   

+ Recent posts