JAVA
JAVA 생성자(Constructor), this() / this, super() / super
anjoo24
2024. 2. 15. 22:46
생성자(Constructor)
객체 생성 시 호출되는 특수 목적의 멤버함수(메소드), 객체 초기화에 사용
1. 생성자 이름 = 클래스 이름
2. 리턴 X
3. 객체 생성 시 자동으로 한번 호출
4. 오버로딩 가능
5. 생성자 없을 시 자바 컴파일러가 기본생성자 자동 제공
만약 매개변수를 가지는 생성자를 하나 이상 정의 후 기본 생성자 호출하면 오류!
Why? 생성자 정의가 하나라도 있으면 컴파일러는 기본 생성자 자동 생성하지 않음
기본 생성자? = 매개변수 x, 명령어 x
만약 아래와 같이 Person 객체를 생성하면 기본 생성자를 사용해 생성된 것
Person p = new Person();
this()
같은 클래스 내의 다른 생성자 호출할 때 사용, 생성자 코드에만 사용 가능
현재 속한 클래스의 생성자 호출 시 사용
생성자 오버로딩을 활용, 중복 코드 줄이고 하나의 생성자에 공통 초기화 작업 처리
this
현재 속한 클래스의 인스턴스(객체) 자신을 의미
객체 자신을 가리키는 reference 변수, 자신 객체에 접근 시 시용
사용법 1. 인스턴스 변수와 로컬 변수 구분 = 클래스의 인스턴스 변수와 메서드 매개변수가 이름 같을 때 구분
2. 현재 객체 다른 메서드로 전달 = 현재 객체를 다른 메서드나 생성자로 전달할 때
3. 메서드 체이닝 = 구현할 때 현재 객체를 반환하여 메서드 호출을 연속적으로 수행하도록
*this()
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Book(String name) {
this(name, 15);
}
}
*this
// 1. 인스턴스 변수와 로컬 변수 구분
public class Person {
private String name;
public void setName(String name) {
this.name = name; // this.name 인스턴스 변수, name은 메서드의 매개변수
}
}
// 2. 현재 객체 다른 메서드로 전달
public class Person {
public void eye() {
System.out.println("Person eye");
}
public void see() {
this.eye(); // this를 사용하여 현재 객체의 eye 메서드 호출
}
}
// 3. 메서드 체이닝
public class MyClass {
private int value;
public MyClass setValue(int value) {
this.value = value;
return this; // return this는 현재 객체를 반환한다는 뜻
}
public void printValue() {
System.out.println("Value: " + this.value);
}
}
// 위에 return this의 반환값은 obj 객체의 setValue(10)
MyClass obj = new MyClass().setValue(10).printValue();
super()
부모의 기본 생성자 호출, 부모 클래스 멤버 초기화
* super()는 반드시 자식 생성자 첫 줄에 위치해야 *.
1. (기본) 자식클래스가 명시적으로 생성자 생성하지 않으면 컴파일러에서 빈 생성자를 자동으로 생성
2. (명시적) 자식생성자를 선언하고 명시적으로 부모생성자 호출
super
부모 메서드 호출: 예시) super.eat();
(오버라이딩) 자식 클래스에서 메소드 재정의하면 부모 객체 메소드가 아니라 재정의된 자식 메소드 사용
* super()
// 1. 기본 super()
public child() {
super();
}
// 2. 명시적 super()
public child(String name, int age, ...){
super(name, age); // 부모의 생성자 호출
...
}