IMCAT.DEV
로그인 가입
Java 입문 객체지향

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세

코드 설명

  1. Person 클래스 정의: name과 age라는 두 개의 필드를 가집니다.
  2. Person 생성자: 두 개의 매개변수를 받아서 필드를 초기화하며, 생성자 호출 메시지를 출력합니다.
  3. Main 클래스의 main 메소드: Person 객체를 두 개 생성합니다. 생성자 호출 시 초기화된 값이 출력됩니다.
  4. 4. 실전 활용 예제

  5. 쇼핑몰 장바구니 구현
  6. 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) {
            // 아이템 추가 로직
        }
    }

    이 예제는 쇼핑몰에서 장바구니를 구현하는 데 사용됩니다. 생성자를 통해 장바구니에 들어갈 최대 아이템 수를 초기화합니다.

  7. 게임 캐릭터 생성
  8. 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() 메소드를 사용하는 경우가 있습니다. 이는 가비지 컬렉션이 호출되기 전에 호출되지만, 언제 호출될지 예측할 수 없으므로 사용에 주의해야 합니다.

    6. 정리

  9. 생성자는 객체의 초기 상태를 설정하는 중요한 역할을 합니다.
  10. Java에서는 소멸자가 없지만, 가비지 컬렉터가 자동으로 메모리를 관리합니다.
  11. 생성자 오버로딩을 통해 다양한 초기화를 지원할 수 있습니다.
  12. 실무에서 생성자는 장바구니, 캐릭터 등 다양한 객체 생성에 활용됩니다.
  13. 다음에 학습하면 좋은 주제는 '메소드 오버로딩'과 '가비지 컬렉션의 원리'입니다.