상속 |
상속
LoginFragment는 Fragment의 서브 클래스 입니다. : 연산자를 이용하여 상속을 표시할 수 있습니다.
class LoginFragment : Fragment()
Fragment |
여러 수명 주기 콜백을 재정의하여 Fragment의 상태 변경에 응답할 수 있습니다.
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.login_fragment, container, false)
}
상위 클래스에서 함수를 참조할때는 아래와 같습니다.
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
null허용 |
?을 붙여서 null을 허용할 수 있습니다.
val name: String? = null
null은 최대한 빨리 초기화해야 하지만 필요에 따라서 lateinit를 사용하여 늦출 수 있습니다.
class LoginFragment : Fragment() {
private lateinit var usernameEditText: EditText
private lateinit var passwordEditText: EditText
private lateinit var loginButton: Button
private lateinit var statusTextView: TextView
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
usernameEditText = view.findViewById(R.id.username_edit_text)
passwordEditText = view.findViewById(R.id.password_edit_text)
loginButton = view.findViewById(R.id.login_button)
statusTextView = view.findViewById(R.id.status_text_view)
}
}
▷ 플렛폼 유형
정의되지 않은 멤버를 참조한다면 kotlin에서 String에 매핑되는지 String?에 매핑되는지 알지 못합니다.
이 모호성을 String!를 통하여 표시합니다.
String!는 String 또는 String?를 표시할 수 있고 할당할 수 있습니다.
이는 NullPointerException이 발생한 위험이 있으므로 Null 주석을 사용해야 합니다.
@ Nullable
Null 허용함
자바 유형을 모르는 경우에는 Null 을 허용하는 것이 좋습니다.
@ NonNull
Null 허용안함.
public class Account implements Parcelable {
public final @NonNull String name;
public final String type;
private final @Nullable String accessId;
}
!! 왼쪽에 있는 모든 것을 null아 아닌것으로 취급. NullPointerException 위험.
val account = Account("name", "type")
val accountName = account.name!!.trim()
?.를 사용하는 것이 안전함
이러면 null체크해서 null을 반환함.
val account = Account("name", "type")
val accountName = account.name?.trim()
?.를 이용하여null처리한 후 null일때 값을 넣고 싶다면. Elvis 연산자(?:)를 활용
val account = Account("name", "type")
val accountName = account.name?.trim() ?: "Default name"
단일 추상 메서드(SAM : Single Abstract Method) |
setOnClickLisener()는 항상 OnClickListener를 인수를 가져오고 항상 동일한 추상메소드를 가져오므로 익명함수를 통하여 간략화 시킬 수 있습니다.
loginButton.setOnClickListener {
val authSuccessful: Boolean = viewModel.authenticate(
usernameEditText.text.toString(),
passwordEditText.text.toString()
)
if (authSuccessful) {
// Navigate to next screen
} else {
statusTextView.text = requireContext().getString(R.string.auth_failed)
}
}
동반 객체 |
- 특정 유형에 연결되지만 특정 객체에 연결되지는 않는 변수나 함수를 정의
- 자바의 static 키워드와 유사.
class LoginFragment : Fragment() {
companion object {
private const val TAG = "LoginFragment"
}
}
속성 위임 |
fragment 내에서 viewModel에 액세스하는 것과 같이 Anroid의 더 일반적인 패턴을 반복할 수 있습니다.
private val viewModel: LoginViewModel by viewModels()