코틀린 안드로이드 앱개발 강좌, 파일에 보관하기

안드로이드 앱 개발에서 데이터를 효과적으로 보관하는 방법은 매우 중요합니다. 사용자의 데이터를 안전하게 보관하고 이를 쉽게 관리할 수 있어야 합니다. 이 강좌에서는 Kotlin을 이용하여 안드로이드에서 파일 시스템을 통해 데이터를 저장하고 관리하는 방법에 대해 알아보겠습니다. 이 글에서는 내부 저장소, 외부 저장소, 그리고 파일 입출력(I/O) 등에 대해 심층적으로 다룰 것입니다.

1. 안드로이드 파일 시스템 개요

안드로이드에는 두 가지 주요 저장소 옵션이 있습니다: 내부 저장소와 외부 저장소입니다. 각각의 저장소는 접근 방식과 저장 데이터의 지속성 관점에서 다릅니다.

1.1 내부 저장소

내부 저장소는 애플리케이션 전용 영역으로, 다른 애플리케이션에서 접근할 수 없습니다. 여기서 저장된 데이터는 애플리케이션이 삭제될 때 함께 삭제됩니다. 내부 저장소는 민감한 데이터를 저장하는 데 적합합니다.

1.2 외부 저장소

외부 저장소는 애플리케이션이 아닌 일반 사용자가 접근할 수 있는 저장소입니다. 이는 일반적으로 SD 카드와 같은 외부 메모리 장치에 해당됩니다. 외부 저장소에 저장된 데이터는 애플리케이션이 삭제되어도 남아 있습니다. 따라서 사용자와 공유할 수 있는 공용 데이터를 저장하는 데 적합합니다.

2. 파일 입출력(I/O) 기본

파일 입출력(Files I/O)은 데이터를 읽고 쓰는 과정을 설정하게 해줍니다. 코틀린에서 안드로이드의 파일 시스템에 접근하기 위해서는 다음과 같은 작업을 수행해야 합니다:

  • 파일을 생성하고 쓰기
  • 파일을 읽기
  • 파일 삭제

2.1 파일 작성하기

먼저 내부 저장소에 파일을 작성하는 코드 예제를 살펴보겠습니다.

 
fun writeToFile(filename: String, data: String) {
    // 내부 저장소에 파일 작성
    context.openFileOutput(filename, Context.MODE_PRIVATE).use { output ->
        output.write(data.toByteArray())
    }
}

위의 함수는 파일 이름과 데이터를 매개변수로 받고, 내부 저장소에 해당 데이터를 파일로 작성합니다.

2.2 파일 읽기

이제 우리가 작성한 파일을 읽는 방법을 보겠습니다.


fun readFromFile(filename: String): String {
    // 내부 저장소에서 파일 읽기
    return context.openFileInput(filename).bufferedReader().use { it.readText() }
}

이 함수는 파일 이름을 매개변수로 받아서 해당 파일의 내용을 문자열로 반환합니다.

2.3 파일 삭제

이제 특정 파일을 삭제하는 방법도 알아보겠습니다. 해당 파일명을 매개변수로 전달하여 파일을 삭제할 수 있습니다.


fun deleteFile(filename: String) {
    context.deleteFile(filename)
}

3. 외부 저장소에 파일 저장하기

이제 외부 저장소에 파일을 저장하는 방법을 보겠습니다. 외부 저장소에 접근하기 위해서는 적절한 권한을 설정해야 합니다. 다음은 외부 저장소에 파일을 저장하는 코드 예제입니다.

3.1 권한 요청

외부 저장소에 데이터를 쓰기 위해서는 WRITE_EXTERNAL_STORAGE 권한이 필요합니다. 따라서 AndroidManifest.xml 파일에 다음 코드를 추가해야 합니다:


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

3.2 파일 작성하기

아래는 외부 저장소에 파일을 작성하는 방법입니다.


fun writeToExternalFile(filename: String, data: String) {
    val directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
    val file = File(directory, filename)
    
    file.writeText(data)
}

이 코드는 사용자 문서 디렉토리에 파일을 작성하는 예시입니다.

3.3 파일 읽기

외부 저장소에 있는 파일을 읽는 코드는 아래와 같습니다.


fun readFromExternalFile(filename: String): String {
    val directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
    val file = File(directory, filename)
    
    return file.readText()
}

3.4 파일 삭제

외부 저장소에 있는 파일을 삭제하는 방법은 다음과 같습니다.


fun deleteExternalFile(filename: String) {
    val directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
    val file = File(directory, filename)
    
    if (file.exists()) {
        file.delete()
    }
}

4. 예제 앱 프로젝트

이제 위의 모든 코드를 활용하여 간단한 안드로이드 앱을 만들어 보겠습니다. 사용자가 텍스트를 입력하면 이를 내부 저장소와 외부 저장소에 작성하고, 읽고, 삭제할 수 있는 앱을 구축하겠습니다.

4.1 Android Studio 프로젝트 설정

Android Studio를 열고 새 프로젝트를 생성합니다. 적절한 패키지 이름과 최소 SDK를 선택합니다.

4.2 UI 설계

activity_main.xml 파일을 열고 다음과 같이 UI를 설정합니다:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="데이터 입력"/>

    <Button
        android:id="@+id/btnSaveInternal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="내부 저장소에 저장"/>

    <Button
        android:id="@+id/btnSaveExternal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="외부 저장소에 저장"/>

    <Button
        android:id="@+id/btnReadInternal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="내부 저장소에서 읽기"/>

    <Button
        android:id="@+id/btnReadExternal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="외부 저장소에서 읽기"/>

    <Button
        android:id="@+id/btnDeleteInternal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="내부 저장소 파일 삭제"/>

    <Button
        android:id="@+id/btnDeleteExternal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="외부 저장소 파일 삭제"/>

    <TextView
        android:id="@+id/textViewOutput"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="결과 출력"/>
    
</LinearLayout>

4.3 MainActivity.kt에 코드 추가

이제 MainActivity.kt 파일에 다음과 같이 코드를 추가하여 버튼 클릭 이벤트를 관리하고 파일 입출력을 처리합니다.


class MainActivity : AppCompatActivity() {
    
    private lateinit var editText: EditText
    private lateinit var textViewOutput: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        editText = findViewById(R.id.editText)
        textViewOutput = findViewById(R.id.textViewOutput)
        
        findViewById

5. 결론

이 강좌를 통해 안드로이드에서 파일 시스템을 사용하는 방법에 대해 배웠습니다. 내부 및 외부 저장소를 통해 데이터를 저장하고 읽을 수 있는 방법과, 코틀린을 사용하여 이를 구현하는 기본적인 기술을 습득했습니다. 이러한 기능들은 여러분의 앱에서 사용자 데이터를 안전하게 관리하는 데 큰 도움이 될 것입니다. 다음 단계로는 데이터베이스와 같은 더 복잡한 데이터 저장 방법에 대해 탐구해 보시기 바랍니다.

6. 더 알아보기

안드로이드와 코틀린에 대한 추가 자료를 찾아보며 더 많은 예제를 실험해 보세요. 이를 통해 안드로이드 앱 개발에 대한 이해도를 높이고, 더 나아가복잡한 데이터 관리 문제를 해결할 수 있을 것입니다.