본문 바로가기
프로그래밍/JAVA

초보 자바 프로그래밍(51) - 클래스 생성자

by 머니테크리더 2023. 5. 12.
반응형

자바 클래스 생성자 대표 이미지
자바 클래스 생성자 대표 이미지

🔖 INDEX

     

     

    자바에서 생성자(Constructor)는 클래스의 인스턴스(객체)가 생성될 때 호출되는 특별한 메서드입니다. 이는 객체 초기화에 필요한 코드를 실행하는 데 사용됩니다. 생성자의 이름은 클래스 이름과 반드시 동일해야 하며, 생성자는 반환 타입이 없습니다.

     

    생성자 선언

    생성자는 다음과 같이 선언됩니다:

    public class ClassName {
        // 생성자
        public ClassName() {
            // 초기화 코드
        }
    }

    예를 들어, Person이라는 클래스에 대한 생성자를 선언하면 다음과 같습니다:

    public class Person {
        public Person() {
            System.out.println("Person 객체가 생성되었습니다.");
        }
    }

     

    생성자 호출

    생성자는 new 키워드를 사용하여 클래스의 객체를 생성할 때 자동으로 호출됩니다.

    Person person = new Person();  // Person 생성자가 호출됩니다.

    위의 코드는 Person 클래스의 객체를 생성하고, 이 과정에서 Person 클래스의 생성자가 호출됩니다.

     

     

    매개변수가 있는 생성자

    생성자는 매개변수를 가질 수 있습니다. 이를 이용하면 객체를 생성하면서 동시에 특정 값을 전달할 수 있습니다.

    public class Person {
        String name;
    
        public Person(String name) {
            this.name = name;
        }
    }

    이제 Person 객체를 생성하면서 이름을 전달할 수 있습니다.

    Person person = new Person("홍길동");  // "홍길동"이라는 이름을 가진 Person 객체가 생성됩니다.

     

    기본 생성자

    클래스에 생성자가 명시적으로 정의되어 있지 않으면, 컴파일러는 매개변수가 없는 기본 생성자를 자동으로 제공합니다. 이 기본 생성자는 아무런 작업도 수행하지 않습니다.

    public class Person {
        // 생성자를 정의하지 않았습니다.
    }
    
    Person person = new Person();  // 이 코드는 문제없이 실행됩니다.

    그러나 클래스에 매개변수가 있는 생성자가 하나라도 정의되면, 컴파일러는 기본 생성자를 자동으로 제공하지 않습니다. 이 경우 필요에 따라 명시적으로 기본 생성자를 정의해야 합니다.

    public class Person {
        String name;
    
        public Person(String name) {
            this.name = name;
        }
    
        public Person() {
            // 명시적으로 기본 생성자를 정의했습니다.
        }
    }

    이것이 자바에서 생성자의 기본 개념과 사용 방법입니다. 생성자를 이용하면 객체 생성 시 필요한 초기화 작업을 수행할 수 있어 매우 유용합니다.

     

     

    생성자의 특징

    자바에서 생성자(Constructor)는 클래스의 객체를 초기화하는 데 사용되는 특수한 메서드로, 다음과 같은 특징을 가집니다.

    1. 생성자의 이름은 클래스 이름과 동일합니다.
      • 생성자는 클래스의 이름과 반드시 동일해야 하며, 이는 생성자를 일반 메서드와 구분하는 주요한 특징입니다. 예를 들어, Person이라는 클래스가 있다면, 그에 대한 생성자도 Person으로 이름을 지어야 합니다.
    2. 생성자는 리턴 타입이 없습니다.
      • 생성자는 값을 반환하지 않으며, 심지어 void도 선언하지 않습니다. 이는 생성자가 클래스의 인스턴스를 반환하는 것이 아니라, 객체의 초기화에 사용되는 것이기 때문입니다.
    3. 생성자는 자동으로 호출됩니다.
      • new 연산자를 사용해 클래스의 객체를 생성할 때, 생성자는 자동으로 호출됩니다. 사용자는 따로 호출할 필요가 없습니다.
    4. 생성자는 오버로딩될 수 있습니다.
      • 즉, 클래스 내에 같은 이름의 생성자를 여러 개 가질 수 있습니다. 이 때, 각 생성자는 매개변수의 타입이나 개수가 달라야 합니다.
    5. 생성자는 상속되지 않습니다.
      • 부모 클래스의 생성자는 자식 클래스에게 상속되지 않습니다. 그러나 자식 클래스에서는 super 키워드를 사용해 부모 클래스의 생성자를 호출할 수 있습니다.
    6. 기본 생성자
      • 클래스에 생성자가 명시적으로 정의되어 있지 않을 경우, 컴파일러는 매개변수가 없는 기본 생성자를 자동으로 제공합니다. 그러나 클래스에 매개변수가 있는 생성자가 하나라도 정의되면, 컴파일러는 기본 생성자를 자동으로 제공하지 않습니다.

    이러한 특징들을 이해하고 사용함으로써, 객체 초기화 과정을 통제하고, 필요한 동작을 정의할 수 있습니다.

     

    자바에서 소멸자는?

    자바는 메모리 관리를 자동화하는 언어입니다. 이는 가비지 컬렉터(Garbage Collector)라는 메모리 관리 시스템이 객체의 생명 주기를 관리하며, 더 이상 사용되지 않는 객체를 자동으로 메모리에서 제거한다는 것을 의미합니다. 따라서, 자바에는 C++의 소멸자(Destructor)와 같은 개념이 직접적으로는 존재하지 않습니다.

    그러나, 객체가 더 이상 사용되지 않아 메모리에서 제거되기 전에 수행해야 하는 특정 작업이 있다면, finalize() 메서드를 재정의(Override)하여 사용할 수 있습니다. 이 메서드는 객체가 가비지 컬렉터에 의해 수집되기 직전에 호출됩니다. finalize() 메서드는 Object 클래스에 정의되어 있으므로 모든 클래스가 이를 상속받아 사용할 수 있습니다.

     

    다음은 finalize() 메서드의 예제입니다:

    public class MyClass {
        // 객체 생성 등의 코드...
    
        @Override
        protected void finalize() throws Throwable {
            // 여기에 객체가 소멸되기 전에 실행되어야 할 코드를 작성합니다.
            // 예를 들어, 열려 있는 파일을 닫거나 네트워크 연결을 종료하는 등의 작업을 수행할 수 있습니다.
    
            super.finalize();
        }
    }

    그러나 finalize() 메서드는 신뢰성이 낮고, 예측할 수 없는 시점에 호출되며, 가비지 컬렉션 실행 시점은 JVM에 따라 달라질 수 있기 때문에, 가능하면 이를 사용하지 않는 것이 좋습니다. 대신, 자원을 명시적으로 해제하는 방법(ex. try-with-resources)을 사용하는 것이 권장됩니다.

     

     

    댓글