학습
Java 생성자와 소멸자
Java 생성자와 소멸자 — 초급
생성자와 소멸자
1. 도입 (왜 배워야 하는가)
Java에서 생성자와 소멸자는 객체 지향 프로그래밍의 핵심 개념 중 하나입니다. 객체 지향 프로그래밍은 현실 세계의 객체를 모델링하여 소프트웨어를 개발하는 접근 방식입니다. 생성자는 객체가 생성될 때 초기 상태를 설정하는 역할을 하고, 소멸자는 객체가 더 이상 필요하지 않을 때 자원을 해제하는 역할을 합니다. 이 두 개념을 이해하지 못하면 객체의 초기화가 제대로 이루어지지 않거나, 메모리 누수와 같은 문제가 발생할 수 있습니다. 따라서 생성자와 소멸자를 이해하고 적절하게 활용하는 것은 안정적이고 효율적인 코드를 작성하는 데 필수적입니다.
2. 핵심 개념 설명
- 생성자(Constructor): 클래스의 인스턴스가 생성될 때 호출되는 특별한 메소드입니다. 객체의 초기 상태를 설정하는 데 사용됩니다.
- 소멸자(Destructor): Java에서는 명시적으로 존재하지 않지만, 객체가 더 이상 사용되지 않을 때 가비지 컬렉터가 자동으로 메모리를 해제합니다. 사용자가 직접 메모리를 관리할 필요는 없지만, 자원 관리를 위해 finalize() 메소드를 사용할 수 있습니다.
비유
생성자는 신생아가 태어날 때의 신생아 실을 정리하는 것과 같습니다. 소멸자는 아이가 성장하여 집을 떠날 때 남은 물건을 정리하는 것과 비슷합니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| 인스턴스 | 클래스를 기반으로 생성된 객체 |
| 메소드 | 특정 기능을 수행하는 코드 블록 |
| 가비지 컬렉션 | 더 이상 사용되지 않는 객체의 메모리를 자동으로 해제하는 과정 |
3. 기본 코드 예제
class Person {
String name;
int age;
// 생성자
Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("생성자 호출: " + name + ", " + age + "세");
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person("홍길동", 25); // Person 객체 생성
Person p2 = new Person("이순신", 30); // 또 다른 Person 객체 생성
}
}
실행 결과
생성자 호출: 홍길동, 25세
생성자 호출: 이순신, 30세
코드 설명
Person클래스 정의:name과age라는 두 개의 필드를 가집니다.Person생성자: 두 개의 매개변수를 받아서 필드를 초기화하며, 생성자 호출 메시지를 출력합니다.Main클래스의main메소드:Person객체를 두 개 생성합니다. 생성자 호출 시 초기화된 값이 출력됩니다.- 쇼핑몰 장바구니 구현
- 게임 캐릭터 생성
- 생성자는 객체의 초기 상태를 설정하는 중요한 역할을 합니다.
- Java에서는 소멸자가 없지만, 가비지 컬렉터가 자동으로 메모리를 관리합니다.
- 생성자 오버로딩을 통해 다양한 초기화를 지원할 수 있습니다.
- 실무에서 생성자는 장바구니, 캐릭터 등 다양한 객체 생성에 활용됩니다.
- 다음에 학습하면 좋은 주제는 '메소드 오버로딩'과 '가비지 컬렉션의 원리'입니다.
4. 실전 활용 예제
class CartItem {
String productName;
int quantity;
// 생성자
CartItem(String productName, int quantity) {
this.productName = productName;
this.quantity = quantity;
}
}
public class ShoppingCart {
CartItem[] items;
ShoppingCart() {
items = new CartItem[10]; // 최대 10개의 아이템 저장
}
void addItem(String productName, int quantity) {
// 아이템 추가 로직
}
}
이 예제는 쇼핑몰에서 장바구니를 구현하는 데 사용됩니다. 생성자를 통해 장바구니에 들어갈 최대 아이템 수를 초기화합니다.
class Character {
String name;
int health;
// 생성자
Character(String name) {
this.name = name;
this.health = 100; // 기본 건강 상태
}
}
게임 캐릭터를 생성할 때 이름을 입력받고, 기본 건강 상태를 설정합니다.
5. 흔한 실수와 주의사항
1. 생성자 오버로딩을 잊기
잘못된 코드
class Person {
String name;
// 기본 생성자 없음
}
이 경우, 인자를 받지 않는 기본 생성자가 없기 때문에 인자를 받는 생성자만 사용 가능하게 됩니다.
올바른 코드
class Person {
String name;
Person() {
this.name = "익명"; // 기본 생성자
}
}
2. finalize() 메소드 사용 혼동
Java에서 소멸자를 명시적으로 구현할 수 없지만, finalize() 메소드를 사용하는 경우가 있습니다. 이는 가비지 컬렉션이 호출되기 전에 호출되지만, 언제 호출될지 예측할 수 없으므로 사용에 주의해야 합니다.