[자바의 정석] 생성자 (constructor)

강신현·2022년 5월 19일
0

자바의 정석

목록 보기
7/15

✅ 생성자 ✅ new 연산자 ✅ this ✅ 인스턴스 복사

생성자

constructor

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

  • 인스턴스 변수의 초기화 or 인스턴스 생성시 수행할 작업에 사용
  • 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.
  • 인스턴스를 생성하는 것은 생성자가 아닌 연산자 new라는 것을 주의하자.

- 조건

  1. 생성자의 이름은 클래스의 이름과 같아야 한다.
  2. 생성자는 리턴 값이 없다. (하지만 void를 쓰지 않는다.)

- 예시

class Card{
	// 매개변수가 없는 생성자
	Card(){
    	...
    }
    
   	// 매개변수가 있는 생성자
    Card(String k, int num){
    	...
    }
}

- 인스턴스 생성 과정

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

기본 생성자

default constructor

클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다.

  • 생성자가 하나라도 있으면 컴파일러는 기본 생성자를 추가하지 않는다.

- 예시

class Data1{
	int value;
    // 생성자 없으므로 컴파일러가 기본 생성자 추가
}

class Data2{
	int value;
    Data2(int){ // 매개변수가 있는 생성자
    	value = x;
    }
    // 생성자가 있으므로 컴파일러는 기본 생성자를 추가하지 않음
    // 기본 생성자를 만들지 않았음.
}

class ConstructorTest{
	public static void main(String[] args){
    	Data1 d1 = new Data1(); // ok
        Data2 d2 = new Data2(); // 컴파일 에러
    }
}

위 문제를 해결하기 위해서는 Data2 클래스에 기본 생성자를 추가해주던가,매개변수가 있는 생성자만을 사용해야 함

매개변수가 있는 생성자

인스턴스를 생성한 다음에 인스턴스 변수의 값을 변경하는 것보다 매개변수를 갖는 생성자를 사용하는 것이 코드를 보다 간결하고 직관적으로 만든다.

class Car{
	String color;
    String gearType;
    int door;
    
    // 생성자
    Car(){};
    
    // 매개변수가 있는 생성자
    Car(String c, String g, ing d){
    	color = 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);

생성자에서 다른 생성자 호출 (this)

- 조건

  1. 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
  2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

- 예시

class Car{
	String color;
    String gearType;
    int door;
    
    // 생성자 예시1 - 비효율적
    Car(){
    	color = "white";
		gearType = "auto";
		door = 4;
    };
    
    // 생성자 예시2 - 효율적
    Car(){
    	this("white","auto",4); // 다른 생성자를 활용하여 코드의 재사용성을 높였다.
    };
    
    // 매개변수가 있는 생성자
    Car(String c, String g, ing d){
    	color = c;
        gearType = g;
        door = d;
    }
}

참조변수 this

인스턴스 자신을 가리키는 참조변수로, 인스턴스 주소가 저장되어 있다.

  • 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.

- 예시

class Car{
	String color;
    String gearType;
    int door;
    
    // 생성자
    Car(){
    	this("white","auto",4);
    };
    
    // 매개변수가 있는 생성자1
    Car(String c, String g, ing d){
    	color = c;
        gearType = g;
        door = d;
    }
    
    // 매개변수가 있는 생성자2
    Car(String color, String gearType, ing door){
    	this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

두번째 생성자가 더 바람직하다.

인스턴스 복사 (생성자 이용)

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

class MyMathTest3{
	public static void main(String args[]){
    	Car c1 = new Car();
        Car c2 = new Car(c1); // 인스턴스 복사
    }
}
profile
땅콩의 모험 (server)

0개의 댓글