자바

[JAVA] 생성자

planting grass 2025. 3. 6. 09:52
728x90

생성자(Constructor)는 클래스의 객체가 생성될 때 자동으로 호출되는 특별한 메서드다. 생성자는 객체의 초기 상태를 설정하는 역할을 하며, 일반적으로 멤버 변수의 초기화에 사용된다.

생성자의 특징은 아래와 같다.

  • 클래스의 이름과 동일해야 한다.
    • 생성자의 이름은 클래스의 이름과 동일해야 한다.
  • 리턴 타입이 없다.
    • 생성자는 void를 포함한 어떠한 반환 타입도 가지지 않는다.
  • 객체가 생성될 때 자동으로 실행된다.
    • new 키워드를 사용하여 객체를 생성할 때 자동으로 호출된다.
    • 주의할점) 생성자를 1줄이라도 작성했다면 컴파일러는 자동으로 작성해주지 않는다.

사용 예시

기본 생성자

생성자를 명시적으로 정의하지 않으면, 자바 컴파일러가 기본 생성자(매개변수가 없는 생성자)를 자동으로 추가해준다.

class Person {
    String name;

    // 기본 생성자 (컴파일러가 자동 추가)
    public Person() {
        System.out.println("기본 생성자 호출됨");
        this.name = "홍길동"; // 기본값 설정 가능
    }
}

public class Main {
    public static void main(String[] args) {
        Person p = new Person(); // 기본 생성자 호출
        System.out.println(p.name); // 홍길동 출력
    }
}

매개변수가 있는 생성자(Parameter Constructor)

class Person {
    String name;

    // 매개변수 있는 생성자
    public Person(String name) {
        this.name = name; // 멤버 변수 초기화
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("이순신");
        Person p2 = new Person("김유신");

        System.out.println(p1.name); // 이순신
        System.out.println(p2.name); // 김유신
    }
}

생성자 오버로딩(Constructor Overloading)

class Person {
    String name;
    int age;

    // 기본 생성자
    public Person() {
        this.name = "홍길동";
        this.age = 20;
    }

    // 매개변수 1개
    public Person(String name) {
        this.name = name;
        this.age = 20;
    }

    // 매개변수 2개
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person("이순신");
        Person p3 = new Person("강감찬", 45);

        System.out.println(p1.name + ", " + p1.age); // 홍길동, 20
        System.out.println(p2.name + ", " + p2.age); // 이순신, 20
        System.out.println(p3.name + ", " + p3.age); // 강감찬, 45
    }
}

this()를 사용한 생성자

this()는생성자 내부에서 멤버 변수와 지역 변수의 이름이 동일할 때 구분하는 용도로 사용한다.

class Person {
    String name;

    // 생성자
    public Person(String name) {
        this.name = name; // this를 사용하여 멤버 변수와 지역 변수 구분
    }
}

또한, this()를 이용하면 같은 클래스 내의 다른 생성자를 호출할 수 있다.

이는 중복 코드를 줄이고 유지보수성을 높이는 효과가 있다.

class Person {
    String name;
    int age;

    // 기본 생성자
    public Person() {
        this("홍길동", 20); // 아래의 두 번째 생성자 호출
    }

    // 매개변수 2개 있는 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person(); // 기본 생성자 호출 -> "홍길동", 20으로 초기화됨
        System.out.println(p1.name + ", " + p1.age); // 홍길동, 20
    }
}

super()를 이용한 부모 생성자 호출

super()는 부모 클래스의 생성자를 호출할 때 사용된다.

class Animal {
    String type;

    public Animal(String type) {
        this.type = type;
    }
}

class Dog extends Animal {
    String name;

    public Dog(String name) {
        super("강아지"); // 부모 클래스의 생성자 호출
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Dog d = new Dog("바둑이");
        System.out.println(d.type + ": " + d.name); // 강아지: 바둑이
    }
}
728x90