생성자란?
자바에서 생성자는 객체를 초기화하는 메소드입니다.
클래스의 인스턴스를 생성할 때 자동으로 호출되며, 객체의 초기 상태를 설정합니다.
객체를 생성하면, 객체의 인스턴스 변수는 해당 데이터 타입의 기본값으로 초기화됩니다. 그러나 생성자를 사용하면 객체 생성시에 인스턴스 변수를 원하는 값으로 초기화할 수 있습니다.
생성자는 객체 지향 프로그래밍에서 중요한 역할을 합니다. 생성자는 다음과 같은 작업을 수행할 수 있습니다.
- 인스턴스 변수 초기화: 생성자는 인스턴스 변수를 초기화합니다. 생성자에 전달되는 인수를 통해 인스턴스 변수를 초기화할 수 있습니다.
- 객체 초기화: 생성자는 객체를 초기화합니다. 생성자에 필요한 작업을 수행하여 객체의 초기 상태를 설정합니다.
- 객체 생성 시에 필요한 작업 수행: 생성자는 객체를 생성할 때 필요한 작업을 수행합니다. 예를 들어, 파일을 열거나 데이터베이스 연결을 설정하는 작업을 수행할 수 있습니다.
생성자는 클래스 내부에서 정의됩니다. 생성자의 이름은 클래스의 이름과 같아야 하며, 반환값이 없습니다. 생성자는 객체를 생성할 때 자동으로 호출되며, 인스턴스 변수의 초기화와 객체 초기화를 수행합니다.
생성자는 다음과 같이 사용됩니다.
- 객체 생성: 객체를 생성할 때 생성자를 호출합니다.
- 상속: 상위 클래스의 생성자를 호출하여 하위 클래스를 초기화합니다.
- 인터페이스: 인터페이스는 생성자를 가질 수 없지만, 내부 클래스에서 생성자를 사용할 수 있습니다.
기본생성자와 매개변수가 있는 생성자
기본생성자
기본생성자는 매개변수를 받지 않는 생성자입니다. 클래스에 기본 생성자가 없는 경우 컴파일러가 자동으로 기본 생성자를 만들어줍니다. 기본 생성자는 클래스 내부의 인스턴스 변수를 기본값으로 초기화합니다. 예를 들어, 정수형 변수는 0으로 초기화되고, 참조형 변수는 null로 초기화됩니다.
매개변수가 있는 생성자
인스턴스 생성 시 인자(argument)를 받아 해당 인스턴스의 필드 값을 초기화하는 생성자입니다.
생성자를 호출할 때 인스턴스 생성에 필요한 데이터를 매개변수를 전달하여 전달한 값을 필드에 담아 객체를 생성과 동시에 초기화할 수 있습니다.
public class Cat {
private String name;
private int age;
// 매개변수가 없는 생성자
public Cat() {
super();
}
// 매개변수가 있는 생성자
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
public void meow() {
System.out.println("Meow!");
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
위 코드에서 "Cat" 클래스는 이름(name)과 나이(age)를 가지는 고양이를 나타내는 클래스입니다.
이 클래스에는 두 개의 생성자가 있습니다. 첫 번째 생성자는 매개변수가 없으며, 이름과 나이를 null과 0으로 초기화합니다. 두 번째 생성자는 이름과 나이를 전달받아 초기화합니다.
첫 번째 생성자를 사용하여 객체를 생성하면 다음과 같이 초기화됩니다.
Cat myCat = new Cat();
위 코드에서 "myCat" 객체의 이름은 null이며 나이는 0으로 초기화됩니다.
두 번째 생성자를 사용하여 객체를 생성하면 다음과 같이 초기화됩니다.
Cat yourCat = new Cat("Tiger", 3);
위 코드에서 "yourCat" 객체의 이름은 "Tiger"이며 나이는 3으로 초기화됩니다.
이처럼 생성자를 사용하여 객체를 초기화할 수 있습니다. 생성자는 객체를 초기화하는데 유용하게 사용되며, 객체 생성 시에 필요한 작업을 수행할 수 있습니다.
생성자의 생략 ?!
모든 클래스는 생성자를 가져야 하며, 생성자가 하나도 명시되어 있지 않으면 컴파일러가 자동으로 매개변수가 없는 기본 생성자(default constructor)를 생성합니다.
따라서, 생성자를 명시적으로 작성하지 않더라도, 컴파일러가 자동으로 매개변수가 없는 기본 생성자를 생성해주는 것이지 생성자 자체가 생략되는 것은 아닙니다.
public class Person {
private String name;
private int age;
}
위 클래스에는 생성자가 정의되어 있지 않습니다. 하지만 컴파일러는 자동으로 다음과 같은 기본 생성자를 추가해줍니다.
public class Person {
private String name;
private int age;
public Person() {
super();
}
}
위와 같이 자동으로 추가된 기본 생성자는 인스턴스를 초기화하기 위해 사용될 수 있습니다. 이 생성자를 이용하여 클래스의 인스턴스를 생성할 수 있습니다
Person person = new Person();
이렇게 생성된 person 객체는 name과 age 필드가 초기값인 null과 0으로 초기화된 상태가 됩니다.
그러나,
만약 클래스에 매개변수가 있는 생성자가 하나라도 존재한다면, 컴파일러가 기본 생성자를 자동으로 생성해주지 않습니다. 즉, 매개변수가 있는 생성자만 존재하는 클래스는 객체를 생성할 때 반드시 매개변수를 전달해 주어야 합니다. 따라서, 필요에 따라서는 기본 생성자를 추가해주는 것이 좋습니다.
Reference
https://docs.oracle.com/javase/tutorial/java/index.html
https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
'Java' 카테고리의 다른 글
[ 자바 / Java] 상속과 다형성, 그리고 오버라이딩(Overriding) (0) | 2023.03.13 |
---|---|
[자바 / Java] 멤버변수와 클래스변수, 지역변수 (0) | 2023.03.06 |
[자바 / Java] 자바에서 클래스란? / 클래스 vs 객체 vs 인스턴스 (0) | 2023.03.06 |
[ 자바 / Java ] 얕은복사 vs 깊은복사 (shallow copy /deep copy) 배열 (part2) (0) | 2023.03.06 |
[JAVA / 자바] 배열 (part1) (1) | 2023.02.26 |