[Java] 생성자(Constructor)에 대한 이야기

생성자(Constructor)에 대한 이야기




  생성자란 ?

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

 

  • 생성자의 이름은 클래스의 이름과 같아야 한다.

  • 생성자는 리턴 값이 없다.

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

 


Character c = new Character();

 

순서

  1.  연산자 new에 의해서 메모리(heap) Character 클래스의 인스턴스가 생성된다.

  2. 생성자 Character()가 호출되어 수행된다.

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

 



 

기본 생성자(Default Constructor)

 

사실 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다.

정의된 생성자가 하나도 없을 경우 컴파일러Compiler ) 기본생성자를 추가한다.

 

그러나! 만약에 매개변수가 있는 생성자가 정의 되어 있다면,

컴파일러가 기본 생성자를 생성해 주지 않는다.

 

컴파일러가 자동적으로 기본 생성자를 추가해주는 경우는 

' 클래스 내에 생성자가 하나도 없을 때 ' 뿐이라는 것.

 

 

 



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

 

아래의 두가지를 만족시켜야 생성자 간에도 서로 호출이 가능하다.

 

  1. 생성자의 이름으로 클래스이름 대신 this를 사용한다.

  2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

 

 thi

 인스턴스 자신을 가리키는 참조변수(인스턴스의 주소)이다.

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

 this(), this(매개변수) 

 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.


class Character
{
    String name;
    bool man; 
    int age;
 
 
    Character()
    {
        this("GYU", false, 27);
    }

    Character(String _name)
    {
        this(_name, false, 27);
    }
 
    Character(String _name, bool _isMan, int _age)
    {
        this.name = _name;
        this.man= _isMan;
        this.age = _age;
    }
}


생성자 Character()에서 또 다른 생성자 Character(String _name, bool _isMan, int _age)를 호출한다.


이처럼 생성자간의 호출에는 생성자의 이름 대신 this를 사용해야만 하므로 'Character'대신 'this'를 사용했다. 그리고 생성자 Character() 첫째 줄에서 호출했다는 점이 중요하다.

 



여기서 잠깐!

 

왜 첫 줄에서만 호출이 가능한 걸까?


생성자 내에서 초기화 작업도중에 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화를 할 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문!

 

 

좋은 점은 뭘까?


 매개변수 이름을 다르게 하는 것 보다 this를 사용해서 구별되도록 하는 것이 의미가 더 명확하고 이해하기 쉽다. 수정이 필요한 경우에도 보다 적은 코드만을 변경하면 되므로 유지보수가 쉬워진다.



static메서드(클래스 메서드)에서는 인스턴스 멤버들을 사용할 수  없는 것처럼, this 역시 사용할 수 없다.

왜냐하면, static메서드는 인스턴스를 생성하지 않고도 호출될 수 있으므로 static메서드가 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문이다.