JAVA_생성자

호근·2022년 12월 5일
0

java

목록 보기
12/35

자바의 정석의 내용을 정리하였습니다.

생성자는 메서드다.

생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.

조건

  • 생성자의 이름은 클래스의 이름과 같아야한다.
  • 생성자는 리턴값이 없다.

코드 예

Card C = new Card();
    
    
  1. 연산자 new에 의해서 메모리(heap)영역에 Card클래스의 인스턴스가 생성된다.
  2. 생성자 Card()가 호출되어 수행된다.
  3. 연산자 new의 결과로, 생성된 Card 인스턴스의 주소가 반환되어 참조변수 C에 저장된다.

뜻도 모르고 써왔던 Card(); → "클래스이름()" 이 바로 생성자였다.

인스턴스를 생성할 때는 반드시 클래스 내에 정의된 생성자 중 하나를 선택하여 지정해야한다.

매개변수가 있는 생성자

생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아 인스턴스 초기화에 사용할 수 있다.

인스턴스마다 각기 다른 값으로 초기화해주는 경우가 많아서 유용하게 쓰인다.


class Car {
	String color;	// 색상
    String gearType;	// 변속기의 종류 - auto, manual
    int door; //	문의 개수

	Car() {} // 생성자
    Car(String c, String g, int d){ // 생성자
    	color = c;
        gearType = g;
        door = d;
        }

}

매개변수가 있는 생성자를 활용하면 인스턴스 생성과 동시에 원하는 값으로 초기화하여 코드를 줄일 수 있다.

class CarTest {
	public static void main(String[] args) {
    	Car c1 = new Car(); // 생성자, Car클래스를 인스턴스화 → c1에 담는다.
        c1.color = "white"; // c1의 인스턴스에 접근
        c1.gearType = "auto";
        c1.door = 4;
        
        Car c2 = Car("White","auto",4); 
       
    }
}

위 코드의 c1.color와 c2.color를 출력해보면 동일하다.
나머지 인스턴스 값도 마찬가지이다.


생성자간 호출 ( this(), this )

같은 클래스의 변수간 호출이 가능하듯,
생성자간 호출도 가능하다.

단, 두 가지 조건을 만족해야한다.

  • 생성자의 이름은 this로 대체한다.
  • 한 생성자에서 다른 생성자를 호출할 때에는 반드시 첫 줄에서만 호출 가능하다.

다음은 에러코드이다.

Car (String color){
	door = 5; 				// 첫 째줄
    Car(color, "auto", 4);	// 에러1. 첫 째줄에서 호출해야함.
    						// 에러2. Car()가 아닌 this로 호출해야함.
}

다음은 올바른 코드이다.

. . . 

Car(){
	this("white","auto",4);		// Car(String color, String gearType, int door)를 호출
}

Car (String color){
    this(color, "auto", 4); 	// color 값 초기화
}

Car(String color, String gearType, int door){
	this.color = color;			// this가 가르키는 값(Car())을 color로 초기화
    this.gearType = gearType; 	// this.color는 인스턴스 변수이고 color는 생성자의 매개변수이다. 서로 구별이 가능하다.
    this.door = door;
}

생성자의 매개변수와 인스턴수변수의 이름이 일치하는 경우는 자주 발생한다.
이런 경우 this를 통해 구분하도록 한다.


생성자를 이용한 인스턴스 복사

코드로 확인하자

class Car {
	String color;
    String gearType;
    int door;

	Car() {
    	this("white",auto,4);
    }
    Car(Car c){ // 1! 인스턴스 복사를 위한 생성자
    	color = c.color;
        gearType = c.gearType;
        door = c.door;
        }

}

주석 1!의 코드는 Car 클래스의 참조변수를 매개변수로 선언한 생성자이다.
매개변수로 넘겨진 참조변수가 지칭하는 Car인스턴스의 인스턴스 변수인 color, gearType, door의 값을 인스턴스 자신으로 복사한다.

위 코드의 1! 줄은 다시 한 번 아래와 같이 개선할 수 있다.

Car(Car c){
// Car(String color, String gearType, int door)
	this(c.color, c.gearType, c.door);
}

객체지향적 코드를 위해서는 반드시 필요한 개념이다.
머리에 새겨넣자.

인스턴스를 생성할때는 다음의 2가지 사항을 결정해야한다.

  • 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
  • 생성자 - 어떤 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?
profile
22.11.28 ~

0개의 댓글