이번 시간에는 Java의 생성자에 대해서 알아보겠습니다.

 

 

 먼저 Main 클래스의 main 함수에는 다음과 같은 내용이 있습니다. "chogahui" 라는 이름을 가진 Dog 객체를 생성한 다음에, 생성한 Dog 객체가 barking합니다. 즉, 제 강아지가 barking 이라는 기능만을 수행한 것입니다.

 

 

 이제 Dog 클래스를 봅시다. 먼저, String을 매개변수로 넘긴 Dog 생성자는 made a object라는 내용을 출력합니다. 그리고, 해당 객체의 name과 age를 초기화 합니다. 다음에, barking 메서드는 bark라는 내용만 출력합니다. 그러면, 위 프로그램의 출력 결과가 어떻게 나올까요?

 

 

 made a object가 먼저 출력이 되고, bark가 출력이 됩니다. 이를 통해서, 우리는 Dog 생성자가, 객체가 생성이 되고 나서, 초기화가 될 때, 즉 특별할 때에만 불린다는 것을 알 수 있습니다.

 

 


 생성자가 호출이 되었을 때 상황입니다.

 

 이 때, 변수들이 어떻게 할당이 되어 있는지를 봅시다.

 

 

 각각 0과 null 값으로 초기화 되어 있습니다. 7번째 줄을 수행하면 "made ~ " 가 출력이 됩니다. 그리고 8번째와 9번째 줄을 수행하면, name과 age가 각각 초기화가 될 건데요.

 

 

 여기서 this는 새로 생성된 Dog 객체를 의미합니다. 그렇기 때문에 this.name과 this.age는 새로 생성된 "chogahui"라는 이름을 가진 인스턴스의 name, age 필드를 의미합니다.

 

 

 이 때, chogahui라는 이름을 가진 객체가 초기화가 될 거에요. 나이는 0이고 name은 "chogahui"로. 그런데 string을 new 연산자로 생성했기 때문에, pool에 있는 "chogahui"와는 다른 공간에 "chogahui"라는 이름을 가진 문자열이 할당됩니다. 그리고 this.name은 그것을 가리킵니다.

 

 

 그런데 new Dog("chogahui").bark(); 라고 했어요. 일단 new Dog(~)는 새롭게 생성된 Dog 인스턴스를 의미합니다. 그것의 bark는, Dog 클래스 내부에 있는, bark를 출력하는 함수를 의미합니다. 이것은 클래스 정보던, 함수 Table이던, 그것들에 대한 정보를 저장한 자료구조를 이용해서 접근을 할 거에요.

 

 따라서, 생성자 내부에 있는 "made ~"가 먼저 출력되고, "bark" 가 출력됩니다. 그냥 쉽게 인스턴스가 생성될 때마다 호출이 된다. 정도로만 기억하셔도 무난합니다.

 

 


 그러면, 이런 경우에는 어떨까요?

 

 

 Dog 클래스는 위와 같습니다. 이번에는 어딜 찾아봐도 생성자가 보이지 않습니다.

 

 

 Main 클래스의 main 함수입니다. 저는 단지 new Dog().barking을 호출하였습니다. 생성자가 없어서 에러가 날 줄 알았는데, 그건 또 아닙니다. 클래스에 생성자가 없는 경우, 컴파일러가 기본 생성자를 추가하기 때문이에요.

 

 

 기본 생성자라고 하면, 내용이 없는 것을 의미합니다. 그러면 모든 클래스는 하나 이상의 생성자를 가지고 있다고 보아도 될까요? 넵. 그리고 constructor가 특별한 method라고 했는데요. barking과 다른 점이 눈에 보이실 거에요. 리턴 타입을 갖지 않아요. 예를 들어 void라던지, int형을 리턴하지 않아요. 그리고, 생성자의 이름은 무조건 클래스 이름이다. 라는 점이 다르다고 할 수 있어요.

 

 한 클래스 안에 여러 constructor를 만들 수도 있는데요. 이것은 overloading을 설명하면서 다시 이야기 하도록 하겠습니다. 이번 시간에는 여기까지만 알아도 충분할 듯 싶네요.