[Java의 정석] 생성자(Constructor)

younghyun·2022년 7월 14일
0

Java의 정석

목록 보기
8/12
post-thumbnail

생성자란

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

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

    Card() {   // 매개변수가 없는 생성자
       ...
    }
    
    Card(String k, int num) {  // 매개변수가 있는 생성자
       ...
    }
}
  • 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.
Card c = new Card();
  • 클래스의 인스턴스를 생성하는 과정
    • 1) 연산사 new에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성된다.
    • 2) 생성자 Card()가 호출되어 수행된다.
    • 3) 연산자 new의 결과로 생성된 Card 인스턴스 주소가 반환되어 참조변수 c에 저장된다.

기본 생성자(default constructor)

class Card {
    Card() { }   // 기본 생성자: 매개변수도 없고 아무런 내용도 없음
}
  • 모든 프로그램에는 하나 이상의 생성자가 정의되어 있어야 한다.
    • 클래스에 생성자가 하나도 없는 경우, 컴파일러는 자동적으로 매개변수도 없고 아무런 내용도 없는 기본 생성자를 추가한다.

기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.

매개변수가 있는 생성자

class Car {

    String color;
    String gearType;
    int door;
    
    Car() {}   // 기본 생성자
    
    Car(String c, String g, int 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(), this

생성자에서 생성자를 호출할 때의 조건

  • 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
  • 반드시 첫 줄에서만 호출이 가능하다.
class Car {

    String color;
    String gearType;
    int door;
    
    Car() {
        this("white", "auto", 4);
    }
    
    Car(String color) {
        this(color, "auto", 4);
    }
    
    Car(String color, String gearType, int door) {
        this.color = color;    // this.color = 인스턴스변수, color = 지역변수
        this.gearType = gearType;
        this.door = door;
    }
}

같은 클래스 내의 생성자들은 서로 관계가 깊은 경우가 많아서 이처럼 서로 호출하도록 하여 유기적으로 연결해주면 더 좋은 코드를 얻을 수 있다. 그리고 유지보수가 쉬워진다.

this란

this : 인스턴스 자신을 가리키는 참조변수로, 인스턴스의 주소가 저장되어 있다.
모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.
this(), this(매개변수) : 생성자로, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

  • 'this'를 통해 인스턴스변수에 접근할 수 있는 것이다.
    • 'this'를 사용할 수 있는 것은 인스턴스멤버뿐이다. static메서드는 사용할 수 없다.

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

class Car {

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

class CarTest {
    public static void main(String[] args) {
        Car c1 = new Car();
        Car c2 = new Car(c1);  // c1의 복사본 c2를 생성한다.
    }
}

무작정 새로 코드를 작성하는 것보다 기존의 코드를 활용할 수 없는지 고민해야 한다.

인스턴스를 생성할 때 고려해야 할 사항

  • 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
  • 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?
profile
🌱 주니어 백엔드 개발자입니당

0개의 댓글