6일 전
자바를 처음 공부할 때 new 클래스이름() 형태의 코드를 자주 보게 된다. 이때 객체를 생성하는 과정에서 함께 등장하는 것이 바로 생성자(Constructor)이다. 처음에는 생성자가 단순히 객체를 만드는 문법이라고 생각했지만, 공부해 보니 객체를 처음부터 올바른 상태로 시작하게 만드는 중요한 역할을 한다는 점이 인상적이었다. 이번 글에서는 생성자의 개념과 기본 생성자, 매개변수 생성자의 차이를 정리하고, 객체 초기화가 왜 중요한지 함께 살펴보려고 한다.
생성자는 객체가 생성될 때 자동으로 호출되는 특별한 메서드이다. 주된 역할은 객체의 초기값을 설정하는 것이다. 일반 메서드와 달리 클래스 이름과 같은 이름을 가지며, 반환형이 없다.
예를 들어 다음 코드에서 Payment(String type, int amount)는 생성자이다.
public class Payment {
private String type;
private int amount;
public Payment(String type, int amount) {
this.type = type;
this.amount = amount;
}
}이 코드는 Payment 객체를 만들 때 결제 방식과 금액을 전달받아, 그 값을 객체의 필드에 저장한다. 즉, 객체를 만드는 순간 필요한 값을 함께 넣어 초기화하는 것이다.
생성자는 크게 기본 생성자와 매개변수 생성자로 나눌 수 있다.
기본 생성자는 매개변수가 없는 생성자이다.
public class Member {
String name;
public Member() {
name = "기본 이름";
}
}기본 생성자는 객체를 생성할 때 별도의 값을 전달하지 않아도 된다는 점에서 간단하다. 따라서 초기값이 이미 정해져 있거나, 일단 객체를 먼저 만든 뒤 나중에 값을 넣는 경우에 사용할 수 있다.
다만 객체마다 서로 다른 값을 가져야 하는 상황에서는 한계가 있다. 예를 들어 학생마다 이름이 다르고, 결제마다 금액이 다른데, 기본 생성자만 사용하면 이런 차이를 객체 생성 시점에 바로 반영하기 어렵다.
매개변수 생성자는 객체를 생성할 때 필요한 값을 함께 전달받는 생성자이다.
public class Member {
String name;
public Member(String name) {
this.name = name;
}
}이 방식은 객체마다 다른 값을 넣어 초기화할 수 있다는 점에서 더 실용적이다. 예를 들어 학생 객체라면 이름과 학년, 결제 객체라면 결제 방식과 금액처럼 처음부터 반드시 필요한 정보가 있다. 이런 값들을 객체를 만드는 순간 함께 전달할 수 있다는 것이 매개변수 생성자의 장점이다.
즉, 기본 생성자는 “값 없이 일단 객체를 만드는 방식”이고, 매개변수 생성자는 “필요한 값을 받으면서 객체를 만드는 방식”이라고 볼 수 있다.
객체 초기화란 객체가 생성된 직후, 의미 있게 사용할 수 있도록 처음 값을 넣어 주는 과정이다. 객체가 제대로 동작하려면 처음부터 필요한 정보가 들어 있어야 한다.
예를 들어 결제 객체를 생각해 보면, 결제 방식과 금액이 정해지지 않은 객체는 실제로 사용하기 어렵다. 이런 경우 생성자를 활용하면 객체를 만드는 순간 필요한 값을 함께 설정할 수 있다.
Payment payment = new Payment("card", 10000);위 코드는 "card"와 10000이라는 값을 전달하여 결제 객체를 생성한다. 이렇게 하면 객체가 생성되는 동시에 필요한 정보가 모두 들어간 상태가 되므로, 이후 로직에서도 더 안정적으로 사용할 수 있다.
생성자를 사용하는 가장 큰 이유는 객체를 처음부터 올바른 상태로 만들기 위해서이다. 만약 생성자를 사용하지 않고, 빈 객체를 만든 뒤 나중에 값을 하나씩 넣는다면 객체가 불완전한 상태로 존재할 수 있다.
예를 들어 다음과 같은 방식이 가능하다고 해 보자.
Payment payment = new Payment();
payment.type = "card";
payment.amount = 10000;이 방식은 객체를 만든 뒤 값을 따로 넣는 구조이다. 하지만 중간에 값이 빠질 수도 있고, 잘못된 값이 들어갈 가능성도 있다. 반면 매개변수 생성자를 사용하면 객체를 만드는 순간 필요한 값이 함께 전달되므로, 객체가 보다 완전한 상태에서 시작할 수 있다.
또한 생성자는 코드의 의도를 더 분명하게 보여 준다.
Payment payment = new Payment("card", 10000);이 한 줄만 보아도 어떤 종류의 결제 객체가 생성되는지 바로 이해할 수 있다. 따라서 생성자는 코드의 가독성과 안정성을 높이는 데에도 도움이 된다.
생성자는 다양한 객체에서 활용할 수 있다. 예를 들어 학생 객체라면 이름과 학년이 필요할 수 있다.
public class Student {
private String name;
private int grade;
public Student(String name, int grade) {
this.name = name;
this.grade = grade;
}
}이 경우 학생 객체를 생성할 때 이름과 학년을 함께 받아 초기화할 수 있다. 결제 객체 역시 마찬가지로 결제 방식과 금액이 반드시 필요하다면, 생성자를 통해 객체를 만드는 순간 그 값을 설정하는 것이 자연스럽다.
이번에 결제 시스템 리팩토링 과제를 하면서도 생성자를 사용하는 이유를 더 분명하게 느낄 수 있었다. 기존에는 객체를 먼저 만든 뒤 필드에 값을 대입하는 방식이었지만, 생성자를 사용하면 필요한 값을 한 번에 전달해 객체를 더 안전하게 만들 수 있었다. 이 과정에서 생성자는 단순한 문법이 아니라, 객체지향적인 구조를 만드는 데 중요한 역할을 한다는 점을 이해하게 되었다.
생성자는 객체가 생성될 때 자동으로 호출되어 객체의 초기 상태를 설정하는 특별한 메서드이다. 기본 생성자는 별도의 값을 받지 않고 객체를 생성하는 방식이고, 매개변수 생성자는 필요한 값을 함께 받아 객체를 보다 구체적으로 초기화하는 방식이다. 또한 객체 초기화는 객체를 의미 있게 사용하기 위한 출발점이며, 생성자는 이를 가장 자연스럽게 수행하는 방법이라고 할 수 있다.
이번 내용을 정리하면서 생성자는 단순히 객체를 만드는 문법이 아니라, 객체를 올바른 상태로 시작하게 만드는 핵심 장치라는 점을 알게 되었다. 앞으로 클래스를 설계할 때도 객체가 처음 생성될 때 어떤 값이 반드시 필요한지 생각하면서 생성자를 활용해야겠다고 느꼈다.
댓글 0