---
title: 안드로이드에서 Parse 데이터 유형 사용 및 관리 가이드
slug: docs-kr/android/data-objects/android-data-types
description: 안드로이드 앱에서 Parse 데이터 유형을 읽고 저장하는 방법을 학습합니다. 다양한 데이터 객체의 활용 및 관리 기술을 제공합니다.
image: https://www.back4app.com/images/logo-social.png
createdAt: 2024-03-13T12:06:13.306Z
---

# 안드로이드에서 데이터 유형 파싱

## 소개

이 가이드에서는 안드로이드를 사용하여 Parse 데이터 유형에 대해 배웁니다. 안드로이드 앱에서 Back4App의 Parse 객체를 읽고 저장할 것입니다.

Parse에 데이터를 저장하는 것은 <font color="#2166ae">`ParseObject`</font>. 각 <font color="#2166ae">`ParseObject`</font>는 JSON 호환 데이터의 키-값 쌍을 포함합니다. 이 데이터는 스키마가 없으므로 각 <font color="#2166ae">`ParseObject`</font>에 어떤 키가 존재하는지 미리 지정할 필요가 없습니다. 우리는 원하는 키-값 쌍을 설정할 수 있으며, 우리의 백엔드는 이를 저장합니다. 예를 들어, 게임의 최고 점수를 추적한다고 가정해 보겠습니다. 단일 <font color="#2166ae">`ParseObject`</font>는 다음과 같은 내용을 포함할 수 있습니다:

:::BlockQuote
1   점수: 133&#x37;**,** 플레이어 이름: "Sean Plott"**,** 치트 모드: **false**
:::

키는 영숫자 문자열이어야 하며, 값은 다음과 같을 수 있습니다:

- <font color="#2166ae">`문자열`</font>=> <font color="#2166ae">`문자열`</font>
- <font color="#2166ae">`숫자`</font>(다음과 같은 원시 숫자 값 <font color="#2166ae">`int`</font>,<font color="#2166ae">`double`</font>)
- <font color="#2166ae">`불리언`</font>=> <font color="#2166ae">`boolean`</font>
- <font color="#2166ae">`날짜 및 시간`</font>=> java.util.Date
- <font color="#2166ae">`널`</font>=> JSONObject.NULL
- <font color="#2166ae">`배열`</font>=>JSONArray
- <font color="#2166ae">`파일`</font>=> Parse File
- <font color="#2166ae">`포인터`</font>=> 다른 ParseObject
- <font color="#2166ae">`관계`</font>=> ParseRelation
- <font color="#2166ae">`지오포인트`</font>=> ParseGeoPoint

각 <font color="#2166ae">`ParseObject`</font>는 우리가 다양한 종류의 데이터를 구별하는 데 사용할 수 있는 클래스 이름을 가지고 있습니다. 예를 들어, 우리는 최고 점수 객체를 <font color="#2166ae">`GameScore`</font>라고 부를 수 있습니다. 또한 편의를 위해 제공되는 몇 가지 필드를 지정할 필요가 없습니다:

- <font color="#2166ae">`objectId`</font>는 저장된 각 객체에 대한 고유 식별자입니다.
- <font color="#2166ae">`createdAt`</font>와 <font color="#2166ae">`updatedAt`</font>은 각 객체가 클라우드에서 생성되고 마지막으로 수정된 시간을 나타냅니다.

이 필드는 새 <font color="#2166ae">`ParseObject`</font>를 저장할 때 Back4app에 의해 자동으로 채워집니다.

:::hint{type="info"}
우리는 당신에게 <font color="#2166ae">`NameYourClassesLikeThis`</font> (UpperCamelCase) 및 <font color="#2166ae">`nameYourKeysLikeThis` </font>(lowerCamelCase)를 사용할 것을 권장합니다. 코드를 깔끔하게 유지하기 위해서입니다.
:::

