2024.01.12(금) TIL

quinones·2024년 1월 12일

enum class

분기를 나누어 사용자에게 더 명확한 화면의 상태를 보여주기 위해서

어떤 속성들을 열거하기 위해 사용되는 class이다

enum class SignUpEntryType {
    CREATE,
    UPDATE
}

이렇게 단순히 값을 열거해서 작성해주면 된다. 이렇게 하는 이유는 나는 회원가입/회원수정 두가지 기능을 수행하는 하나의 버튼을 만들거다.
만약 회원가입 유저들을 저장하는 데이터에 데이터가 없다면 CREATE를, 이미 있다면 해당 유저의 정보를 수정하는 UPDATE를 가져오기 위해서 EntryType을 enum class로 열거해서 나열해주었다.

Update가 되는지 확인하기 위해서 먼저 데이터를 설정해준다.

@Parcelize
data class SignUpUserEntity(
    var name: String?,
    var email: String?,
    var emailService: String?
) : Parcelable{
    companion object{
        var userList = mutableListOf(SignUpUserEntity("sparta", "hello", "gmail.com"))
    }
}

data class로 만들어준

val signUpUserEntity = if (SignUpUserEntity.userList.isEmpty()) {
    SignUpUserEntity(name = null, email = null, emailService = null)
} else {
    SignUpUserEntity.userList.first()
}

findViewById<Button>(R.id.bt_update).setOnClickListener {
    startActivity(
        SignUpActivity.newIntent(
            context = this@UserActivity,
            entryType =
            if(SignUpUserEntity.userList.isEmpty()){
                SignUpEntryType.CREATE
            } else{
                SignUpEntryType.UPDATE
            },
            entity = signUpUserEntity
        )
    )
}

버튼 클릭시 intent를 활용해서 context와 entryType, entity를 넘겨주었다. 여기서 사용한 intent는 평소 사용하던 intent와 사용법이 다르지만 동작하는 내용은 같다.
버튼클릭시 나는 SignUpActivity로 이동할 예정인데, 해당액티비티 내에서 newIntent()라는 함수를 만들어준다.

companion object {
    const val EXTRA_ENTRY_TYPE = "extra_entry_type"
    const val EXTRA_USER_ENTITY = "extra_user_entity"

    fun newIntent(
        context: Context,
        entryType: SignUpEntryType,
        entity: SignUpUserEntity
    ): Intent = Intent(context, SignUpActivity()::class.java).apply {
        putExtra(EXTRA_ENTRY_TYPE, entryType.ordinal)
        putExtra(EXTRA_USER_ENTITY, entity)
    }
}

어디서든 불러올 수 있게 companion object를 이용해줬고, Context와 entryType(CREATE인지 UPDATE인지), entitiy(회원가입 데이터)를 받아와준다.
그리고 putExtra를 이용해서 키값과 entryType, entity를 받아와주는데 여기서 엔트리타입에 .ordinal()를 이용한 이유는 enum class는 값을 넣어줄때 String값을 그대로 받아올 수 없다. 그대신 ordinal()를 사용해주는데, 이건 열거된 값들의 index라고 생각하면된다.

enum class SignUpEntryType {
    CREATE,
    UPDATE
    ;
    companion object {
        fun getEntryType(ordinal: Int?): SignUpEntryType =
            SignUpEntryType.values().firstOrNull {
                it.ordinal == ordinal
            } ?: CREATE
    }
}

여기서는 CREATE, UPDATE두가지에 대해서 0,1의 값을 가져와준다.
그아래 getEntryType함수는 추후에 사용될 함수이다.
그리고 entryType의 값과 userEntity값을 이렇게 받아와준다.

private val entryType: SignUpEntryType by lazy {
    SignUpEntryType.getEntryType(
        intent?.getIntExtra(
            SignUpActivity.EXTRA_ENTRY_TYPE,
            SignUpEntryType.CREATE.ordinal))
}
private val userEntity: SignUpUserEntity? by lazy {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        intent?.getParcelableExtra(SignUpActivity.EXTRA_USER_ENTITY, SignUpUserEntity::class.java)
    } else {
        intent?.getParcelableExtra(SignUpActivity.EXTRA_USER_ENTITY)
    }
}

마지막으로 SignUpActivity에서 만들어준 버튼의 텍스트를 상황에 따라 바꿔준다.

btConfirm.setText(
	if (entryType == SignUpEntryType.UPDATE) {
    	"회원수정"
	} else {
    	"회원가입"
	}
)

받아온 entryType의 값이 UPDATE라면 버튼의 텍스트가 "회원수정", 값이 CREATE라면 "회원가입"이 text로들어가게된다.

profile
이우진

0개의 댓글