생성자(Constructor)
- 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드
- 생성자 이름은 클래스 이름과 같아야 하며, 리턴값이 없음
- 인스턴스를 생성할 때는 반드시 클래스 내에 정의된 생성자 중의 하나를 선택하여 지정해주어야 함.
기본 생성자(Default Constructor)
클래스명(){ }
※주의!※
클래스 내에 생성자가 하나도 없을 때는 컴파일러가 자동적으로 기본 생성자를 추가해준다. 하지만 클래스 내에 생성자가 하나라도 있으면 기본 생성자는 자동으로 생기지 않으므로 정의되지 않은 생성자를 호출하려고 할 때 컴파일 에러가 발생한다.
this(), this
같은 클래스의 다른 생성자를 호출할 때 사용된다.
class Data {
String color;
String type;
int num;
public Data(String color) {
this(color,"memo",2); // (1)
num = 4; // (2)
}
public Data(String color, String type, int num) {
this.color = color; // (3)
this.type = type;
this.num = num;
}
}
(1) 생성자 내에서 다른 생성자를 호출할 때는 클래스 이름이 아닌 this를 사용해야 한다.
(2) this는 생성자의 첫 줄에서만 호출이 가능하다.
(3) 생성자의 매개변수와 인스턴스변수 이름이 같을 경우 서로 구별이 안 되기 때문에 인스턴스 변수 앞에 this를 붙여 인스턴스 자신을 가리킨다. this에는 인스턴스의 주소가 저장되어 있다.
this는 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.
클래스변수는 this 를 사용할 수 없다. static 메서드는 인스턴스를 생성하지 않고 호출될 수 있어 static 메서도가 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문이다.
인스턴스 복사
class Data {
String color;
String type;
int num;
public Data(){
}
public Data(String color){
this.color = color;
}
public Data(Data data) {
color = data.color;
type = data.type;
num = data.num;
}
}
public class Test {
public static void main(String[] args){
Data data1 = new Data("white");
Data data2 = new Data(data1);
data2.color = "blue";
System.out.println(data1.color); // white
System.out.println(data2.color); // blue
System.out.println("-----------------");
data2 = data1; // 같은 인스턴스 주소값 저장
System.out.println(data1.color); // white
System.out.println(data2.color); // white
}
}
변수의 초기화
멤버 변수(클래스 변수와 인스턴스 변수)의 초기화는 선택이지만, 지역변수는 사용하기 전에 반드시 초기화해야 한다.
1. 명시적 초기화
변수를 선언과 동시에 초기화 하는 것
보다 복잡한 초기화 작업이 필요할 때는 초기화 블럭 또는 생성자 사용
2. 초기화 블럭
class Data {
static {
System.out.println("클래스 초기화 블럭");
}
{
System.out.println("인스턴스 초기화 블럭");
}
public Data() {
System.out.println("생성자");
}
}
public class Test {
public static void main(String[] args){
System.out.println("------첫 번째 인스턴스 호출------");
Data data = new Data();
System.out.println("------두 번째 인스턴스 호출------");
Data data2 = new Data();
}
}
출력 결과:
클래스 초기화 블럭
------첫 번째 인스턴스 호출------
인스턴스 초기화 블럭
생성자
------두 번째 인스턴스 호출------
인스턴스 초기화 블럭
생성자
- Data가 메모리에 로딩될 때 클래스 초기화 블럭이 가장 먼저 수행되고 인스턴스가 생성되면서 인스턴스 초기화 블럭이 수행되고 그 다음에 생성자가 수행된다.
- 클래스 초기화 블럭은 처음 메모리에 로딩될 때 한 번만 수행되지만 인스턴스 초기화 블럭은 인스턴스가 생성될 때마다 수행된다.
클래스 변수 초기화 순서: 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭
인스턴스 변수 초기화 순서: 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자
'개인공부' 카테고리의 다른 글
오버로딩, 오버라이딩 정리 (0) | 2022.12.15 |
---|---|
JVM 구조 정리 (0) | 2022.12.14 |
객체지향 4가지 특징 정리 (OOP) (0) | 2022.12.12 |
메서드 (Method) 정리 (0) | 2022.12.10 |
클래스 변수, 인스턴스 변수, 지역 변수 정리 (0) | 2022.12.06 |
댓글