[Java]생성자

생성자

객체를 생성하는 시점에 어떤 작업을 하고 싶다면 생성자(Constructor)를 사용한다.
생성자는 객체 생성 직후 객체를 초기화 하기 위한 특별한 메서드라고 생각할 수 있다.

this

멤버변수와 메서드의 매개변수 이름이 같으면 어떻게 구분해야 하는가?

public class MemberInit{
  String name;;
  int age;
  int grade;
  
  void initMember(String name, int age, int grade){
    this.name = name;
    this.age = age;
    this.grade = grade;
  }
}

이 경우 멤버 변수보다 매개변수가 코드 블럭의 더 안쪽에 있기 때문에 매개변수가 우선순위를 가진다.

initMember(String name, …) 메서드 안에서 name을 사용하게 되면 ‘매개변수에 접근’하게 된다. 이 때 멤버 변수에 접근하고 싶다면 앞에 this. 붙여 가리키게 되는데 this는 인스턴스 자신의 참조값을 가리킨다.

image-20241031163016951

  • 매개변수의 이름과 멤버 변수의 이름이 같은 경우 this를 사용해서 둘을 명확히 구분해야 한다.
  • this는 인스턴스 자기 자신을 가리킨다.

  • this는 생략할 수 있다. 이 경우 변수를 찾을 때 가까운 지역변수를 먼저 찾고 없으면 그 다음으로 멤버 변수를 찾는다. 멤버 변수도 없다면 오류가 난다.

생성자의 도입

객체를 생성하고 바로 초기값을 할당해야 하는 경우 위의 코드처럼 InitMember(…)와 같은 메서드를 매번 만들어야 하는데 이런 경우는 매우 빈번하다. 따라서 대부분의 객체 지향 언어는 객체를 생성하자마자 즉시 필요한 기능을 좀 더 편리하게 수행할 수 있도록 생성자라는 기능을 제공한다. 생성자를 사용하면 객체를 생성하는 시점에 즉시 필요한 기능을 수행할 수 있다.

생성자는 메서드와 비슷하지만 다음과 같은 차이가 있다.

  • 생성자의 이름은 클래스 이름과 같아야한다. 따라서 첫 글자도 대문자로 시작한다.
  • 생성자는 반환 타입이 없다. 비워두어야 한다.
  • 이 외에는 메서드와 같다.

생성자의 호출

생성자는 인스턴스를 생성하고 나서 즉시 호출한다.

new 생성자(생성자에 맞는 인수 목록)

이렇게 하면 인스턴스를 생성하고 즉시 생성자를 호출한다.
new 키워드를 생성하여 객체를 생성할 때 마지막에 괄호() 를 사용하는 이유도 바로 생성자 때문이다. 객체를 생성하면서 동시에 생성자를 호출한다는 의미를 포함하는 문법이다.

객체를 생성하면 어떠한 경우에도 생성자는 반드시 호출 되어야한다.

설령 객체를 만들 때 생성자의 기능이 필요하지 않더라도 생성자는 필요하기 때문에 모든 객체에는 생성자를 정의해주어야하는데, 이런 경우 개발자가 직접 생성자를 일일이 정의하지 않아도 되도록 자바 컴파일러는 매개변수가 없고 작동하는 코드가 없는 기본 생성자를 자동으로 만들어주게 된다. ( cf) 자바가 생성하는 기본 생성자는 기본적으로 클래스와 같은 접근 제어자를 갖는다.)

물론 개발자가 직접 정의한 생성자가 하나라도 있는 경우 자바는 기본 생성자를 만들지 않는다.

생성자 장점

  1. 중복 호출 제거 생성자가 없으면 생성 직후 어떤 작업을 수행하기 위해 메서드를 한번 더 호출해야 하는 불편함이 있다. 생성자 덕분에 객체를 생성하면서 동시에 생성 직후에 필요한 작업을 한 번에 처리하게 할 수 있게 된 것이다.

    MemberInit member = new MemberInit();
    member.InitMember("user", 15, 90)
    //생성자 사용
    MemberInit member = new Member("user", 15, 90);
    

    ⚠️ 생성자를 만들었다면 직접 정의한 생성자를 반드시 호출해아한다는 제약 조건이 생긴다.

    직접 정의한 생성자를 호출하지 않으면 컴파일 오류가 발생하게되는데, 이렇듯 IDE에서 즉시 확인할 수 있는 좋은 오류이다. 생성자를 사용하면서, 필요한 정보를 포함하지 않은 유령 객체를 시스템 내부에 등장시킬 가능성을 원천 차단하게 된다. 즉, 생성자를 사용하면 필수값 입력을 보장할 수 있다.

생성자 오버로딩

생성자도 메서드 오버로딩처럼 매개변수만 다르게 하여 여러 생성자를 제공할 수 있다. 여러개의 생성자를 정의한 경우 this()를 사용하면 생성자 내부에서 다른 생성자를 호출할 수 있다.

package construct;
public class MemberConstruct {
  String name;
  int age;
  int grade;
  MemberConstruct(String name, int age) {
  	this(name, age, 50);
  }
  MemberConstruct(String name, int age, int grade) {
    this.name = name;
    this.age = age;
    this.grade = grade;
  }
}
  • this()의 사용 규칙 this()는 생성자 코드의 첫줄에만 작성할 수 있다.

Leave a comment