class Car{
String color; // 색상
String gearType; // 변속기 종류
int door; // 문의 개수
Car (){} // 기본생성자
Car (String c, String g, int d){
color c = c;
gearType = g;
door = d;
}
}
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;
를 Car c = new Car("white", "auto", 4)
로 한결 직관적이고 간결하게 만들 수 있다.
인스턴스를 생성할 때는 다음의 2가지 사항을 결정해야 한다.
1) 클래스 : 어떤 클래스의 인스턴스를 생성할 것인가?
2) 생성자 : 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?
Car c1과 Car c2는 동일하지만, c2의 생성자 선언이 더 간결하고 직관적이다.
1) 생상자의 이름으로 클래스 대신 this 사용.
2) 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출 가능.
Car(String color){
door = 5;
Car(color, "auto", 4);
}
Car
대신 this
를 사용해야하는데 그러지 않았고, 첫 째 줄이 아닌 두번째 줄에 사용했기 때문이다.Car() {
color = "white";
gearType = "auto";
door = 4;
}
를
Car(){
this("white", "auto", 4);
}
로 나타낼 수 있다.
Car(String c, String g, int d){
color = c; // color는 iv(인스턴스변수) c는 lv(지역변수)
gearType = g;
door = d;
}
color = c;
는 생성자의 매개변수로 선언된 지역변수 c의 값을 인스턴스변수 color에 저장한다. 이때 color와 c는 이름만으로 구분되므로 아무런 문제가 없다.Car(String color, String gearType, int door){
this.color = color;
this.gearType = gearType;
this.door = door;
}
this.color
는 인스턴스 변수, color
는 지역변수라고 구별 가능하다. 만약 둘 다 color
를 사용한다면 모두 지역변수로 간주된다. this
를 사용해서 구별되도록 하는 것이 의미가 더 명확하고 이해하기 쉽다.this : 인스턴스 자신을 가리키는 참조변수. 인스턴스 주소가 저장되어 있음.
this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용.
class InitTest{
int x; // 인스턴스 변수
int y = x; // 인스턴스 변수
void method(){
int i; // 지역변수
int j = i; // 에러 발생. 지역변수를 초기화하지 않고 사용.
}
}
int y = x;
같이 사용할 수 있다.멤버변수(클래스 변수와 인스턴스 변수)와 배열의 초기화는 선택이지만, 지역변수의 초기화는 필수이다.
1) 클래스변수(cv) 초기화 > 인스턴스 변수(iv) 초기화
2) 자동 초기화 > 명시적 초기화(간단) > 초기화 블럭. 생성자 (복잡)
class Car{
int door = 4; // 기본형(primitive type)변수 초기화
Engine e = new Engine(); // 참조형(reference type)변수 초기화
// ....
}
명시적 초기화는 간단하고 명료하지만, 보다 복잡한 초기화 작업이 필요할 때는 '초기화 블럭(initialization block)'또는 생성자를 사용해야한다.
초기화 블럭에는 '클래스 초기화 블럭'과 '인스턴스 초기화 블럭' 두 가지 종류가 있다.
클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용.
인스턴스 초기화 블럭 : 인스턴스 변수의 복잡한 초기화에 사용.
인스턴스 초기화 블럭은 단순히 클래스 내에 블럭{}을 만들고 그 안에 코드를 작성하면 된다.
클래스 초기화 블럭은 인스턴스 초기화 블럭 앞에 단순히 static을 덧붙이기만 하면된다.
extends
와 함께 상속받고자 하는 클래스의 이름을 붙여주면 된다. class Parent {}
class Child extends Parent {
///
}
extends
인 이유이기도 하다.자손 클래스는 조상 클래스의 모든 멤버를 상속받는다. (단, 생성자와 초기화 블럭은 상속되지 않음)
자손 클래스의 멤버 개수는 조상 클래스보다 많거나 같다.