본문 바로가기
JAVA/객체지향

자바 생성자 의미와 구현, 그리고 생성자 오버로딩 뜻?

by 스코리아 2023. 8. 10.

안녕하세요. 스코리아입니다.

오늘은 자바의 생성자 의미를 파악하고 구현해 본 뒤, 생성자 오버로딩이 무엇인지 알아보겠습니다.

 

생성자 (constructor)란?

  • 생성자 의미: 인스턴스가 생성될때 호출되는 인스턴스 초기화 메소드
  • 생성자 용도: 객체가 생성될 때 변수나 상수를 초기화하거나 다른 초기화 기능을 수행하는 메소드를 호출
  • 생성자 호출 방법 : 객체를 생성할 때 new 키워드와 함께 사용 - 예를 들면 new Student() 
  • 생성자 기본 문법: <class_name>([<argument_list>]){[<statements>]

자바 생성자

 

생성자를 만들 때 주의할 점

  • 생성자는 반환 값이 없음
  • 생성자는 클래스의 이름과 동일해야 함
  • 대부분의 생성자는 외부에서 접근 가능하지만, 필요에 의해 private로 선언해야 하는 경우도 있음

 

기본 생성자 (default constructor)란?

  • 클래스에는 반드시 적어도 하나 이상의 생성자가 존재함 : 바로 이것이 기본생성자
  • 기본 생성자는 매개 변수가 없고 구현부가 없음
  • 클래스에 생성자를 구현하지 않아도 기본 생성자는 자동으로 생성됨.
  • 즉, 클래스에 생성자가 하나도 없는 경우 컴파일러가 생성자 코드를 넣어줌. (단, 직접 만든 생성자가 있다면 자동생성 X)
public class Student {
	
}
  • 위와 같이 Student 클래스에 아무 생성자도 구현되지 않았다면, 아래의 기본 생성자가 자동으로 생성됨.
public Student(){}
  • 그러므로 new Student()와 같이 객체를 생성할 수 있음

 

 

생성자를 직접 만들어보자!

Student.java를 만들고, 멤버 변수로는 학생 학번 (studentNumber), 학생 이름 (studentName), 학년 (grade)을 사용하겠습니다.

그리고 생성자를 만들건데, 컴파일러가 제공해 주는 기본 생성자 외에 필요에 의해 추가적인 생성자를 직접 구현하는 방법도 있습니다.

아래와 같이 기본 생성자와 3개의 매개변수를 갖는 추가 생성자를 만들어보고, 이를 출력하는 showStudentInfo() 멤버함수도 만들어봅시다.

public class Student {

	public int studentNumber;
	public String studentName;
	public int grade;
    
	public Student() {} // 기본 생성자
	
	public Student(int studentNumber, String studentName, int grade) { // 추가 생성자
		this.studentNumber = studentNumber;
		this.studentName = studentName;
		this.grade = grade;
	}
	
	public String showStudentInfo() {
		return studentName + "학생의 학번은 " + studentNumber + "이고, " + grade + "학년 입니다.";
	}
}

여기서 잠깐! Student라는 생성자 이름이 겹치지 않나요? 이렇게 작성해도 되는 걸까요?

먼저 여러 가지 생성자를 정의할 수 있는 생성자 오버로딩에 대해서 알아봅시다.

 

생성자 오버로딩(overloading)

  • 매개변수가 다른 똑같은 이름의 생성자들을 여러 개 만들 때
  • 생성자를 두 개 이상 구현하는 경우를 생성자 오버로딩이라 명칭함

 

여기서 주의할 점은, 클래스에 생성자를 따로 구현하면 기본 생성자는 제공되지 않습니다. 즉 위의 예제 코드에서 기본 생성자 부분을 주석 처리한다면, Student 객체를 호출할 때 new Student()처럼 호출하지 못하고, new Student(매개변수 1, 매개변수 2, 매개변수 3) 형태로만 호출해야 합니다.

 

이제 Student 객체를 호출해 보도록 하겠습니다.
public class StudentTest {
	public static void main(String[] args) {
            Student studentSoo = new Student();
            studentSoo.studentNumber = 54321;
            studentSoo.studentName = "Soo";
            studentSoo.grade = 1;

            Student studentLee = new Student(12345, "Lee", 3);

            System.out.println(studentSoo.showStudentInfo());
            System.out.println(studentLee.showStudentInfo());
	}
}
  1. studentSoo 인스턴스의 경우 기본생성자로 호출하고 참조변수를 활용하여 인스턴스의 멤버변수 값을 변경해 주었습니다.
  2. studentLee 인스턴스의 경우 우리가 직접 만들 추가 생성자로 호출하였습니다. 추가 생성자는 받은 매개변수 값들을 토대로 객체의 멤버변수 값을 변경해 줍니다.
  3. showStudentInfo()를 통해 이름, 학번, 학년을 출력하였습니다.
  4. 출력 결과는 "Soo 학생의 학번은 54321이고, 1학년입니다. \n Lee 학생의 학번은 12345이고, 3학년입니다"입니다.

 

이렇게 생성자 오버로딩 덕분에 생성자를 호출하는 코드(client 코드)에서 여러 생성자 중 필요에 따라 원하는 것을 호출하여 사용할 수 있었습니다.

 


 

지금까지 자바 (JAVA) 생성자의 의미와 구현방법, 그리고 생성자 오버로딩에 대해서 알아보았습니다.

읽어주셔서 감사합니다.