목표
- 생성자가 무엇이고, 생성자 오버로드가 무엇인지 이해한다.
- Fragment의 생성자 오버로드를 하지 말아야 하는 이유에 대해 이해한다.
생성자란?
생성자란 객체의 인스턴스를 생성할 때 호출되어 객체의 인스턴스를 반환하는 메서드를 뜻한다.
예를 들어 아래와 같은 클래스가 있다고 해보자
class GalaxyTab(name: String, size: Int)
GalaxyTab 객체의 인스턴스는 다음의 방식으로 만들어낼 수 있다.
val tabS7 = GalaxyTab("S7", 11)
우리는 GalaxyTab(name : String, size: Int)을 생성자라고 부른다.
생성자 오버로드란?
생성자 오버로드란 class의 생성자를 두 개 이상 가지는 것을 뜻한다.
Kotlin에서는 constructor 키워드를 이용해 두 개 이상의 생성자를 만들어낼 수 있다.
class GalaxyTab(name: String, size: Int) {
constructor(name: String) : this(name, 11)
}
위와 같은 생성자 오버로드를 통해 특정한 변수값을 추가하거나 생략하여 객체의 인스턴스를 만들어낼 수 있다.
val tabS7 = GalaxyTab("S7")
위의 tabS7은 size가 11로 설정되어 객체가 만들어지게 된다.
Fragment에서의 생성자 오버로드는 왜 금지되는가?
Android의 Fragment에서는 위와 같은 생성자 오버로드가 금지된다. 그것은 바로 Fragment의 특징 때문이다. Fragment는 생명주기에 따라 파괴와 생성을 반복한다.
이때 Fragment는 아래의 코드에 따라 Fragment class를 Load하여 Fragment 인스턴스를 다시 생성한다.
1. Class Loader를 이용하여 Fragment class 생성
Class<? extends Fragment> clazz = FragmentFactory.loadFragmentClass(
context.getClassLoader(), fname);
2. class의 기본 constructor을 가져와서 fragment 인스턴스 생성
Fragment f = clazz.getConstructor().newInstance();
3. Bundle 객체인 args를 이용하여 fragment에 전달할 값 세팅
if (args != null) {
args.setClassLoader(f.getClass().getClassLoader());
f.setArguments(args);
}
4. 생성된 fragment인 f를 return
return f;
위의 과정의 2번에서 보면 framgnet의 constructor은 기본 constructor을 가져와 fragment 인스턴스가 생성된다.
이 경우 기존에 constructor을 통해 넘겨준 변수값을 사용할 수가 없게 되는데 이로 인해 Fragment의 데이터에 문제가 생길 수 있다.
따라서 이를 방지하기 위해 Fragment는 생성자를 오버로드 하는 것을 금지하며, Fragment의 생성과 동시에 Bundle 객체를 이용해 파라미터를 전달하게 된다.