달나라 노트

Android Studio - 다른 custom package import하기 본문

Android

Android Studio - 다른 custom package import하기

CosmosProject 2021. 4. 10. 20:19
728x90
반응형

 

 

 

보통 기능적인 내용(class, function 등)은 Android Studio에서 MainActivity.kt 파일 내에 적게됩니다.

 

근데 앱이 복잡해지고 여러 기능들이 추가되면서 선언되는 class, function이 많아지면 한 파일 내에 모든 것을 관리하는건 어려움이 있죠.

 

그래서 따로 .kt 파일을 생성하여 나눠서 관리하는 경우가 많습니다.

 

그러면 MainActivity.kt로 내가 만든 다른 .kt 파일들의 class를 어떻게 import시키는지를 알아봅시다.

 

 

 

먼저 Test를 할 view를 만들건데

TextView 1개와 Button 2개를 만들어서 버튼을 누를 때 마다 TextView에 글자를 띄워주거나 적힌 글자를 지우도록 할 것입니다.

 

 

 

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/result_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Test text" />

    <Button
        android:id="@+id/btn_show_text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Show text"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/result_text" />

    <Button
        android:id="@+id/btn_clear_text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="Clear text"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/btn_show_text" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

그러면 위와 같은 View가 완성됩니다.

 

Test Text가 적힌 곳에 글자가 출력될 것이며,

SHOW TEXT 버튼은 글자를 띄워주고,

CLEAR TEXT 버튼은 적힌 글자를 지워주는 기능을 하게 될 것입니다.

 

 

 

이제 각 버튼에 할당할 function을 정의할 차례입니다.

먼저 아래 이미지처럼 MainActivity.kt가 있는 곳에 Package를 만들어줍시다.

 

Package 버튼을 누르면

위와 같은 화면이 뜰텐데 아래 이미지처럼 가장 끝 부분에 functions라는 이름을 입력해줍시다.

 

 

 

 

그리고 생성된 functions라는 directory에 우클릭하여 Kotlin Class/File 버튼을 눌러서 함수의 내용을 담을 .kt 파일을 생성해줍시다.

 

위같은 이미지에 생성할 .kt파일 이름을 입력하면 되는데

저희는 2개를 생성할겁니다.

show_text.kt

clear_text.kt

 

이제 directory를 보면 위와 같은 형태가 되어있습니다.

 

 

 

show_text.kt 파일을 보면 위와 같은 내용이 적혀있을겁니다.

가장 첫 줄의 package com.example.test.funcions는 간단하게 show_text.kt가 어느 package directory에 있는지를 나타낸다고 생각하면 됩니다.

위에 directory형태를 보면

com.example.text 안에 functions라는 폴더가 있고 그 폴더 안에 show_text라는 파일이 있죠.

 

또한 class도 파일명(show_text.kt)과 동일하게 적혀있습니다.

미리 말하면 나중에 MainActivity.kt에서 show_text.kt파일을 import할 땐 show_test.kt의 show_text class를 import하게 될겁니다.

이 class 안에 원하는 내용들을 적으면 되는것이죠.

 

show_test.kt

package com.example.test.functions

import android.widget.TextView
import com.example.test.R

class show_text {
    fun show(view: TextView) {
        val result_text = view.findViewById<TextView>(R.id.result_text)
        result_text.text = "I like apple."
    }
}

내용을 위처럼 적었습니다.

하나씩 봐봅시다.

 

show라는 이름의 function을 선언하였고 argument로는 TextView 형식의 view라는 이름의 변수를 받게됩니다.

왜냐면 이 함수는 TextView에다가 글자를 띄워줘야하기 때문이죠.

 

함수 내부에는 text_view라는 변수에 id가 result_text인 TextView를 찾아서 넣고 있습니다.

 

그리고 마지막으로 text 속성에 I like apple. 이라는 글자를 할당하고있죠.

 

(이렇게 코드 내용을 적으면 import andoird.widget.TextView 등의 기타 필요한 import 내용은 자동으로 추가됩니다.)

 

이렇게 글자를 보여주는 기능이 완성되었습니다.

 

 

 

 

 

