본문 바로가기
멀티캠퍼스 풀스택 과정/Java의 정석

자바의 정석2-7 생성자 (생성자 this( ), 참조변수this)

by 이쟝 2021. 12. 31.

생성자(constructor): 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드’ 

- 인스턴스 생성 시 수행할 작업(iv 초기화)에 사용

- 생성자가 존재하는 이유는 iv(인스턴스 변수) 초기화를 편하게 하기 위해서!

Time t = new Time( );  생성자 호출 부분

 

1)
Time t = new Time();  // 생성자 호출(기본 생성자)
t.hour = 12;          // iv 초기화
t.minute = 34;        // iv 초기화
t.second = 56;        // iv 초기화

2)
Time t = new Time(12, 34, 56);  // 괄호 안이 생성자, 직접 생성자 추가해야 함

1번과 2번은 같은 코드

생성자(constructor)의 규칙

1. 생성자의 이름클래스 이름과 같아야 한다.

2. 리턴값이 없다.

3. 모든 클래스는 반드시 1개 이상의 생성자를 가져야 한다.

 

클래스 이름(타입 변수명, 타입 변수명, …) {

    // 인스턴스 생성 시 수행될 코드,

    // 주로 인스턴스 변수의 초기화 코드를 적는다.

}

 

*상속에서 자손클래스의 생성자만 선언시에는 부모클래스 생성자가 자동으로 생성!*

 

-> 생성자 오버로딩! ( 오버로딩의 조건에서 2번 매개변수의 개수의 차이(첫 번째 Card는 매개변수 없고, 두 번째 Card는 매개변수 두 개) 때문에 오버로딩이 가능하게 된다.)


기본 생성자(default constructor)

 

1) 매개 변수가 없는 생성자

- 생성자가 하나도 없을 때만, 컴파일러가 자동 추가(기본 생성자가 없고 매개변수 생성자 하나만 있으면 에러!)

- 기본 생성자는 항상 만들어준다!(직접)

 

클래스 이름( ) { }   // 기본 생성자

예) Point( ) { }  // Point클래스의 기본 생성자  

 

class Data_1 {
	int value;
}

class Data_2 {
	int value;
	Data_2() {} // 기본 생성자
	Data_2(int x) {  // 매개변수가 있는 생성자
		value = x;
	}
}

Data_1 d1 = new Data_1();  // 기본 생성자가 하나도 없어서 자동 생성됨
Data_2 d2 = new Data_2();  // 매개변수 생성자도 있고 기본 생성자도 있음
// 만약 매개변수 생성자는 있고 기본 생성자는 없으면 에러!

 

2) 매개 변수가 있는 생성자

 

예제

1) Car클래스를 만들어준 뒤에 색상, 변속기 종류, 문의 개수의 변수가 들어간 생성자를 만들어주고 출력

<출력값> black4auto

 

Car c = new Car("black", "auto", 4);
System.out.printf("%s",c.color);
System.out.printf("%s",c.door);
System.out.printf("%s",c.gearType);

class Car {
	String color;    // 색상
	String gearType; // 변속기 종류 - auto(자동), manual(수동)
	int door;        // 문의 개수
	
	Car() {}  // 기본 생성자
	Car(String c, String g, int d) { // 매개변수가 있는 생성자 
			color = c;
			gearType = g; 
			door = d;	
	}
}

 

 

원래는 왼쪽 코드처럼 초기화를 했지만 매개변수가 있는 생성자를 만들어서 코드를 짧게 작성할 있음!

 

1) 참조변수 c가 생성됨

2) new 연산자로 객체 3개가 생성됨(color, gearType, door)

3) 생성자로 객체 초기화함생성자가 호출되면서 객체(iv) 초기화) -> 값을 넣는다는 뜻

4) 객체와 참조변수를 대입연산자로 연결(객체의 주소를 참조변수에게 전달)

 


생성자 this( )

1) 생성자에서 다른 생성자 호출할 때 사용(코드의 중복을 제거하기 위해서)

2) 다른 생성자 호출 시 첫 줄에서만 사용 가능

 

 

- 첫 번째 Car2( ), 두 번째 Car2( )가 세 번째의 초기화 값을 가져옴(코드의 중복을 제거하기 위해서)

- 첫 번째 Car2( ), 두 번째 Car2( )첫 줄에서 사용!

 

class Car {
	String color;    // 색상
	String gearType; // 변속기 종류 - auto(자동), manual(수동)
	int door;        // 문의 개수
	
	Car() {
    //그 전의 중복 코드 color = "white"; gearType = "auto"; door = 4;
    //this로 Car(String c, Stirng g, int d를 호출)
	this("white", "auto", 4);   
	}  

	Car(String c, String g, int d) { 
	      color = c;      //this.color = c; 에서 this 생략되었음
		gearType = g;   // this.gearType = g; 에서 this 생략되었음
		door = d;	    // this.door = d; 에서 this 생략되었음
	}
}

 

위의 사진과 다른 점은 this의 생략인데 그것을 알려면 참조변수 this를 알아야 한다!


참조변수 this

- 인스턴스 자신을 가리키는 참조변수로 인스턴스의 주소가 저장되어 있음

- 참조변수 this와 생성자 this( )는 비슷하게 생겼지만 다르다!

- 인스턴스 메서드(생성자 포함)에서만 사용 가능(static메서드에서 사용 불가)

- 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재함(선언 안 해도 사용 가능)

ex) long a, b; 라는 iv -> 기본 형식: long this.a, this.b;

- 지역변수(lv)인스턴스 변수(iv)구별할 때 사용

 

Car(String c, String g, int d) { 
      color = c;
      gearType = g;
      door = d;
}
Car(String color, Stirng gearType, int door) {
         this.color = color;
         this.gearType = gearType;
         this.door = door;
}
지역변수(lv) / 인스턴스변수(iv) 지역변수(lv) / 인스턴스변수(iv)

 

인스턴스 변수의 작성 -> 참조변수.변수이름

왼쪽 코드: 기본 형식 this.color = c이지만이지만 lv iv의 이름이 달라서 구분할 수 있기 때문에 this 생략(같은 클래스 안에서 생략 가능)

오른쪽 코드: this 참조변수가 생략되면 color = color; 가 되어서 iv lv를 구분할 수 없기 때문에 this 생략 불가

정석은 오른쪽 코드!