생성자에서 다른 생성자 호출할 때 사용
다른 생성자 호출시 첫 줄에서만 사용가능
- 원래 Car2 클래스를 사용해야 하지만 this()를 사용
Ex) Car(String color) { door = 5; // 첫 줄에 사용하지 않아서 에러 Car(color, "auto", 4); // 클래스 이름 대신 this를 쓰지 않아서 에러 }
- 생성자 = 코드의 중복을 제거를 위해 서로 호출하는 경우가 많다.
- 지정해주지 않으면 디폴트 값을 주어야 한다. (그런데 밑의 코드와 비슷하므로(코드가 중복되므로) 제거해줘야 한다.)
- 코드의 중복을 제거하기 위해서는 n개 중 하나가 호출하면 된다.
인스턴스 자신을 가리키는 참조변수
인스턴스 메서드(생성자 포함)에서 사용가능
지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용
- 참조변수.변수이름
- this가 없을때는 lv로 간주되나, this가 붙으므로써 iv로 간주된다.
- 같은 클래스 안에서는 this 생략 가능
- 클래스에서 this를 선언하지 않아도 같은 클래스일 때, 인스턴스 메서드일 때 사용 가능하다.
- static 메서드 = 객체 생성 없이 호출하기 때문에, iv 사용불가/this사용 불가
- this = 인스턴스 메서드에서만 사용 가능
지역변수(lv)는 수동 초기화 해야함(사용전 꼭!!)
멤버변수(iv,cv)는 자동 초기화된다. (0으로)Ex) class InitTest { int x; // 인스턴스 변수 int y = x; // 인스턴스 변수 void method1() { int i; // 지역변수 int j = i; // 에러. 지역변수를 초기화하지 않고 사용 } }
- i의 값을 모르는데 j에 넣으려고 하기 때문에 에러가 발생
- 이유 : 호출 스택에 쌓이고 없어지는 재사용이 빈번한 메모리(=짧은 시간동안 다른 메모리가 같은 공간을 썼다가 지웠다를 반복 / 0으로 초기화하면 성능이 떨어져서 새로운 값으로 덮어쓴다.)
- 타입마다 조금씩 다르지만, 근본적으로는 0으로 초기화 된다.
1. 명시적 초기화(=) (간단 초기화)
- 선언식(대입연산자)로 초기화
class Car { int door = 4; // 기본형(primitive type) 변수의 초기화 Engine e = new Engine(); // 참조형(reference type) 변수의 초기화
- 참조형 변수가 가질 수 있는 값은 null 아니면 객체주소다.
- null은 기본값으로 0이므로 초기화 해주지 않으면 값이 없다.(=객체가 없다.)
- 참조변수 초기화 = 객체를 넣는 것O / null로 만드는 것X
2.초기화 블럭 (복잡 초기화)
- 괄호 안에 여러 문장을 넣을 수 있다.
- 인스턴스 초기화 블럭 : {} (iv 초기화)
- 클래스 초기화 블럭 : static{} (cv 초기화)
3.생상자 (복잡 초기화)
- iv 초기화
car(String color, String gearType, int door) { // 매개변수 있는 생성자 this.color = color; this.gearType = gearType; this.door = door; }
- 자동초기화 : 알아서 0으로 초기화
- 간단초기화 : 대입연산자로 초기화
- 복잡초기화 : 블럭으로 초기화 / static블럭으로 초기화 / 생성자
- 복잡 초기화 중 static{} 초기화 / 생성자가 많이 사용된다. (각각 cv / iv에 사용)
- 명시적 초기화(=)
- 초기화 블럭 - {}, static{} : cv
- 생성자(iv초기화)
- arr = cv
- 대입 연산자는 배열 생성 작업만 가능 / 난수를 채우기 위해 static{}를 사용한다.
클래스 변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한 번 (클래스가 메모리에 올라갈 때)
인스턴스 변수 초기화 시점 : 인스턴스가 생성될 때 마다
- = 은 간단 초기화
- {}, static{}은 복잡 초기화
Ex) InitTest it = new InitTest();
<cv초기화 과정>- 1 : 자동 초기화
- 2 : 명시적 초기화(간단 초기화)
- 3 : 복잡 초기화(클래스 초기화)
- cv 초기화 과정이 끝나고 iv 초기화 과정이 시작된다.
<iv초기화 과정>
- 1 : 자동 초기화 (cv는 계속 2, iv는 0)
- 2 : 명시적 초기화(간단 초기화) (cv는 2, iv는 1)
- 3 : 복잡 초기화 (cv는 2, iv는 2)
- 4 : 생성자 (cv는 2, iv는 3)
cv가 먼저 초기화 되고, iv가 초기화 된다.
초기화 순서는 1.자동(0으로 만듦) -> 2.간단(=) -> 3.복잡(static{} / 생성자)