코틀린 안드로이드 앱개발 강좌, 기본적인 뷰 살펴보기

안드로이드 앱 개발에 있어서 “뷰(View)”는 사용자 인터페이스(UI)의 가장 기본적인 구성 요소입니다. 이 강좌에서는 코틀린을 사용하여 안드로이드 앱의 기본적인 뷰에 대해 자세히 살펴보겠습니다. 뷰의 종류와 그 특성, 그리고 실제 예제 코드를 통해 뷰를 어떻게 활용할 수 있는지를 알아보겠습니다.

1. 뷰의 이해

뷰는 사용자가 앱과 상호작용할 수 있는 요소입니다. 사용자에게 정보(텍스트, 이미지, 등)를 표시하거나 사용자의 입력을 수집하는 역할을 합니다. 안드로이드에서 제공하는 다양한 뷰가 있으며, 이들은 모두 View 클래스를 상속받습니다.

일반적으로 사용되는 뷰는 다음과 같습니다:

  • TextView: 텍스트를 화면에 표시하는 뷰입니다.
  • EditText: 사용자가 텍스트를 입력할 수 있는 뷰입니다.
  • Button: 사용자가 클릭할 수 있는 버튼입니다.
  • ImageView: 이미지를 표시하는 뷰입니다.
  • CheckBox: 선택할 수 있는 체크박스입니다.
  • RadioButton: 여러 옵션 중 하나를 선택할 수 있는 라디오 버튼입니다.
  • ListView: 여러 개의 항목을 리스트 형태로 표시하는 뷰입니다.

2. 기본적인 뷰 예제

이제 기본적인 뷰를 사용하여 간단한 안드로이드 앱을 만들어 보겠습니다. 이 예제에서는 TextView, EditText, Button을 사용하여 사용자로부터 입력을 받고, 버튼 클릭 시 입력된 텍스트를 TextView에 표시하는 앱을 구현합니다.

2.1. 프로젝트 설정

안드로이드 스튜디오에서 새로운 프로젝트를 생성합니다. 아래의 설정을 따라 해주세요:

  • Project: Empty Activity 선택
  • Language: Kotlin 선택
  • Minimum API level: API 21: Android 5.0 (Lollipop) 선택

2.2. 레이아웃 구성

프로젝트가 생성되면, res/layout/activity_main.xml 파일을 열어 다음과 같이 업데이트합니다:


<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">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="여기에 입력된 텍스트가 표시됩니다."
        android:textSize="24sp"/>

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="여기에 텍스트 입력"/>

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="텍스트 표시"/>

</LinearLayout>

2.3. MainActivity 클래스 구현

이제 MainActivity.kt 파일로 이동하여 버튼 클릭 시 텍스트를 변경하는 로직을 추가하겠습니다:


package com.example.myapp

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView

class MainActivity : AppCompatActivity() {

    private lateinit var textView: TextView
    private lateinit var editText: EditText
    private lateinit var button: Button

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

        textView = findViewById(R.id.textView)
        editText = findViewById(R.id.editText)
        button = findViewById(R.id.button)

        button.setOnClickListener {
            textView.text = editText.text
        }
    }
}

2.4. 앱 실행하기

이제 앱을 실행하면, 사용자가 EditText에 입력한 텍스트가 버튼 클릭 시 TextView에 표시됩니다.

3. 다양한 뷰의 속성과 활용

위에서 살펴본 기본 뷰 외에도 다수의 뷰와 그 속성, 이벤트 핸들링 방법을 살펴보겠습니다.

3.1. TextView

TextView는 다양한 속성을 지니고 있습니다. 주로 사용되는 속성은 다음과 같습니다:

  • text: 텍스트를 설정합니다.
  • textSize: 텍스트의 크기를 설정합니다.
  • textColor: 텍스트의 색상을 설정합니다.
  • gravity: 텍스트의 정렬 방식을 설정합니다.

<TextView
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="안녕하세요!"
    android:textSize="18sp"
    android:textColor="#FF6347"
    android:gravity="center"/>

3.2. EditText

EditText는 사용자의 입력을 받을 수 있는 뷰로, 추가적인 속성으로 사용자의 입력 형식 등을 설정할 수 있습니다.

자주 사용되는 속성:

  • hint: 입력 필드에 힌트를 제공합니다.
  • inputType: 입력 형식을 설정합니다(예: 텍스트, 숫자, 이메일 등).

<EditText
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="이메일 입력"
    android:inputType="textEmailAddress"/>

3.3. Button

Button은 이벤트를 처리할 수 있는 뷰로, 다양한 종류의 배경 색상, 텍스트 색상 등을 설정할 수 있습니다.

추가적으로, 안드로이드에서 버튼은 클릭 이벤트를 처리하여 다양한 동작을 수행할 수 있습니다. 이를 위해 setOnClickListener 메소드를 사용합니다.

3.4. CheckBox와 RadioButton

