Fragment의 생성자 오버로드는 왜 금지되는가

2021. 3. 29. 00:43· Android/Component
목차
  1. 목표
  2. 생성자란?
  3. 생성자 오버로드란?
  4. Fragment에서의 생성자 오버로드는 왜 금지되는가?
반응형

목표

  • 생성자가 무엇이고, 생성자 오버로드가 무엇인지 이해한다.
  • 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는 생명주기에 따라 파괴와 생성을 반복한다. 

 

그림1. 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 객체를 이용해 파라미터를 전달하게 된다.

 

 

 

반응형
  1. 목표
  2. 생성자란?
  3. 생성자 오버로드란?
  4. Fragment에서의 생성자 오버로드는 왜 금지되는가?


 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com

'Android/Component' 카테고리의 다른 글
  • [Android] onBackPressedDispatcher 사용해 뒤로가기 동작 설정하기: 뒤로가기 두 번 눌러 종료하기 예제
  • [Bundle] Android Bundle 이란 무엇인가? Bundle을 이용해 데이터 전달하기
  • [Bundle] Android Parcel과 Parcelable 알아보기 + kotlin-parcelize plugin 활용하기
  • [Context] ApplicationContext와 ActivityContext
Dev.Cho
Dev.Cho
'조세영의 Kotlin World'는 Kotlin를 전문적으로 다루는 개인 기술 블로그입니다. Kotlin 세계에 대한 양질의 자료를 제공하며 Kotlin, Android, Spring, CI, CD 분야에 대해 다룹니다.
Dev.Cho
조세영의 Kotlin World
Dev.Cho
전체
오늘
어제

블로그 메뉴

  • LinkedIn
  • GitHub
  • 분류 전체보기 (491)
    • Kotlin (104)
      • Class and Interface (19)
      • Variable and Function (8)
      • Modifier (5)
      • Collection (14)
      • Time (8)
      • 동시성 제어 (7)
      • Reactive Programming (2)
      • Paradigm (2)
      • Kotlin 자료구조 (15)
      • Design Patterns (11)
      • Algorithm (3)
      • Exception (1)
      • 기타 (9)
      • Update History (0)
    • Coroutines (32)
      • Coroutine Basics (18)
      • Flow (9)
      • CoroutineScope (3)
      • Debugging (2)
    • Testing Codes (28)
      • Test 기본 (3)
      • JUnit5 (9)
      • MockK (6)
      • Testing Coroutines (1)
      • Testing Android (8)
      • Test 기타 (1)
    • Spring (50)
      • Dependency Injection (18)
      • Settings (5)
      • REST API (0)
      • DevTools (1)
      • MVC (18)
      • Error (2)
      • MongoDB (2)
      • Database (4)
    • Android (39)
      • Architecture (2)
      • Component (5)
      • Manifest (1)
      • Lifecycle (2)
      • Dependency Injection (17)
      • Resource (1)
      • Storage (1)
      • Security and Optimization (1)
      • WebView (2)
      • Error (6)
    • Android Jetpack Compose (33)
      • Compose (6)
      • Compose Modifier (13)
      • Compose Resource (4)
      • Compose State (4)
      • Compose Side Effect (6)
    • Android Jetpack Compose UI (48)
      • Compose Layout (14)
      • Compose Text (10)
      • Compose Button (5)
      • Compose Dialog (2)
      • Compose TextField (0)
      • Compose UIs (4)
      • Compose Animation (1)
      • Compose Canvas (12)
    • Android Jetpack (10)
      • Datastore (5)
      • ViewModel (4)
      • LiveData (1)
      • Paging (0)
    • KMP (5)
    • Programming (4)
    • Machine (9)
      • JVM (7)
      • Linux (2)
    • CI, CD (74)
      • Gradle (12)
      • Groovy Gradle (5)
      • Git (25)
      • Git Remote (5)
      • GitHub (5)
      • GitHub Actions (21)
    • Network (33)
      • GraphQL (12)
      • HTTP (11)
      • Basic (9)
    • 오픈소스 (3)
    • Database (3)
      • MongoDB (3)
    • IDE (6)
      • Android Studio (2)
      • Intellij (4)
    • Firebase (1)
    • Javascript (9)

공지사항

  • 코틀린 코루틴 완전 정복 강의 in 인프런 오픈
  • 코틀린 코루틴의 정석 책 출간
  • Kotlin Coroutines 공식 기술 문서 한국어 번⋯
  • GitHub에서 조세영의 Kotlin World를 Foll⋯
  • 문의&제안

인기 글

태그

  • 스프링
  • 코틀린
  • 코루틴
  • gradle
  • Android Compose
  • Coroutine
  • Spring
  • junit4
  • kotlin spring
  • Android
  • dagger2
  • flow
  • GraphQL
  • Unit Testing
  • java
  • github actions
  • compose
  • 의존성 주입
  • 유닛 테스팅
  • HTTP
  • Class
  • junit
  • 안드로이드
  • GIT
  • Jetpack Compose
  • Dependency Injection
  • Kotlin
  • github
  • junit5
  • Spring boot

최근 글

반응형
hELLO · Designed By 정상우.v4.3.0
Dev.Cho
Fragment의 생성자 오버로드는 왜 금지되는가
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.