Parcelable, @Parcelize

남궁현·2023년 8월 30일
0

Android

목록 보기
12/15
  • 개인 과제 요구 사항 중 리사이클러뷰의 아이템을 클릭 시 상세페이지로 이동하면서 intent로 객체를 전달해서 데이터를 뿌려주기 위해 사용했다. 왜냐하면 그냥 putExtra를 사용해서 그냥 데이터를 넘겨버리면 컴파일 에러 "None of the following functions can be called with the arguments supplied" 즉 putExtra로는 호출 할 수 없다는 것이다.

Parcelable

안드로이드의 IPC(Inter-Process Communication)를 위해 만들어진 인터페이스다. IPC는 같은 시스템에서 실행되는 서로 다른 프로세스 간 데이터를 전송하는 매커니즘이다. 안드로이드에선 이걸로 다른 앱 또는 앱 안의 컴포넌트 간에 데이터를 전달해서 통신할 수 있게 된다. 이 인터페이스를 사용하면 객체를 이동시키기 위한 방법인 마샬링(또는 직렬화)를 정의할 수 있게 된다. 그러나 마샬링 정의 과정이 복잡하기 때문에 에러가 발생할 확률이 올라가고, 코드가 길어지기 때문에 가독성도 떨어질 수 있다.

@Parcelize

코틀린에서 제공하는 어노테이션으로 Parcelable 인터페이스 구현을 간소화한다. 컴파일러는 이 어노테이션이 붙은 클래스에 대해 자동으로 Parcelable 구현을 만들어 준다. 즉 개발자가 덜 귀찮아질 수 있고 가독성을 올릴 수 있다.

GoodsData

@Parcelize
data class GoodsData(
	val gImage: Int,
    val gName: String,
    val address: String,
    val gExp: String,
    val gPrice: Int,
    val sellerName: String,
    var likeCnt: Int,
    val chatCnt: Int,
    var isLike: Boolean
    ) : Parcelable
  • 다른 액티비티로 부터 객체를 전달받고 추출하는 코드

    	private val item : GoodsData? by lazy  {
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU){
          intent.getParcelableExtra(Constants.ITEM_OBJECT, GoodsData::class.java)
      }else{
          intent.getParcelableExtra<GoodsData>(Constants.ITEM_OBJECT)
      }

    아 번외로

    binding.detailPrice.text = DecimalFormat("#,###").format(item?.gPrice)+ "원"

    데이터 클래스에서 gPrice 를 String으로 주고 가격 표시를 하드코딩으로 했었는데 이렇게 DecimalFormat으로 패턴을 정할 수 있는 방법이 있었다.

profile
신입 안드로이드 개발자

0개의 댓글