Language/Java

생성자 , 소멸자

kalza 2018. 8. 29. 09:58

생성자는 객체를 생성하는 순간 가장 먼저 실행 되며, 객체의 초기화를 위해 존재한다.

앞선 포스팅에서는 생성자를 명시적으로 작성하고 객체를 생성하였지만, 생성자를 작성하지 않아도 

컴파일 시점에서 자동 생성이 된다.


 public class ObjectClass{

int level;

int score;

String name;


/* 주석처리 

public ObjectClass{

주석처리 됨.

}

*/


public void addScore(){

score += 1000;

}

 }



위의 코드처럼, 생성자 부분을 주석 처리하고 객체를 생성해보면 문제가 없음을 확인 할 수 있을것이다.

다만 이렇게 생성자를 명시하지 않은 상태에서 자동으로 생성된 생성자는 '디폴트 생성자'라고 하며 

파라미터가 없는 기본 생성자를 생성하게 된다.


파라미터가 2개 이상인 생성자를 자동생성해주게끔 할 수는 없는가?

없다.

파라미터가 2개 이상인 생성자를 필요로 하는 이유는 무엇인지 잘 생각해봐야 한다.

파라미터로 전달된 값을 생성자를 통해서 초기화 작업을 하고 메서드로 접근하기 위함인데,

'어떠한 값'과 '타입'으로 전달될 것이며 '어떻게 초기화 할 것'인지 (전자는 그렇다 쳐도) 고민하는 작업을 대신해 

줄 수는 없는것이다.


그리고 주의할점!

명시적으로 파라미터가 2개 이상인 생성자를 명시적으로 작성하고 객체를 생성할때 기본 생성자까지 명시해주지 않으면,

코드에 에러가 난다.

예제 코드를 작성해보면서 이해해보자.


int형 파라미터를 2개를 갖는 생성자을 작성하였다.


 public class ObjectClass {


public ObjectClass(int x, int y) {

}

 }



객체를 생성해본다.


 public class MainClass {


public static void main(String[] args) {

ObjectClass obj = new ObjectClass();


}

 }




The constructor ObjectClass() is undefined.

-> ObjectClass() 생성자는 정의 되어 있지 않다.


기본 생성자는 어디갔냐는 것이다.


이클립스에서 3개의 대안을 제시하고 있으니 첫줄과 셋째줄만 읽어보자.


Add arguments to match'ObjectClass(int,int)'

-> int형 타입 파라미터를 2개 받는 생성자는 갖고 있네? 그걸로 쓸래?


Create constructor 'ObjectClass()'

-> 아니면 기본 생성자를 만들어!


이렇게 파라미터가 2개인 생성자를 작성할 경우, 기본 생성자까지 함께 작성하는 습관을 들이는게 좋다.




이제부터는 소멸자에 대해 공부해보자.

사용하지 않는 객체. 즉, 주소값을 갖고있는 참조변수의 사용이 없을 경우 객체는 가비지 컬렉터에 의해 제거될때 

finallize()라는 메서드를 호출한다.

기본 생성자를 명시적으로 작성하지 않았을때 컴파일러가 기본 생성자를 자동생성하듯!


 @Override

 protected void finalize() throws Throwable {

super.finalize();

 }



자바는 기본적으로 메모리를 개발자가 직접 관리하지 않지만 드물게 객체를 적절한 시점에 끊어야 하는 상황이

발생 될 수 있다.(고한다)

이때 System.gc();를 사용하면 finallize() 함수가 실행되는데, 이는 가비지 컬렉터에게 바로 작동하라고 명령하는 것이 아니라,

가급적 우선순위를 올려달라고 요청하는 것일 뿐이다.

System.gc()에 대한 설명은 GC를 설명하는 링크를 걸어둔 포스팅을 게시해뒀으니 유심히 봐야겠다.