본문 바로가기
Language/Java

[JAVA] 객체 탄생의 설계도, 생성자(Constructor)의 모든 것

by Papa Martino V 2026. 1. 15.
728x90

생성자(Constructor)
생성자(Constructor)

자바(Java) 프로그래밍에서 클래스가 설계도라면, 객체는 그 설계도를 바탕으로 실제 메모리에 구현된 실체입니다. 우리가 new 키워드를 사용하여 새로운 객체를 생성할 때, 가장 먼저 호출되어 객체의 초기 상태를 설정하는 특수한 메서드가 바로 생성자(Constructor)입니다.

생성자는 단순한 초기화 도구를 넘어, 객체 지향 프로그래밍의 핵심 원칙인 캡슐화와 데이터 무결성을 보장하는 첫 번째 방어선 역할을 합니다. 본 포스팅에서는 생성자의 기본 정의부터 실무에서 반드시 알아야 할 고유한 특징들을 심도 있게 다뤄보겠습니다.


1. 생성자(Constructor)란 무엇인가?

생성자는 클래스로부터 객체가 생성될 때 호출되는 '인스턴스 초기화 메서드'입니다. 인스턴스 변수를 초기화하거나, 객체 사용에 앞서 필요한 초기 설정 로직을 수행하기 위해 사용됩니다.

생성자의 필수 조건

  • 이름의 일치: 생성자의 이름은 반드시 해당 클래스의 이름과 동일해야 합니다.
  • 반환값의 부재: 생성자는 값을 반환하지 않으며, 반환 타입(void 포함)을 명시하지 않습니다.

2. 생성자의 주요 특징과 내부 동작

자바 생성자는 일반 메서드와 비슷해 보이지만, 동작 방식과 규칙 면에서 확연한 차이를 보입니다.

① 자동 생성되는 '기본 생성자(Default Constructor)'

개발자가 클래스 내부에 생성자를 하나도 정의하지 않으면, 자바 컴파일러는 매개변수가 없고 내용이 비어 있는 기본 생성자를 자동으로 추가합니다. 덕분에 우리는 별도의 설정 없이도 new ClassName()을 호출할 수 있습니다. 단, 하나 이상의 생성자를 직접 정의하면 기본 생성자는 자동 추가되지 않습니다.

② 생성자 오버로딩(Overloading)

매개변수의 개수나 타입을 다르게 하여 하나의 클래스에 여러 개의 생성자를 둘 수 있습니다. 이를 통해 객체를 생성하는 다양한 방법을 제공할 수 있습니다. 예를 들어 이름만 가진 사람 객체, 이름과 나이를 모두 가진 사람 객체를 각각 생성할 수 있게 됩니다.

③ this()를 이용한 생성자 간 호출

생성자 내부에서 자신의 클래스 내 다른 생성자를 호출할 때 this()를 사용합니다. 이는 코드의 중복을 줄이는 데 매우 유용합니다. 주의할 점은 this() 호출은 반드시 생성자의 첫 줄에서만 이루어져야 한다는 것입니다.


3. 일반 메서드 vs 생성자 비교

많은 입문자가 헷갈려 하는 일반 메서드와 생성자의 차이점을 표로 정리하였습니다.

비교 항목 생성자 (Constructor) 일반 메서드 (Method)
목적 객체 생성 시 인스턴스 초기화 객체의 기능 및 동작 수행
이름 클래스명과 반드시 동일 자유롭게 명명 가능
반환 타입 없음 (명시하지 않음) 반드시 명시 (반환값 없으면 void)
호출 시점 new 연산자를 통한 객체 생성 시 객체 생성 후 도트(.) 연산자로 호출
상속 상속되지 않음 상속 및 오버라이딩 가능

4. 실무 관점에서의 생성자 활용 팁

효율적인 자바 애플리케이션 설계를 위한 생성자 활용 노하우는 다음과 같습니다.

  • 불변성(Immutability) 확보: private 생성자와 정적 팩토리 메서드를 조합하거나, 생성 시점에 모든 데이터를 주입하여 객체를 불변 상태로 만들면 멀티스레드 환경에서 안전합니다.
  • 의존성 주입(Dependency Injection): 객체가 필요로 하는 협력 객체를 생성자를 통해 전달받음으로써 코드 간의 결합도를 낮출 수 있습니다.
  • 유효성 검증: 생성자 내부에서 전달받은 매개변수가 유효한지 검증하여, 잘못된 상태의 객체가 생성되는 것을 원천 차단해야 합니다.

5. 마무리하며

생성자는 객체의 생애 주기에서 단 한 번만 호출되는 가장 강력한 권한을 가진 메서드입니다. 단순히 변수에 값을 대입하는 것을 넘어, 객체가 안전하게 활동할 수 있는 환경을 조성하는 것이 생성자의 진정한 역할입니다. 여러분의 코드에서도 생성자를 적절히 활용하여 더 견고한 객체 지향 설계를 구현해 보시기 바랍니다.


내용 출처 및 참고 문헌

  • Oracle Java Documentation: Constructing Objects
  • James Gosling, "The Java Programming Language", Addison-Wesley Professional
  • Joshua Bloch, "Effective Java 3rd Edition", Pearson Education
728x90