본문 바로가기
JAVA

[JAVA] 객체와 클래스 - 생성자, 생성자 오버로딩

by Amy IT 2022. 5. 22.

생성자(Constructor)는 클래스의 구성요소 중 하나로서, 멤버변수를 초기화하는 역할을 합니다. 즉, 변수에 데이터를 처음 저장하는 역할입니다. 생성자 이름은 반드시 클래스명으로 지정해야 합니다. 파라미터(매개변수)를 이용해서 값을 받아 멤버변수에 초기값을 저장할 수 있습니다.

[접근제한자] 클래스명([파라미터]) {

}

 

 

◆ 기본생성자 (Default Constructor)

 

기본생성자는 매개변수가 없는 생성자로서, 개발자가 따로 작성하지 않은 경우 묵시적으로 자동 생성됩니다. 앞서 객체를 생성할 때 Student() 라는 표현을 사용한 적이 있습니다. 이는 Student 클래스의 기본생성자를 호출한 것입니다. 확인을 위해 Student 클래스의 기본생성자를 명시적으로 작성해 보겠습니다.

public class Student {
	String name;
	int age;
	String address;
    
    public Student() {
    	System.out.println("기본생성자 호출됨");
    }
}

 

기본생성자를 호출해서 객체를 생성하고 생성된 객체의 주소를 t1이라는 변수에 참조시킨 후, 값을 저장해 출력해 보겠습니다.

public class TestStudent {

	public static void main(String[] args) {
		Student t1 = new Student(); //기본생성자 호출, 객체 생성
		t1.name = "홍길동"; //학생 정보 저장
		t1.age = 10; 
		System.out.println(t1.name +"\t"+ t1.age);
	}

}

기본생성자를 호출하여 작업한 것을 확인할 수 있습니다. 

 

 

 

 

◆ 생성자 오버로딩 (Overloading) 

 

생성자는 한 클래스에 여러 개 정의 가능합니다. 기본적으로 한 클래스 안에서 사용되는 모든 식별자는 이름이 중복되면 안 되는데, 생성자와 메소드의 경우 같은 클래스 안에서 같은 이름으로 여러 번 사용될 수 있습니다. 단, 매개변수는 반드시 다르게 하여 자바 프로그램이 이를 식별할 수 있도록 합니다. 이렇게 매개변수를 다르게 하여 동일한 이름으로 여러 번 사용하는 것을 오버로딩(Overloading)이라고 합니다. 

기본생성자를 이용할 경우, 객체를 생성하는 작업과 값을 저장하는 초기화 작업이 분리되어 따로 작성해야 하는 번거로움이 있었습니다. 생성과 동시에 값을 저장하기 위해, 매개변수를 가지는 생성자를 명시적으로 작성하여 이용할 수 있습니다. Student 클래스에서 매개변수 2개를 갖는 생성자를 명시적으로 작성한 후, main 함수에서 이 생성자를 이용해 객체 생성과 초기화를 해 보겠습니다. 

public class Student {
	String name;
	int age;
	String address; //멤버변수
    
    public Student(String name, int age) { //로컬변수
    	System.out.println("2번생성자 호출");
    	this.name = name; //this.멤버변수 = 로컬변수;
    	this.age = age;
    }

}
public class TestStudent {

	public static void main(String[] args) {
		Student t2= new Student("홍길동", 10); //2번생성자 호출, 객체 생성, 값 전달
		System.out.println(t2.name +"\t"+ t2.age +"\t"+ t2.address);
	}

}

String name, int age를 매개변수로 설정하여 new 키워드로 객체 생성 시 이름과 나이 값을 바로 저장할 수 있도록 하고 있습니다. 이때 매개변수는 생성자 내에서 선언된 로컬변수입니다. 로컬변수로 받아온 값을 멤버변수에 저장해야 생성된 객체에 값을 설정할 수 있게 됩니다. 이 작업은 this 키워드를 이용합니다. 현재 만들어진 객체의 멤버변수에 this 키워드를 붙여서 매개변수로 설정된 로컬변수와 구분짓습니다. 따라서 this.name = name; 이라는 것은 name 이라는 로컬변수로 받아온 값(우측)을 name 이라는 멤버변수(좌측)에 저장시키는 작업입니다. 

 

 

