[Android] Android에서 일반적인 kotlin패턴 사용하기(안드로이드 공부 2일차)

공부할거야·2023년 1월 4일

android

목록 보기
1/2

어제 졸작 발표가 있어 다음 코틀린 공부가 조금 늦어졌다. 교수님 제가 열심히 할게요ㅠㅠ 그래도 주제는 통과되었다!! 피드백을 바탕으로 조금만 수정하면 될 듯!

안드로이드에서는 activity와 fragment로 작업하는 것으로 알고 있는데 나는 첫 앱부터 compose로 작업했기 때문에 오히려 조금 낯설다.. 이번에도 거의 compose로 작업할 거긴 하지만 필요할테니까 가볍게 보고 넘어가야겠다.

프레그먼트로 작업하기

상속

class 키워드를 통해 코틀린에서 클래스를 선언한다. ':' 연산자를 사용해 상속임을 명시해주며 슈퍼클래스 Fragment의 상속 시 아래와 같다.

class LoginFragment : Fragment()

LoginFragment 내에서 여러 수명 주기 콜백을 재정의하여 Fragment의 상태 변경에 응답할 수 있다.

- 무슨 뜻일까? 
Fragment의 콜백 메서드 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()가 존재한다. 
이 함수들을 다시 정의해 각 이벤트에 맞는 동작을 취한다는 뜻
- 콜백 메서드란? 
callback 메서드로 특정 이벤트가 발생할 때 호출되는 함수

함수를 재정의하기 위해서는 override 키워드를 사용한다.

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.login_fragment, container, false)
}

상위 클래스에서 함수를 참조하려면 super 키워드를 사용한다. (이거 좀 더 공부해보자)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
}

null 허용 여부 및 초기화

안드로이드 1일차에서 공부했던 것의 연장선으로 lateinit으로 속성 초기화를 연장할 수 있다. 이미 했던 내용이니까 예시만 둬야겠다.

class LoginFragment: Fragment() {
	private lateinit var username: EditText
    private lateinit var password: EditText
	
    // 후에 객체를 할당해준다.
}

동반 객체(companion object)

함수나 속성을 클래스의 인스턴스가 아닌 클래스에 연결할 경우 companion object에서 선언한다.

싱글톤이란? 인스턴스가 하나만 있는 클래스

object MySingleton{
    val prop = "나는 MySingleton의 속성이다."
    fun method() = "나는 MySingleton의 메소드다."
}
fun main(args: Array<String>){
    println(MySingleton.prop);    //나는 MySingleton의 속성이다.
    println(MySingleton.method());   //나는 MySingleton의 메소드다.
}

companion object는 클래스 내부에 정의되는 object의 특수한 형태로 싱글톤이다.
클래스가 메모리에 적재되면서 함께 생성되는 동반 객체이고 이는 클래스명으로 접근할 수 있다.

class LoginFragment: Fragment {

	companion object{
    	private const val TAG="LoginFragment"
    }
}

속성 위임

과도한 중복 코드를 피하기 위해 속성 위임을 사용한다.
by 키워드의 왼쪽에는 인터페이스, 오른쪽엔 해당 인터페이스를 구현한 클래스가 필요하다.

private val viewModel: LoginViewModel by viewModels()

이건 상속과 위임에 관해 조금 더 공부해야 될 것 같다ㅠ

null 허용 여부

kotlni의 규칙은 NullPointerException이 발생할 가능성을 낮춘다.
자바는 null 허용 구문에 대해 상대적으로 덜 엄격하다. Android 프레임워크는 주로 자바로 작성되기 때문에 null 허용 여부 주석 없이 APU를 호출할 때 오류가 발생할 수 있다.

이 문제를 해결하기 위해 자바에서 코드를 작성할 때 null 허용 여부 주석을 사용해야 한다.

public class Account implements Parcelable {
    public final @NonNull String name;
    public final String type;
    private final @Nullable String accessId;

    ...
}

자바 유형을 잘 모르는 경우에는 null을 허용하는 것으로 간주해야 한다.
이 때 어설션 연산자 !!를 사용한다.
trim 함수는 값의 앞이나 뒤에 공백이 포함되지 않도록 한다.

val account = Account("name", "type")
val accountName = account.name!!.trim()

!! 연산자는 왼쪽에 있는 모든 것을 null이 아닌 것으로 취급한다. 위의 예시에서도 name을 string으로 취급한다. 이 때 name이 null이면 NullPointException이 발생한다.
그러므로 확실히 null이 아닐 경우에만 사용하면 좋다.

더 안전한 방법으로는 ?.를 사용하는 것이다.

val account = Account("name", "type")
val accountName = account.name?.trim() ?: "Default name"

이 연산자를 통해 name이 null이면 결과는 null이 된다. NullPointException을 발생시킬 수는 없지만 null 값이 전달된다.

Elvis 연산자(?:)를 사용해 null 사례를 처리할 수 있다.
이 연산자는 왼쪽의 표현식 값이 null이면 오른쪽 값을 할당한다.

속성 초기화

kotlin의 속성은 기본적으로 초기화되지 않는다. 인클로징 클래스가 초기화될 때 속성이 초기화되어야 한다.

클래스 선언에서 값을 할당해 변수를 초기화한다.

class LoginFragment: Fragment() {
	val index: Int = 12
}

초기화 프로그램 블록에서도 정의할 수 있다.

class LoginFragment: Fragment() {
	val index: Int
    init {
    	index = 12
    }
}

동반 객체 더 공부하려면:
https://www.bsidesoft.com/8187#%EC%BD%94%ED%8B%80%EB%A6%B0%EC%9D%98_class_%ED%82%A4%EC%9B%8C%EB%93%9C_%EA%B8%B0%EC%B4%88

속성 위임 더 공부하려면:
https://readystory.tistory.com/202

profile
아마도?

0개의 댓글