나만의 개발노트

[안드로이드] Serializable, Parcelable 본문

[안드로이드]/[안드로이드] 공부 기록

[안드로이드] Serializable, Parcelable

노트포미 2023. 10. 12. 03:57

Serializable

: putExtra()로는 기본 자료형(Integer,String...)만 전달할 수 있음

 -> 객체를 부가데이터로 전달할 수 있게 해주는 것

 

[특징]

- ArrayList와 같은 객체들은 이미 Serializable 인터페이스를 구현하고 있어서 그대로 부가데이터로 추가할 수 있음

- 메모리 용량을 많이 사용함

 

[사용법 - ArrayLIst예시]

1. MainActivity에 Intent와 ArrayList 만들기

//MainActivity.java
Intent intent = new Intent(getApplicationContext(),MenuActivity.class);

ArrayList<String> names = new ArrayList<>();

2. ArrayList를 부가데이터로 보내기

//MainActivity.java
intent.putExtra("names",names);

3. MenuActivity에서 getIntent()로 인텐트 받기

//MenuActivity.java
Intent passedIntent = getIntent();

 

#최종 MainActivity.java

package com.example.myparcelable;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),MenuActivity.class);

                ArrayList<String> names = new ArrayList<>();
                names.add("유지민");
                names.add("김민정");

                intent.putExtra("names",names);

                startActivity(intent);
            }
        });
    }
}

#최종 MenuActivity.java

package com.example.myparcelable;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MenuActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);

        Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        Intent passedIntent = getIntent();
        
        //전달받은 ArrayList의 첫인덱스
        String name = passedIntent.getStringArrayListExtra("names").get(0);
        Toast.makeText(getApplicationContext(),name,Toast.LENGTH_LONG).show();
    }
}

 


Parcelable

: 직접 정의한 객체를 부가데이터로 보낼 수 있게 도와주는 인터페이스

 

[특징]

- Serializable 보다 메모리 용량을 적게 사용함

 

[사용법 - SimpleData class 생성]

1. Project -> java -> 우클릭 new -> java class -> SimpleData.java클래스 생성

2. implements Parcelable하기

public class SimpleData implements Parcelable{
...
}

3. 우클릭 generate -> implement methods 모두 생성

@Override
public int describeContents() {
	return 0;
}

@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {

}

4. SimpleData 객체에 들어갈 변수 선언 후 생성자 만들기

int number;
String message;

public SimpleData(int number, String message) {
    this.number = number;
    this.message = message;
}

5. Parcel로 SimpleData객체를 만들 수 있는 생성자도 만들기

public SimpleData(Parcel src){
    number = src.readInt();
    message = src.readString();
}

6. CREATOR field 만들기

public static final Parcelable.Creator CREATOR = new Parcelable.Creator(){
    @Override
    public Object createFromParcel(Parcel source) {
        return null;
    }

    @Override
    public Object[] newArray(int size) {
        return new Object[0];
    }
};

-> 두 메소드 SimpleData전용으로 작성

public static final Parcelable.Creator CREATOR = new Parcelable.Creator(){

    //Parcel로 SimpleData객체 만들기
    @Override
    public SimpleData createFromParcel(Parcel source) {
        return new SimpleData(source);
    }

    @Override
    public SimpleData[] newArray(int size) {
        return new SimpleData[size];
    }
};

7. writeToParcel() 작성

//SimpleData객체 -> Parcel
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
    dest.writeInt(number);
    dest.writeString(message);
}

                                      =====Parcelable 인터페이스를 사용한 클래스 SimpleData 작성완료=====


8. MainActivity에 SimpleData 객체 생성

SimpleData data = new SimpleData(112,"Hello");

9. SimpleData 객체 intent의 부가데이터로 넣기

intent.putExtra("data",data);

10. MenuActivity에서 Parcelable을 통해 SimpleData 객체 받기

//MenuActivity.java
Intent passedIntent = getIntent();

SimpleData data = (SimpleData) passedIntent.getParcelableExtra("data");
String message = data.message;
Toast.makeText(getApplicationContext(),message,Toast.LENGTH_LONG).show();

#최종 SimpleData.java

package com.example.myparcelable;

import android.os.Parcel;
import android.os.Parcelable;

import androidx.annotation.NonNull;

public class SimpleData implements Parcelable {

    int number;
    String message;

    public SimpleData(int number, String message) {
        this.number = number;
        this.message = message;
    }

    public SimpleData(Parcel src){
        number = src.readInt();
        message = src.readString();
    }

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator(){

        //Parcel로 SimpleData객체 만들기
        @Override
        public SimpleData createFromParcel(Parcel source) {
            return new SimpleData(source);
        }

        @Override
        public SimpleData[] newArray(int size) {
            return new SimpleData[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    //SimpleData객체 -> Parcel
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeInt(number);
        dest.writeString(message);
    }
}

#최종 MainActivity.java (데이터 수신)

package com.example.myparcelable;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),MenuActivity.class);
                
                SimpleData data = new SimpleData(112,"Hello");
                intent.putExtra("data",data);

                startActivity(intent);
            }
        });
    }
}

#최종 MenuActivity.java (데이터 발신)

package com.example.myparcelable;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MenuActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);

        Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        Intent passedIntent = getIntent();
		
        //전달받은 Parcel로 SimpleData객체 만들기
        SimpleData data = (SimpleData) passedIntent.getParcelableExtra("data");
        String message = data.message;
        Toast.makeText(getApplicationContext(),message,Toast.LENGTH_LONG).show();
    }
}

[참고] 3-2강

www.boostcourse.org/mo316

 

안드로이드 앱 프로그래밍

부스트코스 무료 강의

www.boostcourse.org

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

 

[Android] Parcelable vs Serializable 우린 뭘 써야할까?

차이를 알고 쓰자.이 글은 Parcelable vs Serializable , 정말 Serializable은 느릴까? 해당 글을 읽고 작성 되었으며 일부를 참고하고 있습니다.평소 Object를 Intent를 통해 넘길 때 너무 자연스럽게도 parcelable

velog.io