이 튜토리얼은 Android Studio 4.1.1에서 생성된 기본 앱을 사용합니다. <font color="#2166ae">`buildToolsVersion=30.0.2`</font> , <font color="#2166ae">`Compile SDK Version`</font> = <font color="#2166ae">`30.0.2`</font> 및 <font color="#2166ae">`targetSdkVersion 30`</font>

:::hint{type="success"}
**언제든지 GitHub 리포지토리를 통해 전체 프로젝트에 접근할 수 있습니다.**

- [Kotlin 예제 리포지토리](https://github.com/templates-back4app/android_crud_operations_kotlin)
- [Java 예제 리포지토리](https://github.com/templates-back4app/android_crud_operations_java)
:::

## 목표

우리의 목표는 Parse Server에서 제공하는 모든 데이터 유형을 처리할 수 있는 Android 앱을 만드는 것입니다.
여기 우리가 달성할 것에 대한 미리보기입니다:

::Image[]{src="https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/v8KoOA0ezaDkvt7ZT1nFr_image.png" size="30" width="346" height="750" position="center" showCaption="false"}

## 전제 조건

:::hint{type="info"}
**이 튜토리얼을 완료하려면 다음이 필요합니다:**

- [안드로이드 스튜디오](https://developer.android.com/studio/index.html)
- Back4App에서 생성된 앱.
  - **참고:&#x20;**&#x20;[새 파스 앱 튜토리얼](https://www.back4app.com/docs/get-started/new-parse-app)을 따라 Back4App에서 파스 앱을 만드는 방법을 배우세요.
- Back4App에 연결된 안드로이드 앱.
  - **참고:&#x20;**&#x20;[파스 SDK 설치 튜토리얼](https://www.back4app.com/docs/android/parse-android-sdk)을 따라 Back4App에 연결된 안드로이드 스튜디오 프로젝트를 만드세요.
- 안드로이드 4.1 (젤리빈) 이상에서 실행되는 장치 (또는[ 가상 장치](https://developer.android.com/studio/run/managing-avds.html))
:::

## 우리 앱 이해하기

Parse에 대한 더 나은 이해를 위한 앱을 만들 것입니다 <font color="#2166ae">`데이터 유형`</font>. 이 <font color="#2166ae">`안드로이드`</font> 앱에서는 <font color="#2166ae">`DataTypes`</font>라는 클래스에서 모든 데이터 유형을 생성하고 이 클래스의 변수에 값을 할당합니다. 그런 다음 이 데이터를 읽고 업데이트할 것입니다.

:::hint{type="info"}
**참고** 데이터 유형 <font color="#2166ae">`포인터`</font>, <font color="#2166ae">`관계`</font>, <font color="#2166ae">`파일`</font>, <font color="#2166ae">`지오포인트`</font>은 나중에 특정 가이드에서 다룰 것입니다.
:::

## 시작해봅시다!

## 1 - 앱 템플릿 만들기

다음 변수를 <font color="#2166ae">`MainActivity`</font>에 정의하고 <font color="#2166ae">`onCreate`</font> 메서드의 코드를 다음 코드로 교체합니다.

:::CodeblockTabs
```java
1     private ProgressDialog progressDialog;
2     private View popupInputDialogView;
3     private RecyclerView recyclerView;
4     private String objectId;
5     private static final String TAG = "MainActivity";
6
7     @Override
8     protected void onCreate(Bundle savedInstanceState) {
9         super.onCreate(savedInstanceState);
10        setContentView(R.layout.activity_main);
11
12        progressDialog = new ProgressDialog(MainActivity.this);
13
14        Button saveData = findViewById(R.id.saveData);
15        Button readData = findViewById(R.id.readData);
16        Button updateData = findViewById(R.id.updateData);
17
18        saveData.setOnClickListener(saveDataView -> {
19            try {
20                saveDataTypes();
21            } catch (JSONException e) {
22                e.printStackTrace();
23            }
24        });
25
26        readData.setOnClickListener(readDataView -> readObjects());
27
28        updateData.setOnClickListener(updateDataView -> updateObject());
29
30    }
```

```kotlin
1     private var progressDialog: ProgressDialog? = null
2     private var objectId: String? = null
3     private var popupInputDialogView: View? = null
4     private var recyclerView: RecyclerView? = null
5     private val TAG = "MainActivity"
6
7     override fun onCreate(savedInstanceState: Bundle?) {
8        super.onCreate(savedInstanceState)
9         setContentView(R.layout.activity_main)
10
11        progressDialog = ProgressDialog(this@MainActivity)
12        val saveData = findViewById<Button>(R.id.saveData)
13        val readData = findViewById<Button>(R.id.readData)
14        val updateData = findViewById<Button>(R.id.updateData)
15        
16        saveData.setOnClickListener {
17            try {
18                saveDataTypes()
19            } catch (e: JSONException) {
20                e.printStackTrace()
21            }
22        }
23        readData.setOnClickListener { readObjects() }
24        updateData.setOnClickListener { updateObject() }
25    }
```
:::

:::hint{type="info"}
다음 단계에 앞서, <font color="#2166ae">`Back4App`</font>을(를) 우리 애플리케이션에 연결해야 합니다. <font color="#2166ae">`appId`</font>와 <font color="#2166ae">`clientKey`</font>를 <font color="#2166ae">`Back4App`</font>에서 <font color="#2166ae">`string.xml`</font> 파일에 저장한 후, <font color="#2166ae">`Parse`</font>를 우리 <font color="#2166ae">`App.java`</font> 또는 <font color="#2166ae">`App.kt`</font> 파일에서 초기화해야 합니다.
[새 Parse 앱 튜토리얼](https://www.back4app.com/docs/android/parse-android-sdk)을(를) 따라가세요. <font color="#2166ae">`Parse`</font>를(을) 앱에 초기화하는 방법을 모른다면.
:::

## 2 - 객체 저장을 위한 코드

create 함수는 Back4app 데이터베이스에 새로운 객체를 생성합니다. 우리는 <font color="#2166ae">`saveDataTypes`</font> 함수를 정의하고 <font color="#2166ae">`onCreate`</font> 함수에서 호출합니다. 이 함수에서 다음 코드를 사용합니다. 우리는 이 함수를 사용하여 모든 데이터 유형을 DataTypes 클래스 객체에 저장할 것입니다.

:::CodeblockTabs
```java
1  private void saveDataTypes() throws JSONException{
2      ParseObject parseObject = new ParseObject("DataTypes");
3
4         parseObject.put("stringField", "String");
5         parseObject.put("doubleField", 1.5);
6         parseObject.put("intField", 2);
7         parseObject.put("boolField", true);
8         parseObject.put("dateField", Calendar.getInstance().getTime());
9
10        JSONObject myObject = new JSONObject();
11        myObject.put("number", 1);
12        myObject.put("string", "42");
13
14        parseObject.put("jsonObject", myObject);
15
16
17        JSONArray myArray = new JSONArray();
18        myArray.put(myObject);
19        myArray.put(myObject);
20        myArray.put(myObject);
21
22        parseObject.put("jsonArray", myArray);
23
24
25        List<String> list = new ArrayList<>();
26        list.add("string1");
27        list.add("string2");
28        parseObject.put("listStringField", list);
29
30        List<Integer> listInt = new ArrayList<>();
31        listInt.add(1);
32        listInt.add(2);
33        listInt.add(3);
34        parseObject.put("listIntField", listInt);
35
36        List<Boolean> listBool = new ArrayList<>();
37        listBool.add(true);
38        listBool.add(false);
39        parseObject.put("listBoolField", listBool);
40
41        progressDialog.show();
42        parseObject.saveInBackground(e -> {
43            progressDialog.dismiss();
44            if (e == null) {
45                Toast.makeText(this, "Object created successfully...", Toast.LENGTH_SHORT).show();
46                objectId = parseObject.getObjectId();
47            } else {
48                objectId = null;
49                Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
50            }
51        });
52    }
```

```kotlin
1     private fun saveDataTypes() {
2     val parseObject = ParseObject("DataTypes")
3
4         parseObject.put("stringField", "String")
5         parseObject.put("doubleField", 1.5)
6         parseObject.put("intField", 2)
7         parseObject.put("boolField", true)
8         parseObject.put("dateField", Calendar.getInstance().time)
9
10
11        val myObject = JSONObject()
12        myObject.put("number", 1)
13        myObject.put("string", "42")
14
15        parseObject.put("jsonObject", myObject)
16
17        val myArray = JSONArray()
18        myArray.put(myObject)
19        myArray.put(myObject)
20        myArray.put(myObject)
21
22        parseObject.put("jsonArray", myArray)
23
24        val list: MutableList<String> = ArrayList()
25        list.add("string1")
26        list.add("string2")
27        parseObject.put("listStringField", list)
28
29        val listInt: MutableList<Int> = ArrayList()
30        listInt.add(1)
31        listInt.add(2)
32        listInt.add(3)
33        parseObject.put("listIntField", listInt)
34
35        val listBool: MutableList<Boolean> = ArrayList()
36        listBool.add(true)
37        listBool.add(false)
38        parseObject.put("listBoolField", listBool)
39
40        progressDialog?.show()
41        parseObject.saveInBackground {
42            progressDialog?.dismiss()
43            if (it == null) {
44                Toast.makeText(this, "Object created successfully...", Toast.LENGTH_SHORT).show()
45                objectId = parseObject.objectId
46            } else {
47                objectId = null
48                Toast.makeText(this, it.message, Toast.LENGTH_LONG).show()
49            }
50        }
51   }
```
:::

## 3 - 객체 읽기 코드

우리는 <font color="#2166ae">`objectId`</font> 변수를 <font color="#2166ae">`saveDataTypes`</font> 함수에서 쿼리에 매개변수로 전달하고, <font color="#2166ae">`saveDataTypes`</font> 함수에서 저장한 데이터를 <font color="#2166ae">`readObjects`</font> 함수로 읽어올 것입니다.

:::CodeblockTabs
```java
1 private void readObjects() {
2    if (objectId == null) {
3             Toast.makeText(this, "No object. Click on the 'Save Data' button before.", Toast.LENGTH_SHORT).show();
4             return;
5         }
6
7         ParseQuery<ParseObject> query = new ParseQuery<>("DataTypes");
8
9         progressDialog.show();
10        query.getInBackground(objectId, (object, e) -> {
11            progressDialog.dismiss();
12            if (e == null) {
13                List<Data> list = new ArrayList<>();
14                list.add(new Data("Int list field",object.get("listIntField").toString()));
15                list.add(new Data("String field",object.get("stringField").toString()));
16                list.add(new Data("Double field",object.get("doubleField").toString()));
17                list.add(new Data("Int field",object.get("intField").toString()));
18                list.add(new Data("String list field",object.get("listStringField").toString()));
19                list.add(new Data("Date field",object.get("dateField").toString()));
20                list.add(new Data("Bool field",object.get("boolField").toString()));
21                list.add(new Data("List Bool field",object.get("listBoolField").toString()));
22                list.add(new Data("Json Object field",object.get("jsonObject").toString()));
23                list.add(new Data("Json Array field",object.get("jsonArray").toString()));
24
25                showDataTypes(list);
26
27            } else {
28                Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
29            }
30        });
31 }
```

```kotlin
1 private fun readObjects() {
2    if (objectId == null) {
3             Toast.makeText(
4                 this,
5                 "No object. Click on the 'Save Data' button before.",
6                 Toast.LENGTH_SHORT
7             ).show()
8             return
9         }
10
11        val query = ParseQuery<ParseObject>("DataTypes")
12
13
14        progressDialog?.show()
15        query.getInBackground(
16            objectId
17        ) { obj, e ->
18            progressDialog?.dismiss()
19            if (e == null) {
20
21                val list: MutableList<Data> = ArrayList()
22                list.add(Data("Int list field", obj.get("listIntField").toString()))
23                list.add(Data("String field",obj.get("stringField").toString()))
24                list.add(Data("Double field", obj.get("doubleField").toString()))
25                list.add(Data("Int field", obj.get("intField").toString()))
26                list.add(Data("String list field", obj.get("listStringField").toString()))
27                list.add(Data("Date field",obj.get("dateField").toString()))
28                list.add(Data("Bool field", obj.get("boolField").toString()))
29                list.add(Data("List Bool field", obj.get("listBoolField").toString()))
30                list.add(Data("Json Object field", obj.get("jsonObject").toString()))
31                list.add(Data("Json Array field", obj.get("jsonArray").toString()))
32                showDataTypes(list)
33            } else {
34                Toast.makeText(this, e.message, Toast.LENGTH_SHORT).show()
35            }
36
37        }
38 }
```
:::

이 섹션에서는 <font color="#2166ae">`데이터`</font>라는 모델 클래스를 만들었습니다. 우리는 <font color="#2166ae">`readObjects`</font> 함수에서 얻은 데이터를 사용하여 이 모델 클래스의 객체를 생성합니다. 우리는 이 객체들을 <font color="#2166ae">`데이터`</font> 유형으로 만든 목록의 요소로 제공합니다. 그런 다음 이 목록을 <font color="#2166ae">`showDataTypes`</font> 함수의 매개변수로 제공하고 <font color="#2166ae">`AlertDialog`</font>에 나열합니다.

이것은 <font color="#2166ae">`데이터`</font> 모델입니다.&#x20;

:::CodeblockTabs
```java
1   public class Data {
2    private String type;
3    private String value;
4
5    public Data(String type, String value) {
6        this.type = type;
7        this.value = value;
8    }
9
10    public String getType() {
11        return type;
12    }
13
14    public Data setType(String type) {
15        this.type = type;
16        return this;
17    }
18
19    public String getValue() {
20        return value;
21    }
22
23    public Data setValue(String value) {
24        this.value = value;
25        return this;
26    }
27   }
```

```kotlin
1   class Data(val type:String?=null,val value:String?=null) {
2
3   }
```
:::

이것은 <font color="#2166ae">`showDataTypes`</font> 함수입니다.

:::CodeblockTabs
```java
1   private void showDataTypes(List<Data> list){
2        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
3        alertDialogBuilder.setTitle("Data types");
4        alertDialogBuilder.setCancelable(true);
5        initPopupViewControls(list);
6        //We are setting our custom popup view by AlertDialog.Builder
7        alertDialogBuilder.setView(popupInputDialogView);
8        final AlertDialog alertDialog = alertDialogBuilder.create();
9        alertDialog.show();
10    }
11
12    private void initPopupViewControls(List<Data> list) {
13        LayoutInflater layoutInflater = LayoutInflater.from(MainActivity.this);
14        popupInputDialogView = layoutInflater.inflate(R.layout.custom_alert_dialog, null);
15        recyclerView = popupInputDialogView.findViewById(R.id.recyclerView);
16        ItemAdapter adapter = new ItemAdapter(list,this);
17        recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
18        recyclerView.setAdapter(adapter);
19    }
```

```kotlin
1    private fun showDataTypes(list: List<Data>) {
2         val alertDialogBuilder = AlertDialog.Builder(this@MainActivity)
3         alertDialogBuilder.setTitle("Data types")
4         alertDialogBuilder.setCancelable(true)
5         initPopupViewControls(list)
6         //We are setting our custom popup view by AlertDialog.Builder
7         alertDialogBuilder.setView(popupInputDialogView)
8         val alertDialog = alertDialogBuilder.create()
9         alertDialog.show()
10    }
11
12    @SuppressLint("InflateParams")
13    private fun initPopupViewControls(list: List<Data>) {
14        val layoutInflater = LayoutInflater.from(this@MainActivity)
15        popupInputDialogView = layoutInflater.inflate(R.layout.custom_alert_dialog, null)
16        recyclerView = popupInputDialogView?.findViewById(R.id.recyclerView)
17        val adapter = ItemAdapter(this@MainActivity, list)
18        recyclerView?.layoutManager = LinearLayoutManager(
19            this,
20            LinearLayoutManager.VERTICAL,
21            false
22        )
23        recyclerView?.adapter = adapter
24    }
```
:::

## 4 - 객체 업데이트를 위한 코드

이 <font color="#2166ae">`updateObject`</font> 함수는 <font color="#2166ae">`saveDataTypes`</font> 함수에서 생성된 객체의 데이터를 업데이트하는 역할을 합니다. 우리는 다시 <font color="#2166ae">`objectId`</font>를 사용하여 객체를 업데이트합니다.

:::CodeblockTabs
```java
1   public void updateObject() {
2      if (objectId == null) {
3           Toast.makeText(this, "No object. Click on the 'Save Data' button before.", Toast.LENGTH_SHORT).show();
4           return;
5       }
6
7       ParseObject parseObject = new ParseObject("DataTypes");
8       parseObject.setObjectId(objectId);
9       parseObject.put("intField", 5);
10      parseObject.put("stringField", "new String");
11
12      progressDialog.show();
13
14      parseObject.saveInBackground(e -> {
15          progressDialog.dismiss();
16          if (e == null) {
17              Toast.makeText(this, "Object updated successfully...", Toast.LENGTH_SHORT).show();
18          } else {
19              Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
20          }
21      });
22  }
```

```kotlin
1   private fun updateObject() {
2      if (objectId == null) {
3           Toast.makeText(
4               this,
5               "No object. Click on the 'Save Data' button before.",
6               Toast.LENGTH_SHORT
7           ).show()
8           return
9       }
10
11      val parseObject = ParseObject("DataTypes")
12      parseObject.objectId = objectId
13      parseObject.put("intField", 5)
14      parseObject.put("stringField", "new String")
15
16      progressDialog?.show()
17
18      parseObject.saveInBackground {
19          progressDialog?.dismiss()
20          if (it == null) {
21              Toast.makeText(this, "Object updated successfully...", Toast.LENGTH_SHORT).show()
22          } else {
23              Toast.makeText(this, it.message, Toast.LENGTH_SHORT).show()
24          }
25      }
26  }
```
:::

## 5 - 카운터 사용하기

위의 예제는 일반적인 사용 사례를 포함하고 있습니다. <font color="#2166ae">`intField`</font> 필드는 우리가 지속적으로 업데이트해야 하는 카운터가 될 수 있습니다. 위의 솔루션은 작동하지만 번거롭고 여러 클라이언트가 동일한 카운터를 업데이트하려고 할 경우 문제를 일으킬 수 있습니다. Parse는 카운터 유형 데이터를 저장하는 데 도움이 되는 모든 숫자 필드를 원자적으로 증가시키는 메서드를 제공합니다. 따라서 동일한 업데이트를 다음과 같이 다시 작성할 수 있습니다:

:::CodeblockTabs
```java
1    ParseObject parseObject = new ParseObject("DataTypes");
2    parseObject.setObjectId(objectId);
3    parseObject.increment("intField",1);
```

```kotlin
1    val parseObject = ParseObject("DataTypes")
2    parseObject.objectId = objectId
3    parseObject.increment("intField",1)
```
:::

## 6 - 리스트 사용하기

Parse는 리스트 데이터를 저장하는 데 도움이 되는 메서드도 제공합니다. 리스트 필드를 원자적으로 변경하는 데 사용할 수 있는 세 가지 작업이 있습니다:

- <font color="#2166ae">`setAdd`</font> 및 <font color="#2166ae">`setAddAll`</font>: 주어진 객체를 배열 필드의 끝에 추가합니다.
- <font color="#2166ae">`setAddUnique`</font> 및 <font color="#2166ae">`setAddAllUnique`</font>: 배열 필드에 이미 포함되지 않은 주어진 객체만 해당 필드에 추가합니다. 삽입 위치는 보장되지 않습니다.
- <font color="#2166ae">`remove`</font> 및 <font color="#2166ae">`removeAll`</font>: 주어진 객체의 모든 인스턴스를 배열 필드에서 제거합니다.

### 6.1 - add 및 addAll 예제

<font color="#2166ae">`listStringField`</font> 의 값은:

:::BlockQuote
\["a","b","c","d","e","f","g","g"]
:::

아래 코드를 실행합니다:

:::CodeblockTabs
```java
1        ParseObject parseObject = new ParseObject("DataTypes");
2        parseObject.setObjectId(objectId);
3        parseObject.add("listStringField","e");
4        parseObject.addAll("listStringField", Arrays.asList("e", "f", "g", "g"));
5        parseObject.save();
```

```kotlin
1        val parseObject = ParseObject("DataTypes")
2        parseObject.objectId = objectId
3        parseObject.add("listStringField", "e")
4        parseObject.addAll("listStringField", Arrays.asList("e", "f", "g", "g"))
5        parseObject.save()
```
:::

이 명령어 후에 stringList 필드의 결과는:

:::BlockQuote
\["a","b","c","d","e","e","f","g","g"]
:::

### 6.2 - addUnique 및 addAllUnique 예제

<font color="#2166ae">`listStringField`</font> 의 값은:

:::BlockQuote
\["a","b","c","d","e"]
:::

아래 코드를 실행합니다:

:::CodeblockTabs
```java
1        ParseObject parseObject = new ParseObject("DataTypes");
2        parseObject.setObjectId(objectId);
3        parseObject.addUnique("listStringField","e");
4        parseObject.addAllUnique("listStringField",Arrays.asList("c", "d", "e", "f"));
5        parseObject.save();
```

```kotlin
1        val parseObject = ParseObject("DataTypes")
2        parseObject.objectId = objectId
3        parseObject.addUnique("listStringField", "e")
4        parseObject.addAllUnique("listStringField", Arrays.asList("c", "d", "e", "f"))
5        parseObject.save()
```
:::

이 명령어 후에<font color="#2166ae">`stringList`</font> 필드의 결과는 다음과 같습니다:

:::BlockQuote
\["a","b","c","d","e","f"]
:::

값이 중복되지 않았습니다.

### 6.3 - removeAll을 사용한 예제

<font color="#2166ae">`listStringField`</font>의 값은 다음과 같습니다:

:::BlockQuote
\["a","b","c","d","e","f"]
:::

아래 코드를 실행합니다:

:::CodeblockTabs
```java
1        ParseObject parseObject = new ParseObject("DataTypes");
2        parseObject.setObjectId(objectId);
3        parseObject.removeAll("listStringField",Arrays.asList("c", "d", "e", "f"));
4        parseObject.save();
```

```kotlin
1        val parseObject = ParseObject("DataTypes")
2        parseObject.objectId = objectId
3        parseObject.removeAll("listStringField", Arrays.asList("c", "d", "e", "f"))
4        parseObject.save()
```
:::

이 명령어 후에 <font color="#2166ae">`stringList`</font> 필드의 결과는 다음과 같습니다:

:::BlockQuote
\["a","b"]
:::

:::hint{type="info"}
**참고** 현재 동일한 저장에서 배열의 항목을 원자적으로 추가하고 제거하는 것은 불가능합니다. 수행하려는 각 배열 작업에 대해 별도로 저장을 호출해야 합니다.
:::

## 7 - ParseObject에서 단일 필드 제거하기

다음의 <font color="#2166ae">`remove`</font> 작업을 사용하여 객체에서 단일 필드를 삭제할 수 있습니다:

:::CodeblockTabs
```java
1    ParseObject parseObject = new ParseObject("DataTypes");
2    parseObject.remove("stringField");
3    parseObject.save();
```

```kotlin
1       val parseObject = ParseObject("DataTypes")
2       parseObject.remove("stringField")
3       parseObject.save()
```
:::

## 완료되었습니다!

이 시점에서 우리는 <font color="#2166ae">`Parse 데이터 유형`</font>에 대해 배웠습니다 <font color="#2166ae">`안드로이드`</font>.