* 주의사항

 

그런데 여기서 정말 주의해야 할 중요한 점이 있습니다. 이렇게 매개변수를 갖는 생성자를 오버로딩하면 기본생성자는 묵시적으로 추가되지 않는다는 것입니다. 앞서 기본생성자는 개발자가 따로 작성하지 않아도 묵시적으로 추가된다고 하였습니다. 하지만 생성자를 오버로딩하면 개발자가 이 생성자를 이용하겠다는 것이니, 자바 프로그램은 기본생성자를 굳이 추가하지 않아도 된다고 판단하여 기본생성자를 자동으로 추가하지 않게 됩니다. 따라서 오류 발생을 최소화하기 위해서 생성자 오버로딩 시 반드시 기본생성자를 명시적으로 만들어 놓는 것이 좋습니다. 

 

 

 

 

◆ 생성자에서 다른 오버로딩 생성자를 호출하는 경우

 

여러 생성자에서 멤버변수를 중복하여 초기화하지 않고, 하나의 생성자에서만 초기화할 수 있도록 코드를 간결하게 만들 수 있습니다. 초기화 작업을 하는 특정 생성자를 생성자에서 호출하는 것입니다. 주의할 점은 반드시 생성자 첫 줄에서 사용해야 한다는 점입니다. 

다음은 이름, 나이, 주소, 주민번호 총 네 가지 정보 중 이름만 있는 학생의 정보를 저장하기 위한 프로그램입니다. Student 클래스에서 4개의 멤버변수를 선언하고 기본생성자를 포함하여 4개의 생성자를 정의한 후, main 함수에서 객체 생성과 값 저장을 합니다. 

public class Student {
	String name;
	int age;
	String address;
	String ssn;
		
	public Student() {
		System.out.println("기본생성자 호출");
	}

	public Student(String name) {
		this(name, 0); //this 키워드 이용하여 2개 짜리 생성자 호출 
		System.out.println("1개 짜리 생성자 호출 "); 
	}
		
	public Student(String name, int age) {
		this(name, age, "주소미상", "주민번호미상"); //4개 짜리 생성자 호출
		System.out.println("2개 짜리 생성자 호출 ");
	}
		
	public Student(String name, int age, String address, String ssn) {
		this.name = name;
		this.age = age;
		this.address = address;
		this.ssn = ssn;
		System.out.println("4개 짜리 생성자 호출 ");
	}
	
}
public class TestStudent {

	public static void main(String[] args) {
		Student stu4 = new Student("유관순"); //매개변수 1개 짜리 생성자 호출
		System.out.println(stu4.name+"\t"+stu4.age+"\t"+stu4.address+"\t"+stu4.ssn);
	}

}

main 함수에서 객체를 생성할 때 매개변수 1개 짜리 생성자를 호출하게 됩니다. 1개 매개변수를 가진 생성자는 유관순이라는 값을 받아 this(name, 0); 을 통해 나이를 0 값으로 설정하여 다시 2개 짜리 생성자를 호출하여 값을 넘깁니다. 2개 매개변수를 가진 생성자는 유관순, 0 이라는 값을 받아 나머지 주소, 주민번호에 값을 설정하여 다시 4개 짜리 생성자를 호출하고, 최종적으로 4개 매개변수를 가진 생성자가 모든 값을 초기화합니다. 그러면 다시 생성자를 호출했던 위치로 돌아가 다음 문장을 수행합니다. 따라서 위와 같은 순서로 문장을 출력하게 됩니다. 

 

 

이상으로 클래스 구성요소인 생성자에 대해서 정리해 보았습니다. 다음 글에서 이어서 클래스 구성요소인 메소드에 대해 알아보겠습니다. 

 

 

댓글