Computer >> 컴퓨터 >  >> 시스템 >> Android

Kotlin과 Jetpack Compose로 안드로이드 스도쿠 앱 만들기 – 무료 강좌

Jetpack Compose는 네이티브 UI를 구축하기 위한 안드로이드의 최신 공식 툴킷입니다. 선언형 방식으로 UI를 작성할 수 있어 안드로이드 UI 개발을 더욱 간단하고 빠르게 만들어 줍니다.

freeCodeCamp.org 유튜브 채널에는 Kotlin과 Jetpack Compose를 활용해 스도쿠 안드로이드 앱을 처음부터 끝까지 만들어 보는 새로운 무료 강좌가 공개되었습니다.

강좌를 따라 하다 보면 앱 개발 과정에서 그래프 자료구조와 알고리즘까지 자연스럽게 익히게 됩니다.

강좌는 오랜 경력의 개발자이자 강사인 Ryan M. Kay가 진행합니다. 그는 이 앱을 직접 만들면서 그래프 자료구조·알고리즘에 대한 이해와 Jetpack Compose라는 새로운 UI 라이브러리에 대한 학습을 동시에 정립했다고 소개합니다.

강좌에서 다루는 주제

  • 앱 설계 접근법: 서드파티 라이브러리 최소화 전략과 MV-Whatever 아키텍처
  • Domain 패키지: 리포지토리 패턴, Enum, 데이터 클래스, Sealed 클래스, 해시 코드, 인터페이스
  • Common 패키지: 확장 함수·변수, 개방-폐쇄 원칙(OCP), 추상 클래스, 싱글턴
  • Persistence(영속성) 패키지: Java 파일 시스템 저장소를 활용한 클린 아키텍처 백엔드, Jetpack Proto Datastore
  • UI 패키지: Jetpack Compose UI 기본기, 스타일, 타이포그래피, 라이트·다크 테마
  • UI Components 패키지: Modifier, 재사용 가능한 툴바와 로딩 화면
  • Active Game 기능(UI 로직): 코루틴을 활용한 프레젠테이션 로직과 ViewModel, Kotlin 함수 타입
  • Active Game 기능(UI 구현): Jetpack Compose UI와 Activity 컨테이너로 완성하는 스도쿠 게임
  • Computation Logic 패키지: n×n 정사각형 스도쿠용 그래프 자료구조와 알고리즘의 개요, 설계, 테스트

전체 강좌 분량은 약 3시간 30분이며, freeCodeCamp.org 유튜브 채널에서 무료로 시청할 수 있습니다.

핵심 학습 포인트 살펴보기

1. 코드 따라 쓰기(Code-along) 방식의 학습

강좌는 코드를 함께 작성해 나가는 '코드 얼롱' 형식으로 진행됩니다. 초보자라면 강사의 속도에 맞추기보다 자신만의 속도로 따라가는 것이 중요하며, 처음에는 진전이 더디게 느껴져도 코드를 작성하는 감각이 길러진다는 점을 기억하세요. 숙련된 개발자라면 전체 소스 코드를 직접 살펴보고 궁금한 부분만 영상으로 확인하는 것도 좋은 방법입니다.

2. 의도적인 라이브러리 최소화

Compose와 Proto Datastore를 제외하면 Android Jetpack 라이브러리나 서드파티 라이브러리를 거의 사용하지 않습니다. Kotlin 표준 라이브러리, Java 표준 라이브러리, Android SDK에 의존함으로써 라이브러리 지원 중단(deprecation)이나 변경에 덜 취약한 코드를 만들 수 있습니다. ViewModel, 내비게이션, 의존성 주입 같은 기능도 소규모 앱에서는 직접 작성하는 것이 생각보다 어렵지 않다는 사실을 배우게 됩니다.

3. Model-View-Whatever 아키텍처

강사는 특정 아키텍처 스타일을 고집하지 않고 프로젝트 요구사항과 좋은 소프트웨어 설계 원칙에 따라 구조를 결정합니다. Compose는 MVVM 접근법에 잘 맞지만, 여기에 '패시브 뷰(Passive View)' 또는 '험블 오브젝트(Humble Object)' 개념에 착안한 프레젠테이션 로직 클래스를 별도로 두어 ViewModel이 비대한 '갓 오브젝트'가 되는 것을 방지합니다. 모든 설계의 핵심 원칙은 관심사의 분리(Separation of Concerns)입니다.

4. 도메인 패키지와 리포지토리 패턴

도메인 패키지는 프로그램이 다루는 가장 일반적인 정보(데이터 클래스, 상수, Enum)와 행위(함수, 인터페이스)를 담는 애플리케이션의 기반입니다. 여기서는 파사드(Facade) 패턴이라고도 불리는 리포지토리 패턴을 통해 데이터 저장 메커니즘의 세부 사항을 인터페이스 뒤로 숨깁니다. 이렇게 하면 프레젠테이션 로직 클래스를 독립적으로 빌드하고 테스트할 수 있으며, 파일 저장소를 Room 데이터베이스로 교체하는 등의 변경도 프레젠테이션 로직 수정 없이 가능해집니다. 이것이 바로 느슨한 결합(loose coupling)의 힘입니다.

