생성자 (Constructor)와 this

3085 단어 JavaJava

생성자 (Constructor)

Time t = new Time(); // 기본 생성자
t.hour = 12;
t.minute = 34;
t.second = 56;

Time t = new Time(12,34,56); // 매개변수 있는 생성자 호출, 생성자 쓰는 이유
  • 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 매서드
  • 인스턴스 생성시 수행할 작업(IV 초기화 등)에 사용한다.

조건

  • 생성자 이름은 클래스 이름과 같다.
  • 매개변수 유무에 따른 오버로딩이 가능하다.
  • 반환값이 없다. (void 안 붙임)
  • 모든 클래스는 1개 이상의 생성자를 반드시 가져야 한다.

기본 생성자

class Data1 {
	int value;
	// 컴파일러가 기본 생성자 자동 추가
	// Data1() {}
}

class Data2 {
	int value;

	// 생성자가 하나도 없을 때만 컴파일러가 기본 생성자 자동 추가
	// 생성자가 하나라도 있으니까 기본 생성자 따로 추가해줘야 함
	// Data2() {}
	Data2(int x) {
		value = x;
	}
}

public class c6_6_210413 {
	public static void main(String[] args) {
		Data1 d1 = new Data1();
		Data2 d2 = new Data2(); // ERROR:Data2(){} 기본 생성자 없으면
	}
}
  • 매개변수가 없음
  • 생성자가 하나도 없을 때만 컴파일러가 자동 추가 → 기본 생성자 없고 생성자만 있으면 반드시 기본 생성자 따로 추가

결론

  1. 참조 변수를 선언한다.
  2. 생성자가 아닌 new 연산자가 객체를 생성한다.
  3. 생성자는 호출을 통해 생성한 객체의 IV를 초기화한다.
  4. 객체의 주소(new 연산자의 반환값)를 참조 변수에 연결(대입)한다.

생성자 this()

class Car2 {
	String color; // this.color
	String gearType; // this.gearType
	int door; // this.door
	
    	// 코드 중복 제거하기 위해 this 사용
	Car2(){
		color="white";
		gearType="auto";
		door=4;
	}
    
	Car2() {    
		this("white", "auto", 4); 
        	// 첫 줄
            	// Car2(String c, String g, int d) 호출
        
	}

	Car2(String color) {
		this(color, "auto", 4); 
        	// 첫 줄
            	// Car2(String c, String g, int d) 호출
	}

	Car2(String c, String g, int d) {
		this.color = c;
		this.gearType = g;
		this.door = d;
	}
}
this("white", "auto", 4);
  • 생성자에서 다른 생성자 호출할 때 사용한다.
  • 다른 생성자 호출시 첫 줄에서만 사용 가능하다.

참조변수 this

// lv와 iv의 이름이 똑같으므로 this 생략 불가
Car2(String color, String gearType, int door) { // lv
	this.color = color; // iv = lv
	this.gearType = gearType;
	this.door = door;
}

Car2(String c, String g, int d) { // lv
	this color = c; // iv = lv
	gearType = g; // this 생략 가능
	door = d;
}
static long add(long a, long b) {
	return a + b; // 객체 생성 여부 모르기 때문에 iv 사용 불가하여 this도 사용 불가
  • 인스턴스 자신을 가리키는 참조 변수
  • 인스턴스 메서드(생성자 포함)에서 사용 가능하다.
  • 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용한다.
  • 생성자 this()와 다르다.

요약

this

  • 객체 자신을 가리키는 참조 변수, 객체의 주소가 저장되어 있다.
  • 모든 인스턴스 메서드에 지역 변수로 숨겨진 채로 존재하여 선언하지 않고 사용 가능하다.
  • lv와 iv를 구분하기 위해 사용한다.
  • 생성자와 인스턴스 메서드에서 사용 가능하며 클래스 메서드에서는 사용 불가하다.

this(), this(매개변수)

생성자로써 같은 클래스의 다른 생성자를 호출할 때 사용한다.

좋은 웹페이지 즐겨찾기