카테고리 없음

kotlin_pattern

zelkova 2021. 4. 28. 11:48

<목차로 돌아가기>

 

 

상속

상속 

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()

 

 

 

 

 

 

 

 

 

참조 : androidstudio_kotlinpattern

반응형