0929 | 자바의 정석 기초편 :: ch6-32~6-37
생성자 (constructor)
✔ 생성자
: 인스턴스가 생성될 때마다 생성되는 인스턴스(iv) 초기화 메서드
:인스턴스 생성시 수행할 작업 (iv초기화)에 사용
: 하는 일은 iv의 초기화. 초기화 편리하게 하려고 사용
Time t = new Time(); // 객체생성이자 생성자 사용
t.hour = 12; // 초기화
t.minute = 34;
t.second=56;
👉 Time t = new Time(12,34,56); // 생성자 추가하면 한줄로 표현 가능.
✔ 생성자 생성 규칙
: 메서드이므로 생성시 규칙이 있음
① 이름이 클래스 이름과 같아야 한다
② 리턴값이 없다 (void 안붙임, 대부분 대입문이다)
③ 모든 클래스는 1개이상의 생성자가 있어야 한다 Card c = new Card()<- 기본생성자. 컴파일러가 알아서 추가해줌 (단 클래스에 생성자가 하나도없을때)
✔ 기본 생성자
: 매개변수가 없는 생성자
: 생성자가 하나도 없을때에만 컴파일러가 자동 추가해줌
: 제대로된 클래스라면 항상 만들어주는게 기본 원칙.
클래스 이름 () {} // 기본생성자
Class point{
point () { } } // point클래스의 기본 생성자
Class data1{
int value;
}
Class Data2{
int value;
Data2(int x){ // 매개변수가 있는 생성자 1개 존재
value = x;
}
Class Ex{
public static void main(String[]args){
Data1 d1 = new Data1(); // Data1에는 생성자가 없어서 컴파일러가 자동 생성해준 생성자
Data2 d2 = new Data2(); // error. data2() 기본생성자를 호출했으나 끌어올 생성자가 없음.
}
// error msg: The constructor Data2 is undefined
//따라서
Class Data2{
int value;
Data2(int x){ // 매개변수가 있는 생성자
value = x;
Data2(){}; // 직접 기본생성자 추가해줘야 메인메서드에서 쓸 수 있음.
}
✔ 매개변수가 있는 생성자 (↔기본생성자)
: 여러줄 써야할 내용을 간소화
: 한번 틀을 만들어두면 쉽게 만들 수 있음
Car (String color, String gearType, int door){
car c = new Car ("white","auto",4); }
중간에 문자 하나로 간소화한게 끼어있어서 그렇지 결국은 이런뜻.
생성자 this()
✔ this()
: 생성자에서 다른 생성자 호출할 때 사용
: 같은 클래스 안에 있는 생성자들 끼리 호출.
: 서로 호출하는 일이 많아서 코드중복 없이 this로 용이하게 함
:다른 생성자 호출 시 (생성자의) 첫줄에서만 사용 가능
Car (string color, String geartype, int door){}
Car (string color){
door =5;
this (color, "auto", 4);} // error 첫줄에서만 사용가능
참조변수 this
✔ this
: 생성자 this()와 전혀 관계 없음
: 객체자신을 가리키는 참조변수
: 인스턴스 메서드(생성자 포함)에서 사용 가능
: lv와 iv를 구별할 때 사용 (가장 많이 쓰이는 케이스)
String color; // 진짜이름은 this.color
String geartype;
int door;
Car(String c, String g, int d){
// color는 iv, c는 lv
color = c;
geartype = g;
door = d;
//원랜 iv는 참조변수.변수이름 이라 참조변수명이 붙어야하지만 (this.color가 맞음) 같은 클래스이므로 생략가능
// this를 쓰면 이름이 겹쳐도 분간이 용이해진다
Car(String color, String gearType, int door){
// this.color는 iv, color 는 lv
this.color=color;
this.gearType=gearType;
this.door=door;
//this 가 없으면 둘다 (가까이 있는) lv로 간주가 된다. 이름이 같을땐 생략 불가능이므로 this.
※ 정리
this | this(), this(매개변수) |
참조변수 | 생성자 |
: 인스턴스 자신을 가리키는 참조변수 : 인스턴스 주소가 저장되어있다. : 모든 인스턴스 메서드 내에 지역변수로 숨겨진채로 존재 👉 this로 선언 안해도 사용 가능. : static 메서드 내에서 사용 불가 - this는 인스턴스 자신을 가리키는 말이므로 인스턴스 메서드에서만 사용가능 |
같은 클래스 내에서 다른 생성자를 호출할 때 사용 |