그러면 글자를 지워주는 내용도 작성해봅시다.

이 내용은 clear_text.kt 파일에 정의될겁니다.

 

clear_text.kt

package com.example.test.functions

import android.widget.TextView
import com.example.test.R

class clear_text {
    fun clear(view: TextView) {
        val result_text = view.findViewById<TextView>(R.id.result_text)
        result_text.text = ""
    }
}

 

show_text.kt의 내용과 비슷하지만 함수명과 text 속성에 할당되는 내용이 공백("")으로 다릅니다.

 

 

 

 

 

이제 기능적인 function들은 다 적었으니

이 function들을 MainActivity에서 Button에 할당해봅시다.

 

MainActivity.kt

package com.example.test

import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.example.test.functions.clear_text
import com.example.test.functions.show_text

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

        val btn_show_text = findViewById<Button>(R.id.btn_show_text)
        btn_show_text.setOnClickListener() {
            val result_text_view = findViewById<TextView>(R.id.result_text)

            val cls_show_text = show_text()
            cls_show_text.show(result_text_view)
        }

        val btn_clear_text = findViewById<Button>(R.id.btn_clear_text)
        btn_clear_text.setOnClickListener() {
            val result_text_view = findViewById<TextView>(R.id.result_text)

            val cls_clear_text = clear_text()
            cls_clear_text.clear(result_text_view)
        }
    }
}

완성된 코드는 위와 같습니다.

부분부분 나눠봅시다.

 

 

import com.example.test.functions.show_text // 4-1

class MainActivity : AppCompatActivity() {
    ...
    
        val btn_show_text = findViewById<Button>(R.id.btn_show_text) // 1
        btn_show_text.setOnClickListener() { // 2
            val result_text_view = findViewById<TextView>(R.id.result_text) // 3

            val cls_show_text = show_text() // 4
            cls_show_text.show(result_text_view) // 5
        }

        ...
    }
}

먼저 show_text class를 할당하는 과정입니다.

1. btn_show_text라는 id를 가진 Button View를 btn_show_test에 할당합니다.

 

2. 생성한 button 객체의 setOnClickListener에 원하는 기능들을 설정해줍니다.

 

3. 글자를 나타낼 id = result_text인 TextView를 변수 result_text_view에 담습니다.

 

4. show_text.kt 파일에서 정의된 show_text라는 class를 cls_show_text 변수에 할당합니다.

이 부분이 핵심인데 android studio는 현재 프로젝트 내에 정의된 여러 Package와 각 package에 존재하는 여러 class들을 기본적으로 인식하고 있습니다.

따라서 위처럼 원하는 class 이름만 입력하면 자동으로 4-1에서 보는것처럼 해당 class가 있는 show_text.kt 파일을 자동으로 import해줍니다.

여기서 주의할 점은 4-1에서 의미하는 functions.show_text는 show_text.kt 파일을 의미하며

4에서 말한 show_text()는 show_text.kt 파일 안에 있는 show_text class를 의미합니다.

 

5. cls_show_text는 show_text() class를 이용해 생성되었으므로 show_text() class 내에 있는 show 함수도 가지고 있습니다.

이 show함수를 실행합니다.

또한 함수 실행 시 view: TextView가 argument로 들어갔었죠?

따라서 show 함수 실행 시에 미리 생성해둔 result_text_view를 넣어줍니다.

 

 

 

 

import com.example.test.functions.clear_text

class MainActivity : AppCompatActivity() {
        ...

        val btn_clear_text = findViewById<Button>(R.id.btn_clear_text)
        btn_clear_text.setOnClickListener() {
            val result_text_view = findViewById<TextView>(R.id.result_text)

            val cls_clear_text = clear_text()
            cls_clear_text.clear(result_text_view)
        }
    }
}

clear_text 기능도 완전히 동일합니다.

 

 

 

 

 

Emulator로 실행시켜보면 위처럼 나오고

 

 

 

SHOW TEXT 버튼을 눌렀을 때 I like apple.이라는 글자가 제대로 표시되며

 

 

 

CLEAR TEXT 버튼을 누르면 텍스트가 사라지는 것을 알 수 있습니다.

 

