wintertreey 님의 블로그

[kotlin] 스톱워치 구현하기 본문

모바일 앱/Kotlin

[kotlin] 스톱워치 구현하기

wintertreey 2025. 7. 25. 18:36

안드로이드 스튜디오 IDE에 공기계에 연결하여 개발자모드로 세팅 완료.

 

하단의 실습 및 코드는 교재 "Do it! 깡샘의 안드로이드 앱 프로그래밍  with  코틀린 개정2판"을 기반으로 하였으며, 현 실습환경과 교재의 버젼이 일치하지는 않아 현 개발환경에서 작동이 되는 방향으로 코드를 개선하였다.

 

스톱워치를 구현하는 세부적인 내용에 앞서 프로젝트의 구조에 대해 생각해보고 넘어가자.

 

# 프로젝트 구조

보통 프로젝트 내부 구조는 다음과 같이 만들어진다.

 

Project/
├── app/                     ← 최종 실행 가능한 모듈 (application)
├── ch8_event/              ← 공통 버튼 등 재사용 가능한 UI 모듈 (library). 이게 내가 스톱워치를 구현한 모듈.
├── feature_login/          ← 로그인 기능 모듈 (library)
├── feature_chat/           ← 채팅 기능 모듈 (library)
└── core_utils/             ← 유틸 함수, 공통 코드 (library)

 

즉, app만 application 모듈이고, 나머지는 전부 library 모듈로 나누는 게 일반적.

앱은 하나, 기능은 라이브러리로 분리!

 

작업하면서 애플리케이션과 라이브러리가 궁금해서 리서치 하였다.

항목 애플리케이션 모듈 (com.android.application)  라이브러리 모듈 (com.android.library)
목적 최종 실행 가능한 앱을 만드는 목적 앱에서 사용할 재사용 가능한 기능/리소스 제공
applicationId ✅ 필요 (패키지 ID, Play Store에 등록 시 사용) ❌ 사용 금지 (앱이 아니기 때문)
실행 (Run) 버튼 ✅ 가능 (MainActivity 필요) ❌ 불가능 (실행 대상 아님)
리소스 접근 (@drawable, @string) 본인/의존한 모듈 리소스 모두 가능 자기 리소스만 포함, 앱에 의해 사용됨
Kotlin 코드 앱 로직 구현 UI 컴포넌트, 유틸성 코드, 뷰 바인딩 등
예시 :app 모듈 :core, :feature_login, :designsystem 등

 

그럼 언제 application 모듈을 하나 더 만들까?

사용자용 앱과 관리자용 앱 처럼 멀티 앱구조가 필요할 때.

 

 

# 스톱워치 기능구현 

추가하는 모듈이 라이브러리이면 해당 모듈의 gradle 설정에서 라이브러로 만들어주고,

해당 라이브러리의 데이터나 리소스를 받아서 처리할 일이 있다면 app의 gradle 설정에서 의존성을 추가해줘야한다.

-> 작업 후 Sync 잊지말자!

 

//ch8_event\build.gradle.kts 
plugins {
    //alias(libs.plugins.android.application)
    id("com.android.library")
    alias(libs.plugins.kotlin.android)
    alias(libs.plugins.kotlin.compose)
}

android {
    namespace = "com.example.ch8_event"
    compileSdk = 35

    defaultConfig {
        //applicationId = "com.example.ch8_event"
        minSdk = 21
        targetSdk = 35
        //versionCode = 1
        //versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }
    ...
}

// app\build.gradle.kts
dependencies {
...
    implementation(project(":ch8_event"))

}

 

 

 

 

ch8_event\src\main\res\drawable\round_button.xml

round_button.xml
0.00MB

 

app\src\main\res\layout\activity_main.xml

activity_main.xml
0.00MB

 

app\src\main\java\com\example\androidlab2\MainActivity.kt

MainActivity.kt
0.00MB

 

 

안드로이드 스튜디오에서 제공하는 가상의 기계로 앱 실행해서 작동하는 걸 영상캡쳐해봤다.

Screen_recording_20250725.webm
1.51MB