생성자는 인스턴스의 값들을 초기화하는 인스턴스 생성을 초기화하는 역할을 한다.
this()로 다른 생성자를 호출할 때, 호출한 생성자가 무슨일을 할 줄 모르는 상태인데 this() 호출 보다 먼저 값들을 초기화한다고 하면,
다른 생성자를 호출할 때 다른 스테이트가 올라가는 것을 허용하지 않는다. 그래서 호출은 가장 첫줄에 써야 한다.
public class Constructor {
int x;
int y;
String z;
public Constructor(){ // 기본 생성자, 구현하지 않아도 알아서 생긴다.
this(0,0);
// x = 1;
// y = 2;
// z = "자동 초기화 값이 들어간다.";
}
// 파라미터 생성자
public Constructor(int x, int y, String z){ //오버로딩
this.x = x; // this는 멤버 변수를 표기하기 위해 사용될 수 있다.
this.y = y;
this.z = z;
}
public Constructor(int a, int b){
this(a,b,"");
// 자기 자신을 가르키는 애 위에 함수가 호출됨.
// this는 무조건 첫줄에만 쓰일 수 있다.(단한번) 규칙입니다.
// x = a;
// y = b;
// z = "";
}
}
public class MyDate {
private int day;
private int month;
private int year;
private boolean isVaild = true;
public void setDay(int day){
this.day = day;
}
public int getDay(){
return day;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
if(month <1 || month > 12){
isVaild = false;
}
this.month = month;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public void showDate(){
if (isVaild){
System.out.println(this.year + "년" + this.month + "월" +this.day+"일");
}else{
System.out.println("유효하지 않은 범위 입니다.");
}
}
}
public class MyDateTest {
public static void main(String[] args) {
MyDate date = new MyDate();
date.setYear(2019);
date.setMonth(13);
date.setDay(10);
date.showDate();
}
}
인스턴스 자신의 주소를 반환할 일이 있으면 this를 반환 하면 된다.
day로부터 setYear라는 메소드를 호출하게 되면 setYear는 BirthDay에 대한 메소드이니깐
setYear의 세그멘테이션이 stack영역에 만들어지고 만약 setYear 안에서 this를 썼다하면 힙영역의 BirthDay에 대한 메모리를 가리킨다.
인스턴스 내부에서(객체 내부에서) 자기 자신이 생성된 메모리 주소를 가리킨다.
인스턴스가 여러 개 생성 됬다 하면 각각의 this는 다 다름 코드상에서 this하나만 쓰지만 각각은 다 다르다
여기서 stack 영역에 this가 들어가게 되는데 왜 this가 들어가는지 이해가 안 갔는데
메인에서 this가 date.setYear() 이런식으로 호출이 되어있다면 this는 date변수 대신이라고 생각해도 될까?
로컬변수에 this는 참조변수로 생성된다. 그런의미로 이해하면 될 것 같다.
public Person getPerson(){
return this;
}