제대로 작동되죠?

 

 

 

 

 

 

 

 

 

 

import는 Package 파일들 사이끼리도 가능합니다.

 

 

동일하게 위처럼 functions.kt 파일을 생성해봅시다.

 

 

functions.kt

package com.example.test.functions

class funcions {
    val show_text_2 = show_text() // 1
    val clear_text_2 = com.example.test.functions.clear_text() // 2
}

functions.kt에서는 clear_text.kt, show_text.kt 두 파일의 class를 가져올것입니다.

 

1. show_text_2 변수에 show_text() class를 할당하고 있습니다. 여기서 말하는 show_text() class는 show_text.kt 파일에 있는 show_text class입니다.

이렇게 Android Studio는 프로젝트에서 선언된 class를 기본적으로 인식하고 있기 때문에 class의 이름만 적어도 되며, functions.kt와 show_text.kt는 동일한 package 내에 있기 때문에 별도의 import도 필요 없습니다.

 

2. clear_text_2 변수에 clear_text() class를 할당하고 있습니다.

1번과는 다르게 cleat_text가 있는 package까지 명시해줬습니다. 다만 package의 위치를 적어줬을 뿐 1번과 다른 것은 없습니다.

또한 한가지 주의할 점은 com.example.test.functions.clear_text()를 보면 마치 functions package에 있는 clear_text.kt 파일을 의미하는 것 같지만 아닙니다. 파일명은 무시되고 clear_text.kt 파일에 있는 clear_text class를 의미한다는 것을 알아둡시다.

 

 

 

MainActivity.kt

package com.example.test

import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.example.test.functions.funcions

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

        val btn_show_text = findViewById<Button>(R.id.btn_show_text)
        btn_show_text.setOnClickListener() {
            val result_text_view = findViewById<TextView>(R.id.result_text)

            val func = funcions()
            func.show_text_2.show(result_text_view)
        }

        val btn_clear_text = findViewById<Button>(R.id.btn_clear_text)
        btn_clear_text.setOnClickListener() {
            val result_text_view = findViewById<TextView>(R.id.result_text)

            val func = funcions()
            func.clear_text_2.clear(result_text_view)
        }
    }
}

이제 MainActivity.kt에서도 show_text.kt, clear_text.kt를 각각 import하는 것이 아니라 functions.kt를 import하는 방식으로 바꿔야합니다.

코드는 위와 같으며 분리해서 알아봅시다.

 

...
import com.example.test.functions.funcions // 4-1

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...

        val btn_show_text = findViewById<Button>(R.id.btn_show_text) // 1
        btn_show_text.setOnClickListener() { // 2
            val result_text_view = findViewById<TextView>(R.id.result_text) // 3

            val func = funcions() // 4
            func.show_text_2.show(result_text_view) // 5
        }

        ...
    }
}

먼저 show text button입니다.

1. btn_show_text 변수에 id = btn_show_text인 Button View를 할당합니다.

 

2. Button이 클릭했을 때 발생할 동작을 위해 setOnClickListener를 설정합니다.

 

3. result_text_view 변수에 text가 표시될 TextView를 할당합니다.

 

4. func 변수에 functions class를 할당합니다.

마찬가지로 4-1 부분을 보면 functions class가 자동으로 import되었습니다.

 

5. func 변수는 functions class를 받았으니 functions class에 있는 show_text_2 속성을 사용할 수 있습니다.

show_text_2 속성은 show() method를 가지고 있으므로 show() method를 실행합니다.

 

 

 

...
import com.example.test.functions.funcions

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...

        val btn_clear_text = findViewById<Button>(R.id.btn_clear_text)
        btn_clear_text.setOnClickListener() {
            val result_text_view = findViewById<TextView>(R.id.result_text)

            val func = funcions()
            func.clear_text_2.clear(result_text_view)
        }
    }
}

이것도 마찬가지이므로 한번 천천히 봐봅시다.

 

 

여기까지 적고 앱을 실행시켜보면 잘 작동되는 것을 확인할 수 있습니다.

 

 

 

 

 

728x90
반응형
Comments