CheckBox는 여러 옵션 중 여러 개를 선택할 수 있도록 해주며, RadioButton은 여러 옵션 중 하나만 선택할 수 있도록 합니다.

예를 들어, 다음과 같이 CheckBox와 RadioButton을 사용할 수 있습니다:


<CheckBox
    android:id="@+id/checkBox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="옵션 1"/>

<RadioGroup
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    
    <RadioButton
        android:id="@+id/radioButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="옵션 A"/>

    <RadioButton
        android:id="@+id/radioButton2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="옵션 B"/>

</RadioGroup>

4. 이벤트 처리

모든 뷰에는 다양한 이벤트를 처리할 수 있는 메소드가 있습니다. 다룰 수 있는 기본 이벤트는 다음과 같습니다:

  • OnClickListener: 클릭 이벤트를 처리합니다.
  • OnLongClickListener: 길게 클릭하는 이벤트를 처리합니다.
  • TextWatcher: 텍스트 변경을 감지합니다.

4.1. Button 클릭 이벤트

버튼을 클릭했을 때 동작을 정의하기 위해 setOnClickListener 메소드를 사용합니다. MainActivity.kts 파일에서 버튼 클릭 이벤트를 다음과 같이 처리할 수 있습니다:


button.setOnClickListener {
    // 버튼 클릭 시 실행할 코드
    Toast.makeText(this, "버튼이 클릭되었습니다.", Toast.LENGTH_SHORT).show()
}

4.2. TextWatcher 활용

EditText에서 사용자가 텍스트를 입력할 때마다 변경 사항을 감지하기 위해 TextWatcher를 사용할 수 있습니다. 다음은 이를 구현한 예제입니다:


editText.addTextChangedListener(object : TextWatcher {
    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        // 텍스트가 변경됐을 때 처리하는 코드
    }

    override fun afterTextChanged(s: Editable?) {}
})

5. 레이아웃의 종류

안드로이드에서 뷰를 배치할 수 있는 레이아웃은 여러 종류가 있습니다. 이하의 레이아웃은 자주 사용되는 레이아웃입니다:

5.1. LinearLayout

LinearLayout은 뷰를 수직 또는 수평으로 나열할 수 있는 레이아웃입니다. orientation 속성으로 방향을 설정할 수 있습니다.


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    ...
</LinearLayout>

5.2. RelativeLayout

RelativeLayout은 뷰 간의 상대적인 위치를 설정할 수 있는 레이아웃입니다. 뷰의 위치를 다른 뷰의 위치에 따라 설정할 수 있습니다.


<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="상단에 위치"/>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/textView"
        android:text="버튼 아래 위치"/>

</RelativeLayout>

5.3. ConstraintLayout

ConstraintLayout은 복잡한 레이아웃을 쉽게 구성할 수 있도록 도와주는 레이아웃입니다. 뷰 간의 제약 조건을 설정해 유연한 배치를 할 수 있습니다.


<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="안녕하세요!"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="클릭"
        app:layout_constraintTop_toBottomOf="@id/textView"
        app:layout_constraintStart_toStartOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

6. 고급 뷰 및 사용자 정의 뷰

안드로이드에서 뷰를 활용하는 데 있어 기본 제공되는 뷰 외에도 사용자 정의 뷰를 생성할 수 있습니다. 사용자 정의 뷰는 특정한 기능이나 디자인을 요구하는 앱을 만들 때 유용합니다.

6.1. 사용자 정의 뷰 생성하기

다음 예제에서는 사용자 정의 뷰를 생성하는 방법을 설명합니다. 먼저 새로운 Kotlin 클래스를 생성하여 View 클래스를 상속받습니다:


import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.view.View

class CustomView(context: Context, attrs: AttributeSet) : View(context, attrs) {

    private val paint = Paint()

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        paint.color = Color.BLUE
        canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), paint)
    }
}

위와 같은 클래스를 만든 후 XML 레이아웃 파일에서 해당 뷰를 이용할 수 있습니다:


<com.example.myapp.CustomView
    android:layout_width="match_parent"
    android:layout_height="200dp"/>

7. 마무리 및 배포

이제 기본적인 뷰와 그 활용에 대해 알아보았습니다. 실제 앱을 만들기 위해 갖춰야 할 기본적인 요소들을 이해하셨기를 바랍니다. 다음 수업에서는 더 복잡한 뷰와 다양한 어댑터를 활용한 리스트 및 그래프 구현에 대해 다룰 예정입니다.

물론, 앱이 완성되었다면 Google Play를 통해 배포할 준비를 해야 합니다. 배포하기 전에는 반드시 앱을 철저히 테스트하고, 사용자 피드백을 반영해 개선하는 과정이 필요합니다.

이 글을 통해 많은 도움이 되었기를 바라며, 앞으로도 코틀린을 활용한 안드로이드 앱 개발에 대한 관심과 노력을 계속 이어가시기 바랍니다.