생성자
생성자는 객체가 생성될 때 호출되는 특수한 메소드입니다. 생성자의 주된 역할은 객체의 초기화로, 인스턴스 변수에 적절한 값을 할당하거나 객체를 초기 상태로 세팅하는 데 사용됩니다.
생성자 종류
1. 기본 생성자
Java에서 생성자를 명시하지 않으면, 컴파일러가 자동으로 기본 생성자를 추가합니다. 기본 생성자는 매개변수가 없는 생성자로, 클래스가 객체화될 때 아무런 초기화 작업을 하지 않고 객체를 생성하는 역할을 합니다.
class User {
String name;
// 생성자가 없으므로 컴파일러가 기본 생성자를 자동으로 추가
}
public class Main {
public static void main(String[] args) {
User user = new User(); // 기본 생성자 호출
System.out.println(user.name); // null (초기화되지 않음)
}
}
위 코드에서 User클래스에 생성자가 명시되어 있지 않지만, 컴파일러가 기본 생성자를 추가하기 때문에 new User()로 객체를 생성할 수 있습니다. 생성된 객체의 name은 초기화되지 않아서 null이 출력됩니다.
2. 명시적 생성자
명시적 생성자는 매개변수를 받아 객체의 인스턴스 변수들을 초기화할 수 있습니다. 이를 통해 객체를 생성할 때 필요한 값을 전달하여 맞춤형 초기화가 가능합니다.
class User {
String name;
User(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
User user = new User("yeo"); // 매개변수를 통해 객체 초기화
System.out.println(user.name); // yeo
}
}
User 클래스는 매개변수를 받는 생성자를 가지고 있으며, 객체를 생성할 때 name을 설정할 수 있습니다. new User("yeo")는 객체를 생성하고 name을 "yeo"로 초기화합니다.
3. 생성자 오버로딩
같은 이름을 가진 여러 생성자를 정의할 수 있습니다. 각 생성자는 매개변수의 개수나 타입이 달리하여 생성자 오버로딩 할 수 있습니다.
class User {
String name;
int age;
// 기본 생성자
User() {
this.name = "Unknown";
this.age = 0;
}
// 매개변수가 있는 생성자
User(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
User user1 = new User(); // 기본 생성자 호출
User user2 = new User("yeo", 20); // 매개변수를 통해 객체 초기화
System.out.println(user1.name + ", " + user1.age); // Unknown, 0
System.out.println(user1.name + ", " + user1.age); // yeo, 20
}
}
생성자에서 다른 생성자 호출
같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능합니다. 이때 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능합니다. 생성자 간 호출할 때 생성자 이름(클래스 이름) 대신 this(), super()를 사용합니다.
1. super(): 부모 클래스의 생성자 호출
자식 클래스가 객체화될 때, 부모 클래스의 생성자가 먼저 호출됩니다. 이는 자식 클래스가 부모 클래스의 특성과 동작을 상속받기 때문입니다. 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출할 때는 super()를 사용합니다.
기본 규칙
- 기본적으로 부모 클래스의 기본 생성자가 자동 호출됩니다.
- 만약 부모 클래스에 매개변수가 있는 생성자만 있을 경우, 자식 클래스에서 명시적으로 super()를 사용하여 호출해야 합니다.
- super()는 생성자의 첫 번째 줄에 위치해야 합니다.
class User {
String name;
// 매개변수가 있는 생성자
User(String name) {
this.name = name;
System.out.println("User Constructor");
}
}
class Student extends User {
String grade;
Student(String name, String grade) {
super(name); // 부모 클래스의 생성자 호출
this.grade = grade;
System.out.rpintln("Student Constructor");
}
}
public class Main {
public static void main(String[] args) {
Student student = new Student("yeo", "Junior");
System.out.println(student.name + ", " + student.grade);
}
}
/** 출력
* User Constructor
* Student Constructor
* yeo, Junior
*/
위 예시에서 Student 클래스는 User 클래스를 상속받고 있습니다. 만약 부모 클래스에 기본 생성자가 있었다면 자동으로 호출하였겠지만, 매개변수를 필요로 하는 생성자만 있기 때문에, super(name)을 통해 부모 클래스의 생성자를 명시적으로 호출하고 있습니다. 출력 결과를 확인하면, 부모 클래스의 생성자가 먼저 실행되고, 그 다음에 자식 클래스의 생성자가 실행됨을 확인할 수 있습니다.
2. this()
- super(): 부모 클래스의 생성자를 호출할 때 사용합니다.
- this(): 같은 클래스 내에서 다른 생성자를 호출할 때 사용합니다.
class User {
String name;
// 부모 클래스 생성자
User(String name) {
this.name = name;
System.out.println("User Constructor");
}
}
class Student extends User {
String grade;
Student(String grade) {
this("Unknown", grade); // this()로 다른 생성자 호출
}
Student(String name, String grade) {
super(name); // super()로 부모 클래스 생성자 호출
this.grade = grade;
}
}
public class Main {
public static void main(String[] args) {
Student student = new Student("yeo", "Junior");
System.out.println(student.name + ", " + student.grade); // Unknown, Junior
}
}
위 예시에서, Student 클래스의 첫 번째 생성자는 this()를 사용하여 두 번째 생성자를 호출하고, 두 번째 생성자는 super()를 사용하여 부모 클래스의 생성자를 호출합니다.
'Java' 카테고리의 다른 글
Java JVM 메모리 구조와 메모리 저장 방식 (1) | 2024.09.18 |
---|---|
Java 상속(Inheritance), 인터페이스(Interface), 추상 클래스(Abstract Class) 차이점 (0) | 2024.09.18 |
Java 객체지향 프로그래밍의 특징과 개념 이해 (0) | 2024.09.16 |
Java 조건문과 반복문: if, switch, for, while 그리고 break와 continue (0) | 2024.09.10 |
Java 변수, 데이터 타입, 리터럴과 상수 차이 (0) | 2024.09.10 |