안드로이드 스튜디오

안드로이드 스튜디오 by lazy 코딩 (초기화버튼 만들기)

아는맛이무섭다 2024. 1. 31. 17:15

by lazy 코딩은 도대체 무엇인지에 대해 탐구하다가 코딩을 분해해서 사용해보았습니다.

그렇게 탄생한 초기화 버튼 샘플 프로젝트입니다.

 

 

 

우선 왜 다시 처음으로 돌아가는 초기화 버튼에 by lazy 코딩이 쓰일까? 
이것이 제 첫 질문이었습니다.

Lazy by 코딩은 Kotlin(Android)에서 사용되는 코드로, Android 앱 개발에 자주 사용되는 코드 패턴 중 하나인 "Lazy Initialization(지연 초기화)" 입니다. 한마디로 변수죠. 

 

일단 저희가 생각하는 초기화와 이 코딩에서 생각하는 초기화는 완전히 틀립니다. 제가 이해한 것이 맞다면 코딩에서 초기화 명령어를 넣으면 말그대로 전체 화면이 비어져 리셋되는 것입니다. 하지만 제가 원하는 것은 특정 객체의 데이터를 초기화시키는 것이고요. 저는 사과껍질을 깍는 걸 원하는데, 컴퓨터는 제가 사과 전체를 없애기를 원하는 것이라고 이해한 것이죠.

 

그래서 이 지연 초기화 "Lazy Initaialization"이라는 코딩이 이용되는 것입니다. 초기화 되는 것을 지연시킴으로서, 데이터를 아직 보존한 채 다시 돌아가는 것입니다. 완전히 삭제되어서 초기화되는 것이 아니고요. (제가 이해한것이 100%맞다고 정의내리기 어렵습니다.)

 

과학 실험을 하듯이 이론을 생각해내면, 실험으로 증명을 해내고, 보고서까지 제출해야지 완벽하게 이해될 것 같아서 저는 한번 초기화 버튼을 새로운 프로젝트에 집어넣어서 작동되는지 확인했습니다. 위가 영상이고요.

 

뭐든 직접해봐야지 똥인지 된장인지 구분할 수 있으니까요.

 

더보기
activity_main.xml

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_clear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="11dp"
        android:text="초기화"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <Button
        android:id="@+id/btn_revert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="4dp"
        android:text="다음"
        app:layout_constraintEnd_toEndOf="@+id/btn_clear"
        app:layout_constraintTop_toBottomOf="@+id/btn_clear" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

일단 by lazy 코드를 실행시키려면 3가지 조건이 있습니다.

 

MainActivity.xml에

맨 위에 private val clearbutton by lazy {findviewbyid<button>(r.id.아이디)}가 있을것.

Overrride에 initclearbutton()이 있을것Override 아래에 Private fun initclearbutton () {}이 있을것.

 

이 세가지 요건만 지키시면 코드를 실행시킬 준비가 된것입니다. 나머지 이 코딩에 무엇을 새길지는 원하시는대로 하시면 됩니다. 위에 Clearbutton은 제가 임의로 적어놓은 것이니 참고만 하시면 됩니다. 어찌됬던 이 명칭 3가지가 동일해야하는 건 당연하고요.

 

예시 사진

 

 

 

 

제 코딩에서 initClearButton 코딩에 currentTextIndex=0이라고 보이실 겁니다. 왜냐하면 저는 텍스트가 넘어가는 기능을 초기화시키는 버튼을 만들었기 때문에, 텍스트가 다시 처음 순서로 돌아갈 수 있게 이렇게 써놓은 것이고

 

보통 private var didRun = false   를 위에 넣은 후에, initClearButton에도 넣어줍니다. 

private fun initClearButton() { clearButton.setOnClickListener { didRun = false updateTextBasedOnFlag() } }

<<요렇게요

 

didRun은 어떤 동작이 실행됬는지 여부를 추적하는 불리언 변수입니다. 요걸 타고 거슬러올라가는 것이죠. 이 didRun을 초기화 시키는건 didRun = false로 만들어 버리는 것입니다. 저는 아예 텍스트가 처음부터 다시 시작되길 원해서 저렇게 기능을 넣었고, 기본적으로는 didRun = false를 많이 사용되는 편입니다.

 

아래에 updateTextBasedOnIndex()는 제가 임의로 정해놓은 기능입니다. 초기화 버튼을 실행시키려면 초기화를 시키려는 기능도 같이 넣어줘야하기 때문에 그렇습니다.  저건 자유롭게 변경가능합니다.

 

제가 추가한 기능은 버튼을 누르면 텍스트를 변경하는 기능입니다. 왜냐하면 저는 나중에 스토리형 게임을 만들고 싶어서 한번 넣어본것이죠. 재미를 위해서요.

 

더보기
MainActivity.kt

 

class MainActivity : AppCompatActivity() {
    private val clearButton by lazy { findViewById<Button>(R.id.btn_clear) }
    private val revertButton by lazy { findViewById<Button>(R.id.btn_revert) }
    private val numTextViewList: List<TextView> by lazy {
        listOf<TextView>(
            findViewById(R.id.textView)
            // Add more TextView IDs as needed
        )
    }
    private var currentTextIndex = 0
    private val textOptions = listOf(
        "안녕하세요, 처음 뵙겠습니다",
        "이번에는 간단하게 버튼을 눌러 대사를 바꾸게 하고 초기화하는 기능을 설명할 것입니다",
        "초기화 버튼을 눌",
        // Add more text options as needed
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initClearButton()
        initRevertButton()
        updateTextBasedOnIndex()
    }

    private fun initClearButton() {
        clearButton.setOnClickListener {
            currentTextIndex = 0
            updateTextBasedOnIndex()
        }
    }

    private fun initRevertButton() {
        revertButton.setOnClickListener {
            if (currentTextIndex < textOptions.size - 1) {
                currentTextIndex++
                updateTextBasedOnIndex()
            }
        }
    }

    private fun updateTextBasedOnIndex() {
        numTextViewList.forEach { textView ->
            textView.text = textOptions[currentTextIndex]
        }
    }

코딩은 계속 실행시켜가면서 이해하는게 개인적으로 제일 빨랐습니다. 이렇게해서 따로 분리시켜 초기화버튼을 실행시켜보니 조금 이해가 갔습니다.

 

앱을 잘 만들려면 앱을 많이 만들어야하는게 정답이죠. 더 빨리 하려면 만들어진 앱을 두고 정리하고, 이론을 세우고, 오답노트를 작성하면서 반복하는 것이 제일인 것 같습니다.

 

오늘 하루는 요렇게 마무리하겠습니다. 좋은 하루 되세요!