5. 그래프 자료구조로 표현하는 스도쿠

스도쿠 퍼즐은 유향 채색 그래프(directed colored graph)로 모델링됩니다. 여기서 '색(color)'이란 단순히 노드에 연결된 숫자 값(1~9 또는 1~4)을 의미합니다. 각 노드는 x, y 좌표와 값을 가지며, x값에 100을 곱해 y값과 조합한 고유한 해시 코드를 LinkedHashMap의 키로 사용합니다. 퍼즐을 생성한 뒤 일부 단서를 제거해 플레이 가능하게 만드는 과정에서 read-only 속성이 활용되며, 이는 UI에서 편집 불가능한 타일을 다르게 렌더링하는 데도 쓰입니다.

6. 개방-폐쇄 원칙(OCP)과 확장 함수

Activity처럼 널리 재사용되면서 변화가 예상되는 소프트웨어 엔티티는 고정된 공개 인터페이스와 구현을 바꿀 수 있는 방법을 가져야 한다는 것이 OCP의 핵심입니다. Kotlin의 확장 함수와 확장 프로퍼티는 기존 소스 코드를 수정하지 않고도 새로운 기능을 추가할 수 있게 해주는 대표적인 도구입니다. 예를 들어 Activity에 makeToast 확장 함수를 추가하면 어떤 액티비티에서든 토스트 메시지를 간결하게 띄울 수 있습니다.

7. 영속성: Proto Datastore와 파일 시스템

게임 설정과 사용자 통계는 Protocol Buffers 기반의 Jetpack Proto Datastore에 저장합니다. Protocol Buffers는 JSON과 유사한 직렬화 언어로, 컴파일러가 보일러플레이트 코드를 생성해 주어 입출력 스트림 처리와 에러 핸들링이 훨씬 간편해집니다. 반면 진행 중인 게임 데이터는 Serializable을 구현한 도메인 모델과 Java 입출력 스트림을 활용해 기기의 파일 시스템에 저장합니다. 두 데이터 소스는 GameRepository가 조율하는 백엔드 의사 결정자 역할을 수행합니다.

8. 라이트·다크 테마와 재사용 가능한 UI 컴포넌트

Jetpack Compose에서는 몇 줄의 코드만으로 라이트 모드와 다크 모드 테마를 모두 지원할 수 있습니다. 색상 팔레트 두 세트를 정의하고 isSystemInDarkTheme() 호출 결과에 따라 적절한 팔레트를 선택하면 됩니다. 또한 Modifier를 외부에서 주입받고 아이콘 컴포저블을 인자로 전달받는 방식으로 툴바를 재사용 가능하게 만들어, 서로 다른 화면에서 다른 아이콘과 클릭 이벤트를 처리할 수 있게 합니다.

9. 함수 타입으로 구현하는 옵저버 패턴

ViewModel은 Android 플랫폼에 대한 강한 결합을 피하기 위해 Jetpack ViewModel을 상속하지 않습니다. 대신 nullable 함수 타입 참조를 활용해 옵저버 패턴을 구현합니다. 프레젠테이션 로직 클래스가 ViewModel을 업데이트할 때마다 함수 타입이 호출되어 뷰에 새 데이터가 자동으로 전달됩니다. 또한 sealed 클래스로 모든 UI 이벤트를 하나의 객체 계층으로 표현하는 전략 패턴(Strategy Pattern)을 적용해 클래스 간 인터페이스를 깔끔하게 유지합니다.

10. 코루틴 타이머와 상태 애니메이션

게임 진행 시간을 재는 카운트업 타이머는 Java Timer 클래스 대신 코루틴으로 직접 구현합니다. delay()가 스레드를 블록하지 않기 때문에 효율적이며, Job 객체를 통해 손쉽게 취소할 수 있습니다. UI에서는 mutableTransitionState와 remember 델리게이트로 상태 변화를 감지하고, 알파(alpha) 값을 조절해 로딩 화면 → 게임 화면 → 완료 화면 사이를 부드럽게 전환합니다. ConstraintLayout과 BoxWithConstraints를 활용해 다양한 화면 밀도와 크기에 대응하는 스도쿠 보드를 그리는 방법도 배울 수 있습니다.

마무리

이 강좌 하나로 Jetpack Compose UI 개발, 클린 아키텍처 설계, 그래프 알고리즘, Kotlin 고급 문법까지 한 번에 익힐 수 있습니다. 전체 강좌는 freeCodeCamp.org 유튜브 채널에서 무료로 시청할 수 있으며, 시작용 소스 코드와 완성된 소스 코드도 함께 공개되어 있으니 학습 시 참고하면 큰 도움이 됩니다.