본문 바로가기

Java/Java의 정석 - 객체지향프로그래밍

생성자(Constructor)

인스턴스의 초기화

 

생성자란 인스턴스 초기화 메서드

 

연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.

 

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

 

1
2
3
 
class Name{        //클래스이름과 생성자이름은 동일하다
  Name(){ }     //void 생략
}
cs

 

  생성자는 반환타입에 void를 붙이지 않아도 된다. 원래 void를 붙여야 하지만, 모든 생성자의 반환타입이 void이기 때문에 생략가능하게 한 것이다.

 

 

  생성자 역시 오버로딩이 가능하다.

 

1
2
3
4
5
6
7
8
9
class Name{        //클래스이름과 생성자이름은 동일하다
    int x;
    int y;
   Name(int a){ x = a; }        
   Name(int a, int b ){
        x = a;
        y = b;
    }        
}
cs

 

 

  생성자의 오버로딩에서 주의할 점은, 생성자를 작성하지 않았을 때는 컴파일러가 기본생성자 '생성자이름()' 를 추가하지만, 생성자를 작성하면 컴파일러가 기본생성자를 추가하지 않는다는 것이다. 컴파일러가 기본생성자를 추가하는 경우는 클래스 내에 생성자가 하나도 없을 때 뿐이다. 따라서 위의 클래스의 인스턴스를 Name n = new Name(); 으로 생성하려고 하면 에러가 발생한다. 따라서 생성자 작성시에는 반드시 직접 기본생성자를 작성해야 한다.

 

 

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

  같은 클래스의 생성자는 서로를 호출할 수 있다. 생성자 간 호출 시 규칙은 다음과 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 생성자의 이름으로 클래스이름 대신 this를 사용한다.
// 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
 
class Name{        //클래스이름과 생성자이름은 동일하다.
    int x;
    int y;
   Name(){
this(0, 0);
}
Name(int a){
         this(a, 0); 
    }        
   Name(int a, int b ){
        x = a;
        y = b;
    }        
}
cs
 
   

 

  한편, 이름이 같은 iv와 lv를 구분하기 위해서 iv의 앞에 참조변수 대신 this.를 붙인다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 생성자의 이름으로 클래스이름 대신 this를 사용한다.
// 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
 
class Name{        //클래스이름과 생성자이름은 동일하다.
    int x;
    int y;
    Name(){
        this(00);
    }
    Name(int a){
         this(a, 0); 
    }        
    Name(int x, int y){
        this.x = x;        //iv와 lv가이름이 동일할 때
        this.y = y;        //iv에 this.를 붙여 구분한다.
    }        
}
 
cs

 

이때 this. 는 인스턴스 자기 자신을 가리키는 참조변수이다.