Serializable을 활용한 객체 전달 방법
Serializable을 활용한 객체 전달
Android에서 두 개의 Activity 간에 데이터를 전달할 때, 단순한 데이터만 전달할 수 있는 Intent를 사용합니다.
Intent를 통해 객체를 전달하려면 객체를 Serializable 인터페이스를 구현하여 직렬화(Serialization)해야 합니다.
직렬화는 객체를 바이트 스트림으로 변환하여 다른 Activity로 전달하고, 그 후 다시 역직렬화(Deserialization)를 통해 원래의 객체로 복원하는 과정입니다.
Serializable 인터페이스란?
Serializable 인터페이스는 자바에서 제공하는 내장 인터페이스로, 객체를 바이트 스트림으로 변환하여 쉽게 저장하거나 전송할 수 있게 도와줍니다. 이 인터페이스를 구현한 클래스의 객체는 Intent를 통해 다른 Activity로 전달할 수 있습니다.
1. 객체를 Serializable로 만들기
먼저, 전달하려는 객체가 Serializable 인터페이스를 구현해야 합니다. 예를 들어 Memo 객체를 전달한다고 가정하면, Memo 클래스는 Serializable 인터페이스를 구현해야 합니다.
Memo
import java.io.Serializable;
public class Memo implements Serializable {
private long id;
private String title;
private String content;
private String memoDate;
// 생성자, getter, setter 등
}
위 코드에서 Memo 클래스는 Serializable을 구현하고 있기 때문에, 해당 객체는 Intent를 통해 전달할 수 있습니다.
2. 객체 전달하기
객체를 Intent로 전달할 때는 putExtra() 메서드를 사용합니다. putExtra() 메서드는 Intent에 데이터를 추가하는 역할을 합니다.
객체를 전달할 때는 putExtra()에 객체를 Serializable로 전달하면 됩니다.
MemoAdapter
//카드뷰 클릭시
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int index=getAdapterPosition();
Memo memo=memoArrayList.get(index);
Long memoId=memo.id;
Intent intent = new Intent(context, UpdateActivity.class);
intent.putExtra("memo",memo);
intent.putExtra("index",index);
intent.putExtra("memoId",memoId);
//startActivity(intent); 없다.
//startActivity는 액티비티에서만 사용가능
//context.startActivity(intent); //이렇게 사용해야함
context.startActivity(intent);
}
});
}
3. 전달된 객체 받기
전달된 객체를 받는 쪽에서는 getSerializableExtra() 메서드를 사용하여 객체를 추출할 수 있습니다. 이때, Serializable 타입으로 반환되므로 이를 원하는 타입으로 캐스팅해야 합니다.
UpdateActivity
Memo memo = (Memo) getIntent().getSerializableExtra("memo"); // "memo" 키로 전달된 객체를 받기
if (memo != null) {
// 객체 사용
String title = memo.getTitle();
String content = memo.getContent();
// ...
}
4. Serializable의 장점
- 간편한 객체 전달: Serializable을 사용하면 객체를 직접 전달할 수 있어 코드가 깔끔하고 직관적입니다.
- 안정성: 자바 표준 인터페이스이기 때문에, 안드로이드에서 안정적으로 사용할 수 있습니다.
5. Serializable 사용 시 주의점
- 성능 문제: 객체가 크고 복잡할수록 직렬화 및 역직렬화 과정에서 시간이 많이 소요됩니다. 이런 경우 Parcelable을 사용하는 것이 성능상 더 유리할 수 있습니다.
- 프로토콜: Serializable을 사용할 때는 객체의 상태를 정확히 기록하고 복원할 수 있도록 적절한 직렬화 전략을 세워야 합니다.
결론
Serializable을 사용하면 객체를 Intent를 통해 손쉽게 다른 Activity로 전달할 수 있습니다. 하지만 성능이 중요한 경우, Parcelable을 사용하는 것이 더 나은 선택일 수 있습니다. 이 방식은 간단한 객체 전달이 필요한 경우 유용하며, 특히 Intent를 통해 객체를 전달하는 대부분의 안드로이드 애플리케이션에서 널리 사용됩니다.