티스토리 뷰
Android app 을 개발하다 보면 커스텀 뷰(Custom View)를 정의해야 하는 경우가 자주 생긴다.
커스텀 뷰는 호출되는 시점(코드 생성 vs XML 인플레이팅)에 따라 필요한 생성자가 다르기 때문에 반드시 생성자 오버로딩이 필수적이다.
이번 포스팅에서는 코틀린에서 이 복잡한 생성자 오버로딩을 한 방에 해결해 주는 @JvmOverloads에 대해 알아보자.
생성자에서 @JvmOverloads 이용하기
◼ Step 1 : 생성자 매개변수에 Default 값 설정하기
코틀린은 파라미터에 기본값(Default value)을 지정할 수 있다.
먼저 하단과 같이 커스텀 뷰에서 필요한 인자들에 기본값을 선언하자.
◼ Step 2 : @JvmOverloads annotation 추가하기
클래스 헤더의 constructor 키워드 앞에 @JvmOverloads를 붙인다.
이 어노테이션은 컴파일러에게 "인수를 default 값으로 대체하는 생성자들을 자동으로 만들어줘!"라고 지시하는 역할을 한다.
◼ Step 3 : 컴파일된 결과 확인하기
@JvmOverloads를 사용하면 컴파일러가 자바에서 사용하기 편하도록 인자를 하나씩 줄인 오버로드 생성자를 하단과 같이 자동으로 생성해 준다.
- 자동 생성되는 생성자 목록 (Java 시점)
| 1. CustomView(Context context) 2. CustomView(Context context, AttributeSet attrs) 3. CustomView(Context context, AttributeSet attrs, int defStyleAttr) |
일반 함수에서 @JvmOverloads 이용하기
생성자뿐만 아니라 일반 함수에서도 이 기능을 활용할 수 있다.
특히 코틀린으로 만든 라이브러리를 자바 프로젝트에서 호출해야 할 때 아주 유용하다.
◼ Step 1 : 함수에 @JvmOverloads 적용하기
하단과 같이 로그를 남기는 함수에 어노테이션과 기본값을 설정한다.
◼ Step 2 : Java 에서 호출하기
자바 코드에서는 코틀린의 default parameter를 인식하지 못하지만, @JvmOverloads 덕분에 생성된 오버로드 메서드들을 하단과 같이 자유롭게 호출할 수 있다.
주의사항
자바에서 수십 줄씩 쓰던 보일러플레이트 코드를 코틀린에서는 단 한 줄로 줄일 수 있다는 것이 @JvmOverloads의 가장 큰 매력이다.
하지만 편리함 뒤에 숨어 있는 실무 밀착형 주의사항들을 몇 가지 정리했으니 꼭 확인하고 넘어가자.
◼ 메서드 수 증가
어노테이션 하나로 여러 개의 메서드가 생성되므로, 파라미터가 너무 많으면 메서드 수가 급격히 늘어날 수 있다.
◼ 파라미터 순서
자바에는 'Named Argument' 기능이 없으므로, 기본값이 있는 파라미터는 가급적 뒤쪽으로 몰아넣는 것이 좋다.
◼ Null 관리
코틀린의 Nullable 타입이 자바에서는 단순 참조 타입으로 보일 수 있으니 주의하자.
'Kotlin' 카테고리의 다른 글
| [Kotlin] Sealed class (0) | 2026.05.07 |
|---|
- Total
- Today
- Yesterday
- StartService
- 리워드앱
- task
- android flag activity
- M2E
- mPANDO
- 안드로이드 서비스
- p2e
- RoomDatabase
- android intent
- task 생성
- onContextItemSelected
- StringUtils
- onCreateContextMenu
- WEMIX
- 안드로이드 인텐트
- bindservice
- notifyDataSetChanged
- android activity flag
- 앱테크 추천
- BroadcastReceiver
- Android Service
- 앱테크
- 채굴앱
- android task
- registerForContextMenu
- 리워드 어플
- Intent
- 무료 채굴
- 무료채굴
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
