그저 내가 되었고

☕️Java:: 생성자(Constructor) 본문

개발/Java

☕️Java:: 생성자(Constructor)

hyuunii 2023. 6. 8. 18:13

생성자란?

-> 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'(인스턴스 초기화? 인스턴스 변수들을 초 기화하는 작업)

-> 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용됨.

-> 조건1) 생성자의 이름은 클래스의 이름과 같아야 한다 / 조건2) 생성자는 리턴 값이 없다

-> 생성자 역시 메서드기 때문에 void를 붙여야 하지만, 모든 생성자가 리턴값이 없으므로 void는 생략한다.

-> 생성자는 오버로딩이 가능하므로(생성자 역시 메쏘드) 하나의 클래스에 여러개의 생성자가 존재할 수 있다.

-> 생성자가 인스턴스를 생성하는게 아니다. 그건 new가 한다. 

-> 인스턴스를 생성할 때는 반드시 클래스 내에 정의된 생성자 중의 하나를 선택하여 지정해야 한다. 만약 클래스에 생성자가 하나도 없을 경우 자바 컴파일러가 자동적으로 기본 생성자default consgtructor( 클래스이름() {}  -e.g. Car() {} )를 추가해서 컴파일을 완료한다.

-> 기본 생성자로 인스턴스를 생성하면 이후에 인스턴스 변수의 초기화 작업이 필요하지만, 매개변수가 있는 생성자를 사용하면 인스턴스를 생성하는 동시에 원하는 값으로 초기화할 수 있게 된다. -e.g. Car car = new Car("Red", 4);

 

class WhatIsConstructor ( String v1, String v2 ) {
	//인스턴스 생성시 수행될 코드,
    //주로 인스턴스 변수의 초기화 코드(즉 생성자) 작성
}

class Car {
	Car() {		//매개변수 없는 생성자
    ...
    }
    
    Car ( String color, int wheel ) {		//매개변수 있는 생성자
    ...
    }
    
    ...
    
}

 

 

Car 클래스의 인스턴스를 생성하는 코드에서 수행되는 과정을 단계별로 나누면 다음과 같다.

Car car = new Car();

1. 우변의 연산자 new에 의해 heap메모리에 Car클래스의 인스턴스가 생성됨

2. 우변의 연산자 new 다음의 생성자 Car()가 호출되어 인스턴스 초기화 수행됨

3. 연산자 new의 결과로, 생성된 Car 인스턴스의 주소가 반환되어 참조변수 car에 저장됨

 

 

 

생성자에서 다른 생성자 호출하기:: this(), this

-> 같은 클래스의 멤버들 간에 서로 호출할 수 있듯, 생성자 간에도 서로 호출이 가능하다. 단, 조건이 있음. 조건1)생성자의 이름으로 클래스 이름 대신 this를 사용하기 / 2)한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출 가능

-> this는 참조변수로, 인스턴스 자기 자신을 가리킴. 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는것처럼, this를 통해 인스튼스변수에 접근 가능

-> 그러나 이러한 this는 인스턴스 멤버들만 사용 가능. stati메서드(클래스 메서드)에서는 인스턴스 멤버들을 사용할 수 없는 것처럼 this도 사용 불가능.(static 메서드가 호출된 시점에 인스턶스가 존재하지 않을 가능성도 있기 때문에)

class Car {
    String color;
    String gearType;
    String door;
    
    Car() {
    	this("white", "auto", 4);   //생성자 Car()에서 
                       		    //또다른 생성자 
                                    //Car(String color, String gearType, int door) 호출
    Car(String color) {
    	this(color, "auto", 4);
    }
    
    Car(String color, String gearType, int door) {
	this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

 

 

 

 

출처:: 자바의 정석 3rd edition 1권 OOP