java/객체지향

[객체지향] 생성자

각시탈코더 2021. 7. 12. 14:30

●생성자

 생성자는 인터스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. 생성자 역시 메서드처럼 클래스 내에 선언된다. 구조가 메서드와 유사하지만 리턴값이 없다는 점이 다르다. 생성자의 조건은 다음과 같다.

 

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

 

생성자도 오버로딩이 가능하므로 하나의 클래스에 여러개의 생성자가 존재 가능하다. 클래스에 생성자를 구현하면 다음과 같다. 

 

 

 

class Point {
     Point() {        //매개변수가 없는 생성자
         ...
     }
     
     Point(int x, int y) {           //매개변수가 있는 생성자
         ...
     }
     ...
}

 

 

 

 

 생성자는 인스턴스를 생성하지 않는다. 단지 인스턴스 변수들의 초기화에 사용되는 조금 특별한 메서드일 뿐이다. 참고로 인스턴스를 생성하는 것은 연산자 new이다.

 

●기본 생성자

 

 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다. 그런데 코드를 짜다보면 생성자를 생성하지 않아도 호출시 오류가 없는 경우가 있다. 그 이유는 생성자를 만들면 자바 컴파일러가 자동으로 생성자를 만들기 때문이다. 이를 '기본 생성자(default constructor)'라 한다. 

 

 

 

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

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

 

 

 

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

 

 

 

class Data_1 {
    int value;
}

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

class Ex6_11 {
   public static void main(String[] args) {
      Data_1 d1 = new Data_1();
      Data_2 d2 = new Data_2();        //compile error발생

 

 

 

 위와 같은 자바코드를 만들면 Data_2를 객체생성할 때 오류가 발생한다. 그런데 같이 객체를 생성한 Data_1은 오류가 발생하지 않는다 왜일까? 그건 Data_1은 클래스에 정의된 생성자가 하나도 없는 반면, Data_2에는 정의된 생성자가 있기때문이다. 우리는 위의 코드를 통해 기본 생성자가 추가될 생성 될 때는 클래스에 정의된 생성자가 하나도 없어야 한다는 걸 알 수 있다.

 

●매개변수가 있는 생성자

 생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다. 생정자에 매개변수를 사용하면 코드가 간결해지고 직관적으로 만든다. 

 

 

 

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

 

 

 

Car인스턴스를 생성할 때, 생성자 Car()를 사용한다면, 인스턴스를 생성한 다음에 인스턴스 변수들을 따로 초기화해주어야 하지만, 매개변수가 있는 생성자 Car(String color, String gearType, int door)를 사용한다면 인스턴스를 생성하는 동시에 원하는 값으로 초기화 할 수 있다.

 

 

 

Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;

Car c = new Car("white","auto",4);

 

 

 

 위, 아래의 코드는 모두 똑같다. 그런데 앞서 설명한 바와 같이 매개변수가 있는 생성자가 좀더 간결하고 직관적이다. 그래서 인스턴스를 생성 후에 별도로 초기화 하지 않는 매개변수가 있는 생성자를 쓰는 게 바람직하다.

 

출처: 자바의 정석 기초편(저자: 남궁성, 출판사: 도우출판)