생성자란?
클래스의 인스턴스를 초기화하는데 사용되는 메서드
클래스의 이름과 동일하며, 반환값이 없고, 클래스의 인스턴스가 생성될 때 자동 호출됨
인스턴스 변수의 초기값을 설정하거나 매개변수를 받아들이고 이를 인스턴스 변수에 할당하거나 다른 메서드를 호출하여 인스턴스를 초기화하는 등의 작업을 수행함
인스턴스 변수의 초기값을 설정하는 생성자 예시 코드
public class Person {
private String name;
private int age;
public Person() {
this.name = "Unknown";
this.age = 0;
}
}
Person person = new Person(); // 생성자 호출하여 인스턴스 초기화
매개변수를 받아들이고 이를 인스턴스 변수에 할당하는 생성자 예시 코드
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person person = new Person("John", 25); // 생성자 호출하여 인스턴스 초기화
다른 메서드를 호출하여 인스턴스를 초기화하는 생성자 예시 코드
public class Person {
private String name;
private int age;
public Person(String name) {
this.name = name;
initAge();
}
private void initAge() {
this.age = 0;
}
}
Person person = new Person("John"); // 생성자 호출하여 인스턴스 초기화
인스턴스 변수의 초기값을 설정하는 생성자 예시 코드생성자의 특징
1. 클래스 이름과 동일
2. 반환값이 없음
3. 클래스의 인스턴스가 생성될 때 자동으로 호출됨
4. 명시적으로 정의된 생성자가 없는 경우, 컴파일러는 기본 생성자를 자동으로 제공함
5. 오버로딩될 수 있음 즉, 매개변수가 다른 여러 개의 생성자를 클래스에 정의할 수 있음
오버로딩의 예시
public class MyClass {
private int x;
private int y;
public MyClass() {
this.x = 0;
this.y = 0;
}
public MyClass(int x, int y) {
this.x = x;
this.y = y;
}
}
MyClass obj1 = new MyClass(); // 기본 생성자 호출
MyClass obj2 = new MyClass(10); // 매개변수 있는 생성자 호출
*** 클래스에 오버로딩된 생성자가 하나 이상 있는 경우, 기본 생성자가 자동으로 생성되지않음.
따라서, 기본 생성자를 사용하려면 클래스에 기본 생성자를 명시적으로 정의해야함
메서드와 생성자의 차이는?
메서드, 생성자는 모두 클래스의 멤버이나 목적과 사용 방법에 차이가 있음
* 목적
메서드 - 클래스의 기능을 구현하는 블록
생성자 - 클래스의 인스턴스를 초기화하는 특별한 메서드
* 이름
메서드 - 임의의 이름
생성자 - 클래스와 동일한 이름
* 반환값
메서드 - 반환값이 있음. 없는 경우 void를 반환함
생성자 - 반환값이 없음
* 호출
메서드 - 클래스의 인스턴스 생성 후, 인스턴스를 사용하여 메서드 호출
생성자 - new 키워드를 사용해 클래스의 인스턴스를 생성할 때 자동으로 호출
상속받은 클래스의 생성자는 어떻게 호출될까?
자식 클래스를 호출하는 경우, 부모 클래스의 생성자가 먼저 호출된 후, 자식 클래스의 생성자가 호출됨
이는 자식 클래스의 인스턴스를 생성하기 전에 부모 클래스의 인스턴스가 먼저 생성되어야 하기 때문.
만약, 자식 클래스에서 부모 클래스의 생성자를 명시적으로 호출하지 않으면, 컴파일러는 자동으로 부모 클래스의 기본 생성자를 호출함.
하지만, 부모 클래스에 매개변수가 있는 생성자가 있는 경우, 자식 클래스에서는 부모 클래스의 생성자를 명시적으로 호출하여야 함.
부모 클래스에 매개변수가 있는 생성자만 존재하고 기본 생성자는 없는데 자식 클래스에서 호출할 부모 생성자를 명시하지도 않았다면 컴파일러는 오류를 발생시킴
예시 코드로 알아본다면?
class Parent {
int x = 100;
Parent() {
this(500);
}
Parent(int x) {
this.x = x;
}
int getX() {
return x;
}
}
class Child extends Parent {
int x = 4000;
Child() {
this(5000);
}
Child(int x) {
this.x = x;
}
}
public class Main {
public static void main(String[] args) {
Child obj = new Child();
System.out.println(obj.getX());
}
}
//500
이때 출력값은 500이 됨
자식 클래스 인스턴스가 생성될 때 부모 클래스의 생성자를 먼저 생성시킴
자식 클래스에서 호출할 부모 생성자를 명시하지않았다면, 기본 생성자가 자동으로 호출됨
따라서 Parent 기본생성자가 호출되어 Parent x 값은 500이 되고 getX에서 반환되는 값은 500이 되기때문에 500이 출력됨
왜 생성자를 사용할까?
객체의 초기화를 보장한다.
-> 객체가 생성될 때 자동으로 호출됨으로 객체의 초기화를 보장함. 객체가 사용될 때 일관성 있는 상태를 유지할 수 있음
코드의 중복을 방지한다.
-> 객체 초기화에 필요한 코드를 하나의 메서드로 정의할 수 있다.
객체 생성 시점에 필요한 초기화 작업을 수행할 수 있다.
-> 객체 생성시점에 필요한 초기화 작업을 생성자에서 수행할 수 있어 객체의 일관성을 유지하고 오류를 방지할 수 있음
객체 생성 시 인자를 전달할 수 있다.
생성자는 인자를 전달받을 수 있다. 따라서 인자를 전달받아 객체의 초기값을 설정할 수 있다.
'개발공부 > Java & Spring' 카테고리의 다른 글
[Java] private 멤버 변수를 사용하는 이유 (0) | 2023.04.24 |
---|---|
[Spring] CSR, SSR (0) | 2023.04.24 |
[Springboot] 기본 동작 환경 (0) | 2023.04.21 |