{
  "schemaVersion": "1.0",
  "count": 35,
  "posts": [
    {
      "title": "AI 시대에 개발자는 무엇을 만들어야 할까?",
      "url": "https://kmshack.kr/blog/ai-era-what-developers-should-build/",
      "date": "2026-08-20T00:00:00+09:00",
      "description": "구현 비용이 낮아진 AI 시대에 개발자가 어떤 문제를 고르고 무엇을 만들어야 하는지, 맥락과 완결성, 신뢰의 관점에서 살펴봅니다.",
      "tags": ["AI","개발자","제품 개발"],
      "language": "ko-KR"
    },
    {
      "title": "AI 시대, 당신의 통장 잔고가 그대로인 진짜 이유",
      "url": "https://kmshack.kr/blog/ai-leverage/",
      "date": "2026-07-31T00:00:00+09:00",
      "description": "AI로 생산성이 높아져도 매출이 늘지 않는 이유와 의사결정, 사업 구조, 병목을 통해 진짜 레버리지를 찾는 방법을 정리합니다.",
      "tags": ["AI","비즈니스","생산성"],
      "language": "ko-KR"
    },
    {
      "title": "AppUpdateManager로 인앱 업데이트 처리하기",
      "url": "https://kmshack.kr/blog/AppUpdateManager/",
      "date": "2019-06-24T00:00:00+09:00",
      "description": "앱 업데이트를 안내하기 위해 자체 버전 확인 로직과 Play 스토어 이동 화면을 구현하는 경우가 많다. AppUpdateManager를 사용하면 사용자가 앱을 벗어나지 않고 업데이트를 진행하는 인앱 업데이트 흐름을 구성할 수 있다. 즉시 업데이트와 유연한 업데이트의 차이와 기본 구현 방법을 살펴본다.",
      "tags": ["Play 스토어","안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "WorkManager로 정기적인 백그라운드 작업 수행하기",
      "url": "https://kmshack.kr/blog/work_manager/",
      "date": "2019-03-18T00:00:00+09:00",
      "description": "Android O부터 백그라운드 서비스와 암시적 브로드캐스트에는 여러 제약이 적용된다. 즉시 실행할 필요는 없지만 완료가 보장되어야 하는 작업을 WorkManager로 예약하고, 주기적으로 실행하는 방법을 살펴본다.",
      "tags": ["안드로이드","서비스"],
      "language": "ko-KR"
    },
    {
      "title": "ViewPager2 주요 변경점 살펴보기",
      "url": "https://kmshack.kr/blog/ViewPager2/",
      "date": "2019-02-18T00:00:00+09:00",
      "description": "2011년에 출시된 ViewPager의 후속 버전인 ViewPager2가 2019년 알파 버전으로 공개되었다. RecyclerView 기반 어댑터, 세로 방향 페이징과 RTL 지원 등 주요 변경점을 살펴본다.",
      "tags": ["안드로이드","뷰페이저"],
      "language": "ko-KR"
    },
    {
      "title": "Kotlin Coroutines 예외 처리 패턴",
      "url": "https://kmshack.kr/blog/kotlin_coroutine_pattern/",
      "date": "2018-12-11T00:00:00+09:00",
      "description": "async에서 발생한 예외는 await()만 try/catch로 감싼다고 항상 처리되는 것은 아니다. 부모와 자식 Job 사이의 전파 규칙을 이해하고 coroutineScope 또는 SupervisorJob을 선택하는 방법을 예제로 살펴본다.",
      "tags": ["안드로이드","코틀린","코루틴"],
      "language": "ko-KR"
    },
    {
      "title": "MotionLayout으로 코드 없이 전환 효과 만들기",
      "url": "https://kmshack.kr/blog/motionlayout/",
      "date": "2018-10-12T00:00:00+09:00",
      "description": "ConstraintSet을 사용하면 두 레이아웃 사이의 크기와 위치 변화를 애니메이션으로 표현할 수 있다. 이 아이디어를 확장한 MotionLayout으로 복잡한 화면 전환을 XML에 선언하는 방법을 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Android에서 키보드 전환을 자연스럽게 처리하기",
      "url": "https://kmshack.kr/blog/smoothkeyboard/",
      "date": "2018-10-09T00:00:00+09:00",
      "description": "Dank 앱은 키보드가 나타나고 사라질 때 콘텐츠 크기와 스크롤을 자연스럽게 조절한다. 기본 동작에서 생기는 갑작스러운 레이아웃 변화를 줄이고 부드럽게 전환하는 원리를 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "ProcessLifecycleOwner로 앱의 Background/Foreground 상태 감지하기",
      "url": "https://kmshack.kr/blog/ProcessLifecycleOwner%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%95%B1-Background,-Foreground-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%B2%98%EB%A6%AC/",
      "date": "2018-06-13T00:00:00+09:00",
      "description": "Android 앱 전체가 Background 또는 Foreground 상태로 전환되는 시점을 감지해야 할 때가 있다. 각 Activity의 Lifecycle을 따로 추적하는 대신 ProcessLifecycleOwner를 사용해 애플리케이션 수준의 상태 변화를 관찰하는 방법을 살펴본다.",
      "tags": ["안드로이드","아키텍처"],
      "language": "ko-KR"
    },
    {
      "title": "Kotlin Coroutines로 Retrofit2 요청 동시에 처리하기",
      "url": "https://kmshack.kr/blog/Kotlin-Coroutines-Retrofit2-+-Coroutines-%EB%8F%99%EC%8B%9C%EC%B2%98%EB%A6%AC/",
      "date": "2018-05-12T00:00:00+09:00",
      "description": "Android의 UI 스레드에서 네트워크 요청, 데이터베이스 쿼리나 무거운 연산을 수행하면 화면이 멈추고 ANR이 발생할 수 있다. Kotlin Coroutines를 사용해 여러 Retrofit2 요청을 동시에 처리하고 결과를 조합하는 방법을 살펴본다.",
      "tags": ["안드로이드","코틀린"],
      "language": "ko-KR"
    },
    {
      "title": "Fragment 전환 애니메이션 쉽게 적용하기",
      "url": "https://kmshack.kr/blog/Fragment-%ED%8A%B8%EB%9E%9C%EC%A7%80%EC%85%98-%EC%89%BD%EA%B2%8C-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0/",
      "date": "2018-03-19T00:00:00+09:00",
      "description": "Fragment 전환에 공유 요소 애니메이션을 적용하는 방법을 살펴본다. 기본적인 sharedElementViews 구성부터 Chris Banes의 ColumnedChangeBounds를 활용한 확장 효과까지 다룬다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Support Library 28.0.0 alpha1의 BottomAppBar 살펴보기",
      "url": "https://kmshack.kr/blog/Support-Library-28.0.0-alpha1%EC%97%90-%EC%B6%94%EA%B0%80%EB%90%9C-BottomAppBar/",
      "date": "2018-03-16T00:00:00+09:00",
      "description": "Android P 프리뷰와 함께 Design Support Library 28.0.0 alpha1이 공개되었다. 이 버전에 처음 포함된 BottomAppBar의 주요 속성과 FloatingActionButton을 배치하는 방법을 살펴본다.  com.android.support:design:28.0.0-alpha1",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "ConstraintLayout으로 전환 애니메이션 만들기",
      "url": "https://kmshack.kr/blog/ConstraintLayout%EC%9C%BC%EB%A1%9C-%EC%95%84%EB%A6%84%EB%8B%A4%EC%9A%B4-%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98%ED%95%98%EA%B8%B0/",
      "date": "2017-06-30T00:00:00+09:00",
      "description": "ConstraintLayout은 복잡한 뷰 계층을 줄이는 데 유용할 뿐 아니라, 서로 다른 Constraint 집합 사이를 전환하는 애니메이션에도 활용할 수 있다. ConstraintSet과 TransitionManager를 조합해 적은 코드로 레이아웃 변화를 애니메이션으로 표현하는 방법을 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Dagger 2 소개: Android에서 의존성 주입을 사용하기 전에",
      "url": "https://kmshack.kr/blog/Dagger-2-%EC%86%8C%EA%B0%9C,-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EC%97%90%EC%84%9C-Dependency-Injection-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0%EC%A0%84%EC%97%90/",
      "date": "2017-06-13T00:00:00+09:00",
      "description": "Android에서 Dagger 2를 사용하기 전에 의존성 주입이 왜 필요한지 이해해야 한다. 강한 결합이 테스트와 재사용성에 미치는 영향부터 살펴본다.",
      "tags": ["안드로이드","아키텍처"],
      "language": "ko-KR"
    },
    {
      "title": "Android 애플리케이션 아키텍처의 변화",
      "url": "https://kmshack.kr/blog/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98/",
      "date": "2017-04-13T00:00:00+09:00",
      "description": "Android 개발 생태계는 빠르게 변하며, 앱 아키텍처 역시 도구와 요구사항에 맞춰 발전해 왔다. 이 글은 ribot 팀이 AsyncTask 중심 구조에서 RxJava와 MVP 기반 구조로 옮겨 간 과정과 그 과정에서 얻은 교훈을 정리한다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Android 스플래시 화면 올바르게 구현하기",
      "url": "https://kmshack.kr/blog/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%98%AC%EB%B0%94%EB%A5%B8-%EC%8A%A4%ED%94%8C%EB%9E%98%EC%8B%9C-%ED%99%94%EB%A9%B4%EC%9D%84-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-%EB%B0%A9%EB%B2%95/",
      "date": "2017-04-07T00:00:00+09:00",
      "description": "Activity에서 일정 시간을 지연시키는 스플래시 화면은 사용자에게 불필요한 대기 시간을 만든다. 앱이 시작되는 동안 Window 배경을 활용해 즉시 스플래시를 표시하고, 첫 화면이 준비되면 자연스럽게 전환하는 방법을 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "RecyclerView DiffUtil로 목록 업데이트 최적화하기",
      "url": "https://kmshack.kr/blog/RecyclerView-DiffUtil%EB%A1%9C-%EC%84%B1%EB%8A%A5-%ED%96%A5%EC%83%81%ED%95%98%EA%B8%B0/",
      "date": "2017-04-06T00:00:00+09:00",
      "description": "목록 전체를 다시 그리는 notifyDataSetChanged()는 변경 범위가 작을 때 불필요한 작업을 만든다. DiffUtil을 사용하면 이전 목록과 새 목록의 차이를 계산해 필요한 항목만 갱신할 수 있다. RecyclerView의 목록 업데이트를 효율적으로 처리하는 방법을 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Android의 메모리 누수 패턴",
      "url": "https://kmshack.kr/blog/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98-%ED%8C%A8%ED%84%B4/",
      "date": "2017-03-24T00:00:00+09:00",
      "description": "메모리 누수란?",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Android RecyclerView 성능 개선 팁",
      "url": "https://kmshack.kr/blog/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-RecyclerView-%EC%84%B1%EB%8A%A5-%EA%B0%9C%EC%84%A0%ED%8C%81/",
      "date": "2017-03-09T00:00:00+09:00",
      "description": "RecyclerView는 제한된 화면에서 큰 데이터 집합을 효율적으로 보여 주기 위한 유연한 View다. 하지만 잘못된 애니메이션이나 과도한 갱신은 여전히 스크롤 성능을 떨어뜨릴 수 있다. 자주 놓치는 최적화 원칙을 항목별로 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Android에서 TensorFlow 실행하기",
      "url": "https://kmshack.kr/blog/Android%EC%97%90%EC%84%9C-TensorFlow-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0/",
      "date": "2017-03-08T00:00:00+09:00",
      "description": "TensorFlow는 Google이 공개한 오픈 소스 머신러닝 라이브러리다. 이 글에서는 사전 학습된 모델을 Android에서 실행하기 위해 TensorFlow의 네이티브 라이브러리와 Java API를 빌드하는 과정을 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Android 개발 생산성을 높이는 도구와 학습법",
      "url": "https://kmshack.kr/blog/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EA%B0%9C%EB%B0%9C%EB%A0%A5-%ED%96%A5%EC%83%81%ED%95%98%EA%B8%B0/",
      "date": "2017-02-14T00:00:00+09:00",
      "description": "  Android 앱 개발에 유용한 도구와 학습 자료를 한데 모았다. 반복 작업을 줄이고 디버깅과 라이브러리 탐색을 효율화하는 데 참고할 수 있다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "CoordinatorLayout과 Behavior의 관계",
      "url": "https://kmshack.kr/blog/CoordinatorLayout%EA%B3%BC-Behavior%EC%9D%98-%EA%B4%80%EA%B3%84/",
      "date": "2017-01-15T00:00:00+09:00",
      "description": "CoordinatorLayout의 Behavior는 한 View의 스크롤이나 위치 변화에 다른 View가 반응하도록 연결한다. Support Library가 제공하던 ScrollingViewBehavior와 BottomSheetBehavior를 중심으로 구성 요소 사이의 관계를 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Android Ripple Animation 구현하기",
      "url": "https://kmshack.kr/blog/Ripple-Animation/",
      "date": "2017-01-11T00:00:00+09:00",
      "description": "Android 5.0(API 21)에는 터치 위치에서 퍼지는 물결 효과가 도입되었다. 사용자의 입력에 즉각적인 시각 피드백을 제공하는 Ripple Animation을 구현하는 방법을 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "디자이너 없이 Android 앱을 디자인하는 몇 가지 방법",
      "url": "https://kmshack.kr/blog/%EB%94%94%EC%9E%90%EC%9D%B4%EB%84%88-%EC%97%86%EC%9D%B4-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EB%AA%87-%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95/",
      "date": "2017-01-10T00:00:00+09:00",
      "description": "머티리얼 디자인 가이드, UI 라이브러리와 디자인 도구를 활용하면 개발자도 일관성 있는 Android 앱 화면을 구성할 수 있다. 레이아웃, 색상, 아이콘과 타이포그래피를 정할 때 참고할 만한 몇 가지 방법을 소개한다.",
      "tags": ["안드로이드","디자인"],
      "language": "ko-KR"
    },
    {
      "title": "Android 레이아웃 비동기로 인플레이트하기",
      "url": "https://kmshack.kr/blog/%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-%EB%B9%84%EB%8F%99%EA%B8%B0%EB%A1%9C-%EC%9D%B8%ED%94%8C%EB%A0%88%EC%9D%B4%ED%8A%B8%ED%95%98%EA%B8%B0/",
      "date": "2016-11-24T00:00:00+09:00",
      "description": "Android Support Library 24에는 레이아웃 인플레이션을 백그라운드 스레드에서 처리하는 AsyncLayoutInflater가 추가되었다. 무거운 레이아웃이 UI 스레드의 응답성에 미치는 영향을 줄이는 방법을 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Android 7.1 앱 바로가기 구현하기",
      "url": "https://kmshack.kr/blog/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-7.1-%EC%95%B1-%EB%B0%94%EB%A1%9C%EA%B0%80%EA%B8%B0-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84/",
      "date": "2016-10-26T00:00:00+09:00",
      "description": "Android 7.1에는 앱 아이콘을 길게 눌러 특정 기능으로 바로 이동하는 앱 바로가기(Shortcut)가 추가되었다. 매니페스트와 XML 리소스로 정적 바로가기를 구성하는 방법을 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Stable ID로 RecyclerView 성능 개선하기",
      "url": "https://kmshack.kr/blog/Stable-Id%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-RecyclerView-%EC%84%B1%EB%8A%A5-%ED%96%A5%EC%83%81%EB%B2%95/",
      "date": "2016-09-30T00:00:00+09:00",
      "description": "RecyclerView는 ListView보다 유연한 재활용 구조와 다양한 최적화 방법을 제공한다. 이 글에서는 항목마다 안정적인 ID를 부여해 불필요한 데이터 바인딩을 줄이는 방법을 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Android Support Annotation 활용하기",
      "url": "https://kmshack.kr/blog/Android-Support-Annotations/",
      "date": "2016-09-21T00:00:00+09:00",
      "description": "Android Support Annotation을 사용하면 코드의 의도와 제약을 간결하게 표현할 수 있다. 메서드나 멤버 변수를 재사용할 때 지켜야 할 규약을 명시하고, 일부 실수를 컴파일 단계에서 발견하는 데 도움이 된다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "빠르고 유연한 ConstraintLayout 살펴보기",
      "url": "https://kmshack.kr/blog/%EB%B9%A0%EB%A5%B4%EA%B3%A0-%EC%9C%A0%EC%97%B0%ED%95%9C-ContraintLayout/",
      "date": "2016-06-16T00:00:00+09:00",
      "description": "ConstraintLayout?ConstraintLayout은 Google I/O 2016에서 발표된 Android 레이아웃이다. 깊고 복잡한 뷰 계층을 줄이면서 다양한 화면 크기에 대응할 수 있으며, Android Studio의 레이아웃 에디터와 함께 사용할 수 있다. 이 글에서는 초기 알파 버전을 기준으로 주요 제약 속성을 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "jCenter로 Android 라이브러리 배포하기",
      "url": "https://kmshack.kr/blog/jCenter%EB%A1%9C-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0/",
      "date": "2016-06-15T00:00:00+09:00",
      "description": "Android Studio와 Gradle이 도입되면서 외부 라이브러리를 사용하는 과정이 훨씬 간단해졌다. 예전처럼 JAR 파일이나 라이브러리 프로젝트를 직접 내려받지 않아도, Gradle 의존성에 라이브러리 좌표를 추가하면 저장소에서 필요한 파일을 가져올 수 있다. 이 글에서는 당시 Android Studio의 기본 저장소였던 jCenter에 라이브러리를 배포하는 과정을 다룬다.",
      "tags": ["안드로이드","라이브러리"],
      "language": "ko-KR"
    },
    {
      "title": "Android 앱에서 배터리 최적화 예외 요청하기",
      "url": "https://kmshack.kr/blog/ignore_battery_optimizations/",
      "date": "2016-04-26T00:00:00+09:00",
      "description": "Android 마시멜로에는 백그라운드 작업을 제한해 배터리 소모를 줄이는 최적화 기능이 추가되었다. 다만 웨어러블 연결이나 지속적인 동기화가 필요한 앱에서는 이 제한이 핵심 기능에 영향을 줄 수 있다. 이런 경우 사용자에게 배터리 최적화 예외를 요청하는 방법을 알아본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Android VectorDrawable 이해하기",
      "url": "https://kmshack.kr/blog/Android-VectorDrawables/",
      "date": "2016-04-06T00:00:00+09:00",
      "description": "Android 롤리팝에는 벡터 방식의 Drawable을 사용할 수 있는 VectorDrawable이 추가되었다. Support Library 23.2부터는 Android 5.0 미만 버전에서도 이를 사용할 수 있다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "세 가지 메서드로 끝내는 Android 마시멜로 권한 처리",
      "url": "https://kmshack.kr/blog/3%EA%B0%80%EC%A7%80-%EB%A9%94%EC%86%8C%EB%93%9C%EB%A1%9C-%EB%81%9D%EB%82%B4%EB%8A%94-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%A7%88%EC%8B%9C%EB%A9%9C%EB%A1%9C-%EA%B6%8C%ED%95%9C-%ED%9A%8D%EB%93%9D/",
      "date": "2016-03-21T00:00:00+09:00",
      "description": "Android 마시멜로부터 위험 권한은 앱 설치 시점이 아니라 기능을 사용하는 시점에 요청해야 한다. 사용자는 권한이 필요한 맥락을 확인한 뒤 허용 여부를 결정할 수 있다. 런타임 권한 요청에 대응하는 방법을 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Android BottomSheet Behavior 사용하기",
      "url": "https://kmshack.kr/blog/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-BottomSheet-Behavior/",
      "date": "2016-03-16T00:00:00+09:00",
      "description": "AppCompat 23.2에는 머티리얼 디자인의 Bottom Sheet를 구현할 수 있는 기능이 추가되었다. CoordinatorLayout의 Behavior로 구성하는 방법과, 독립된 다이얼로그 형태로 사용하는 방법을 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    },
    {
      "title": "Android 스타일과 테마 이해하기",
      "url": "https://kmshack.kr/blog/theme_vs_style/",
      "date": "2015-06-22T00:00:00+09:00",
      "description": "Android 5.0 롤리팝부터는 android:theme 속성으로 개별 View의 테마를 재정의할 수 있다. 스타일과 테마의 차이, 그리고 이 기능이 필요한 이유를 살펴본다.",
      "tags": ["안드로이드"],
      "language": "ko-KR"
    }
  ]
}
