안드로이드 Parcelable 간단히 사용해보기 with Kotlin

: ) YOUNG·2022년 10월 18일
1

안드로이드

목록 보기
4/17
post-thumbnail


Parcelable

  • 자바에서 객체를 전달할 때 직렬화인 Serializable을 사용하여 데이터를 넘겨준다

  • 안드로이드에서는 Parcelable를 사용할 것을 권장하고 있다.

    • 여기서는 권장일 뿐이기 때문에 무조건 사용할 필요는 없다.
    • 대부분의 경우에서 parcelable이 빠르다는 의견이 있기 때문인데, 이 또한 직렬화에서 쓰기와 읽기를 구현하면 더 빠르다는 자료가 있기 때문에 무조건 맹신하는 것은 좋지 않은것 같다.
  • 하지만 권장하기 때문에 알고있어야 한다고 생각해서 연습삼아 간단하게 intent를 통해 사용해보았다.


data class의 객체를 Parcelable을 통해서 Intent로 간단하게 전달해보자.

MainActivity에는 버튼을 하나 만들어주고, SubActivity에는 TextView하나만 만들어서 객체가 제대로 전달이 되는지 확인해볼것이다.

핵심은 data class User이다.

data class가 Parcelable을 implements해줘야한다. 그리고 필수코드를 구현해주면 된다.

처음형태는 위와 같고, 이제 : Parcelable을 통해 구현해주자.

이렇게 : Parcelable을 붙여주면, Parcelable interface를 implements 할 수 있다.

이제 class User 아래 처럼 빨간줄에 마우스를 올리면 아래 사진처럼 implements method라는 문구를 볼 수 있는데 이를 클릭해서 필수 메소드를 구현해주자

그렇게 하고 나면 이렇게 구현되지 않은 interface의 메소드가 나오게 된다.

여기서 한번 빨간줄을 클릭해서 method를 implements했는데도 빨간줄이 남아서 더 add해야할 코드가 있을 수 있으니까 혹시 빨간줄이 또 생긴다면 다시 해서 모든 method를 불러오시면 됩니다.

이제 아래와 같이 간단히 구현만 하면 된다.

우리가 직접 read와 write가 중요한데, 사실상 말그대로 객체를 읽고 쓰는 개념이라고 보면된다. 때문에 아래 사진처럼 구현해주면 된다.

이제 data class 구현은 모두 끝났고,
binding을 한 후에 버튼을 클릭하면 임의로 만들어진 User객체를 SubActivity로 전달하는 코드를 구현해준다.


SubActivity에서는 textView에 넘겨받은 intent를 그대로 User타입으로 받아서 "User"로 넘겨받았으니 해당 값을 꺼내서 toString()으로 text에 넘겨주기만 하면 결과를 볼 수 있다.





실행 화면







전체 코드

MainActivity


class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.mainButton.setOnClickListener {
            val intent = Intent(this, SubActivity::class.java)

            // parcelable을 이용해서 객체를 넘겨줌.
            intent.putExtra("User", User("Nick seven", 21))
            startActivity(intent)
        }

    }
}


SubActivity


class SubActivity : AppCompatActivity() {
    private lateinit var binding: ActivitySubBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivitySubBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.subTv.text = intent.getParcelableExtra<User>("User").toString()
    }
}


data class User


data class User(var name: String?, var age: Int) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readInt()
    )

    override fun describeContents(): Int {
        return 0
    }

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest?.writeString(name)
        dest?.writeInt(age)
    }

    companion object CREATOR : Parcelable.Creator<User> {
        override fun createFromParcel(parcel: Parcel): User {
            return User(parcel)
        }

        override fun newArray(size: Int): Array<User?> {
            return arrayOfNulls(size)
        }
    }

}

0개의 댓글