Activity간의 data이동은 어떻게 할까?

주효은·2024년 4월 18일
1

Data Class

목표

SignUpActivity에서 입력받은 4개의 정보 (ID, PW, NICKNAME, MBTI)를 LoginActivity로 보내고자 한다.

데이터 직렬화

새롭게 아래에 파일을 데이터 파일을 만드는게 좋다

현 상황, SignUpData파일을 하나 만들어서 데이터들를 정렬 해놓은 상황

// SignUpData

@Parcelize
data class UserDataInput(
    val userId: String,
    val userPW: String,
    val userNickName: String,
    val userMbti: String,
) : Parcelable 

Q. Paracelize란?

액티비티에서 액티비티로 '객체'를 전달할 때 사용한다.
필드값 하나 하나를 putExtra()를 이용하여 코드를 더럽게 썼던 지난 날들을 뒤로 하고..
한 번에 객체 자체를 통째로 넘기는 방법에 쓰인다.
Serializable과 Parcelable에 관해 너무 잘 정리한 글이 있어 아래에 첨부하겠다.

https://velog.io/@haero_kim/Android-Serializable-vs-Parcelable

어 근데 왜 빨간 줄이 뜨지..?

app수준의 build.gradle에 plugin 추가 후 sync를 해보자 ㅎㅎ

plugins {
    id "kotlin-parcelize"
}

UserDataInput이라는 data class를 가져와서 원하는 데이터를 담아보자

잠시, 현재 상황을 한 눈에 보기 위해 그림을 그려봤다.

//SignUpActivity

binding.btnSignup2.setOnClickListener {
       val signid = binding.etIdSignup.text.toString()
       val signpw = binding.etPwSignup.text.toString()
       val signname = binding.etNicknameSignup.text.toString()
       val signmbti = binding.etMbtiSignup.text.toString()

       val userData = UserDataInput(signid, signpw, signname, signmbti)

userData라는 변수명을 하나 만든 뒤, dataClass에서 가져온 UserDataInput클래스를 가져와서 4개의 변수를 넣어준다.

val userData = UserDataInput(signid, signpw, signname, signmbti)

이 코드를 통해 현재 SignUpActivity에서 입력받은 4개의 변수가 저장되었다.

잠깐) 지금 글을 쓰는 시점에서 with()를 이용할 수도 있겠다는 생각이 들었다
with(binding) {
    btnSignup2.setOnClickListener {
        val signid = etIdSignup.text.toString()
        val signpw = etPwSignup.text.toString()
        val signname = etNicknameSignup.text.toString()
        val signmbti = etMbtiSignup.text.toString()
    }
}

이제 userData를 LoginActivity로 보내는 일을 해보자 (형광펜 친 과정)

 val intent = Intent(this@SignUpActivity, LoginActivity::class.java).apply {
                        putExtra(LoginActivity.INTENT_USER_DATA, userData)
                    }
                    startActivity(intent)

putExtra(key값, value값)

value, 즉 전달하고자 하는 내용을 담으면된다.

아까 만들었던 userData가 value가 된다.

  //LoginActivity
  companion object {
        const val INTENT_USER_DATA = "userData"
    }

이때, userData를 받을 액티비티인 LoginActivity에는 받은 userData전체를 INTENT_USER_DATA로 상수화를 시켜줬다.

때문에, 이제 우리는 putExtra를 모두 이해할 수 있다

putExtra(옮기고자하는_엑티비티명.그_액티비티에_상수화_변수명, 옮기고자 하는 값)

그 이후,

  //LoginActivity
  
  val userData = intent.getParcelableExtra<UserDataInput>(INTENT_USER_DATA)

loginActivity의 userData(변수명은 같으나 다른 액티비티에서 선언된 변수)에 다시 가져와주는 것이다.


만약, data class 전체 내용 중 일부만 불러오고 싶다면? data class로 다시 가보자

@Parcelize
data class UserDataInput(
    val userId: String,
    val userPW: String,
    val userNickName: String,
    val userMbti: String,
) : Parcelable {
    fun getUserSignUpId(): String {
        return userId
    }
    fun getUserSignUpPw(): String {
        return userPW
    }
}

선언한 data class 아래에 함수를 만들어 원하는 데이터를 get 해오자

이때, 주의할 점이 하나 있다

@Parcelize 어노테이션을 사용하면 자동으로 Parcelable을 구현하는 코드를 생성해주는데, 이 때 getter 메서드가 자동으로 생성되기 때문에!

fun getUserId(): String {
		return userId
		}

이런 함수명을 쓰면 충돌이 일어나게 되니, 조심하자.

다시 돌아가서 함수명에서 충돌이 안일어나게 getUserSIgnUpID를 만들었다면

      //SignUpActivity
        val signId = userData?.getUserSignUpId()
        val signPw = userData?.getUserSignUpPw()

이렇게 불러올 수 있게 된다.

이때, 불러오는 data class가 변수가 null일 수 있기에 nullable 검사를 수행해서 NullPointerException 발생을 막아야한다.

0개의 댓글