CHAPTER 1 개요 11.1 소스 코드 다운로드하기 21.2 단축키와 코드 표기 31.3 독자 A/S 31.4 오탈자 3CHAPTER 2 안드로이드 스튜디오 개발 환경 구성하기 42.1 개발 시스템 요구 사항 42.2 안드로이드 스튜디오 패키지 다운로드하기 42.3 안드로이드 스튜디오 설치하기 52.4 안드로이드 스튜디오 웰컴 스크린 82.5 안드로이드 SDK 패키지 설치하기 92.6 명령행에서 안드로이드 SDK 도구 사용하기 122.7 안드로이드 스튜디오 메모리 관리 152.8 안드로이드 스튜디오와 SDK 버전 업데이트하기 162.9 자동 import 설정하기 172.10 요약 18CHAPTER 3 안드로이드 스튜디오로 예제 앱 만들기 193.1 프로젝트 개요 193.2 새로운 안드로이드 프로젝트 생성하기 193.3 액티비티 생성하기 213.4 프로젝트 구성하기 213.5 예제 앱 변경하기 233.6 UI 변경하기 243.7 레이아웃과 리소스 파일 살펴보기 303.8 코틀린 확장 플러그인 추가하기 333.9 버튼의 이벤트 처리하기 343.10 요약 35CHAPTER 4 안드로이드 스튜디오에서 AVD 생성하기 364.1 AVD 개요 364.2 새로운 AVD 생성하기 374.3 에뮬레이터 시작시키기 424.4 AVD에서 앱 실행하기 434.5 여러 장치에서 앱 실행하기 444.6 실행 중인 앱 중단하기 454.7 어두운 테마 지원 454.8 도구 창에서 에뮬레이터 실행하기 464.9 AVD 구성 파일 484.10 요약 48CHAPTER 5 안드로이드 스튜디오 AVD 에뮬레이터 사용 및 구성하기 495.1 에뮬레이터 환경 495.2 에뮬레이터 툴바 505.3 줌 모드 사용하기 515.4 에뮬레이터 창의 크기 조정 515.5 확장 제어 옵션 515.6 스냅샷 사용하기 545.7 모의 지문 구성하기 565.8 도구 창 모드의 에뮬레이터 585.9 요약 58CHAPTER 6 안드로이드 스튜디오 UI 둘러보기 596.1 웰컴 스크린 596.2 메인 창 606.3 도구 창 626.4 안드로이드 스튜디오의 단축키 656.5 스위처와 최근 파일 기능을 이용한 내비게이션 666.6 안드로이드 스튜디오 테마 변경하기 676.7 요약 68CHAPTER 7 실제 안드로이드 장치에서 앱 테스트하기 697.1 ADB 개요 697.2 안드로이드 장치에서 ADB 활성화하기 707.2.1 맥OS에서 ADB 구성하기 707.2.2 윈도우에서 ADB 구성하기 717.2.3 리눅스에서 ADB 구성하기 727.3 adb 연결 테스트하기 737.4 요약 74CHAPTER 8 안드로이드 스튜디오 코드 편집기 758.1 안드로이드 스튜디오 코드 편집기 758.2 편집기 창 분할하기 788.3 코드 자동 완성 798.4 문장 자동 완성 818.5 매개변수 정보 818.6 매개변수 이름 힌트 818.7 코드 자동 생성 828.8 코드 접어 감추기 838.9 빠른 문서 검색 848.10 소스 코드 형식 변경 858.11 라이브 템플릿 868.12 요약 87CHAPTER 9 안드로이드 아키텍처 개요 889.1 안드로이드 소프트웨어 스택 889.2 리눅스 커널 889.3 안드로이드 런타임 ― ART 899.4 안드로이드 라이브러리 909.4.1 C/C++ 라이브러리 919.5 앱 프레임워크 919.6 앱 929.7 요약 92CHAPTER 10 안드로이드 앱의 핵심 요소 9310.1 안드로이드 액티비티 9310.2 안드로이드 프래그먼트 9410.3 안드로이드 인텐트 9410.4 브로드캐스트 인텐트 9410.5 브로드캐스트 수신자 9510.6 안드로이드 서비스 9510.7 콘텐트 제공자 9610.8 앱 매니페스트 9610.9 앱 리소스 9610.10 앱 컨텍스트 9610.11 요약 97CHAPTER 11 코틀린 개요 9811.1 코틀린이란? 9811.2 코틀린과 자바 9811.3 자바 코드를 코틀린 코드로 변환하기 9911.4 코틀린과 안드로이드 스튜디오 9911.5 코틀린 코드 테스트하기 9911.6 코틀린과 세미콜론 10111.7 요약 102CHAPTER 12 코틀린 데이터 타입, 변수, Null 처리 10312.1 코틀린 데이터 타입 10312.2 가변 변수 10712.3 불변 변수 10712.4 가변 변수와 불변 변수 선언하기 10712.5 데이터 타입은 객체다 10812.6 타입 애노테이션과 타입 추론 10912.7 null 가능 타입 11012.8 안전 호출 연산자 11112.9 Not-null 어서션 11212.10 Null 가능 타입과 let 함수 11312.11 늦초기화(lateinit) 11412.12 엘비스 연산자 11512.13 타입 변환과 타입 검사 11512.14 요약 116CHAPTER 13 코틀린 연산자와 표현식 11713.1 코틀린의 표현식 문법 11713.2 기본적인 대입 연산자 11713.3 코틀린 산술 연산자 11813.4 복합 대입 연산자 11813.5 증가와 감소 연산자 11913.6 동등 연산자 12013.7 논리 연산자 12113.8 범위 연산자 12113.9 비트 연산자 12213.10 요약 125CHAPTER 14 코틀린 흐름 제어 12614.1 루프 흐름 제어 12614.2 조건 흐름 제어 13114.3 요약 133CHAPTER 15 코틀린 함수와 람다 개요 13415.1 함수란? 13415.2 코틀린 함수 선언하기 13415.3 코틀린 함수 호출하기 13515.4 단일 표현식 함수 13615.5 지역 함수 13615.6 지명 인자 13715.7 매개변수 기본값 선언하기 13715.8 가변 인자 13815.9 람다식 13915.10 고차 함수 14015.11 요약 142CHAPTER 16 코틀린 객체지향 프로그래밍 14316.1 객체란? 14316.2 클래스란? 14316.3 코틀린 클래스 정의하기 14316.4 클래스에 속성 추가하기 14416.5 함수 정의하기 14416.6 클래스 인스턴스 생성하고 초기화하기 14516.7 기본과 보조 생성자 14516.8 초기화 블록 14816.9 함수 호출과 속성 사용하기 14816.10 커스텀 접근자 14916.11 중첩 클래스와 내부 클래스 15116.12 동반 객체 15116.13 요약 154CHAPTER 17 상속과 서브 클래스 15517.1 상속과 서브 클래스 개요 15517.2 서브 클래스 생성하기 15517.3 상속 구현 예 15717.4 서브 클래스의 기능 확장하기 15817.5 상속받은 함수 오버라이딩하기 15817.6 커스텀 보조 생성자 추가하기 16017.7 SavingsAccount 클래스 사용하기 16117.8 요약 161CHAPTER 18 안드로이드 뷰 바인딩 개요 16218.1 findViewById() 함수와 합성 속성 16218.2 뷰 바인딩 16318.3 AndroidSample 프로젝트 변환하기 16418.4 뷰 바인딩 활성화하기 16418.5 뷰 바인딩 사용하기 16518.6 방법 선택하기 16618.7 예제 프로젝트의 뷰 바인딩 16618.8 프로젝트에서 뷰 바인딩을 사용하도록 변경하기 16618.9 요약 167CHAPTER 19 안드로이드 앱과 액티비티 생명주기 16819.1 안드로이드 앱과 리소스 관리 16819.2 안드로이드 프로세스 상태 16919.3 액티비티 생명주기 17019.4 액티비티 스택 17019.5 액티비티 상태 17119.6 구성 변경 17219.7 상태 변경 처리하기 17219.8 요약 172CHAPTER 20 액티비티 상태 변경 처리하기 17420.1 최신과 종전의 생명주기 기법 17420.2 Activity와 Fragment 클래스 17420.3 동적 상태 vs. 영속적 상태 17620.4 안드로이드 생명주기 함수 17720.5 액티비티/프래그먼트 생애 17920.6 폴더블 장치와 다중 실행 재개 상태 18020.7 액티비티가 다시 시작되지 않게 하기 18120.8 생명주기 함수의 제약 18120.9 요약 182CHAPTER 21 액티비티 상태 변화 예제 18321.1 상태 변화 예제 프로젝트 생성하기 18321.2 사용자 인터페이스 디자인하기 18421.3 액티비티 생명주기 함수 오버라이딩 18521.4 로그캣 패널의 메시지 필터링하기 18721.5 앱 실행하기 18821.6 액티비티로 실험하기 18921.7 요약 190CHAPTER 22 액티비티 상태를 저장하고 복원하기 19122.1 동적 상태 저장 19122.2 사용자 인터페이스 상태의 자동 저장과 복원 19122.3 Bundle 클래스 19322.4 상태 데이터 저장하기 19422.5 상태 데이터 복원하기 19522.6 앱 테스트하기 19522.7 요약 196CHAPTER 23 안드로이드 뷰, 뷰 그룹, 레이아웃 19723.1 서로 다른 안드로이드 장치를 위한 디자인 19723.2 뷰와 뷰 그룹 19723.3 안드로이드 레이아웃 매니저 19823.4 뷰 계층 구조 19923.5 사용자 인터페이스 생성 20023.6 요약 201CHAPTER 24 안드로이드 스튜디오 레이아웃 편집기 살펴보기 20224.1 Basic vs. Empty 액티비티 템플릿 20224.2 안드로이드 스튜디오 레이아웃 편집기 20624.3 디자인 모드 20624.4 팔레트 20724.5 디자인 모드와 레이아웃 뷰 20824.6 코드 모드 20924.7 분할 모드 21024.8 속성 설정하기 21024.9 변형 21224.10 Tools 속성 설정하기 21224.11 뷰 변환하기 21524.12 샘플 데이터 보여 주기 21524.13 커스텀 장치 정의 생성하기 216 24.14 현재 장치 변경하기 21724.15 레이아웃 확인(다중 레이아웃 미리보기) 21724.16 요약 218CHAPTER 25 안드로이드 ConstraintLayout 개요 21925.1 ConstraintLayout의 핵심 개념 219 25.2 기준선 정렬 22325.3 위젯 크기 구성하기 22425.4 지시선 22425.5 그룹 22525.6 베리어 22525.7 플로우 22725.8 비율 22825.9 ConstraintLayout의 장점 22825.10 ConstraintLayout 가용성 22825.11 요약 229CHAPTER 26 안드로이드 스튜디오에서 ConstraintLayout 사용하기 23026.1 디자인 뷰와 레이아웃 뷰 23026.2 자동-연결 23126.3 제약 추론 23226.4 수동 연결 23226.5 속성 창에서 제약 추가하기 23426.6 속성 창에서 제약 보기 23426.7 제약 삭제하기 23426.8 제약 바이어스 조정하기 23526.9 ConstraintLayout 마진 이해하기 23526.10 상대 제약과 바이어스의 중요성 23726.11 위젯의 크기 구성하기 23926.12 디자인 시점의 Tools 속성 적용/미적용 전환하기 24026.13 지시선 추가하기 24126.14 베리어 추가하기 24326.15 그룹 추가하기 24426.16 플로우 사용하기 24526.17 위젯의 그룹 정렬 24626.18 다른 레이아웃을 ConstraintLayout으로 변환하기 24626.19 요약 247CHAPTER 27 안드로이드 스튜디오에서 ConstraintLayout 체인과 비율 사용하기 24827.1 체인 생성하기 24827.2 체인 스타일 변경하기 25127.3 Spread inside 체인 스타일 25127.4 Packed 체인 스타일 25127.5 바이어스를 사용한 Packed 체인 스타일 25227.6 Weighted 체인 25227.7 비율 사용하기 25427.8 요약 255CHAPTER 28 ConstraintLayout 예제 프로젝트 25628.1 ConstraintLayout 예제 프로젝트 생성하기 25628.2 새로운 액티비티 생성하기 25628.3 자동-연결 설정과 이미지 파일 추가하기 25828.4 사용자 인터페이스에 위젯 추가하기 25928.5 제약 추가하기 26228.6 레이아웃 테스트하기 26428.7 레이아웃 탐색기 사용하기 26428.8 요약 266CHAPTER 29 XML 레이아웃 직접 작성하기 26729.1 XML 레이아웃 직접 생성하기 26729.2 XML 직접 작성 vs. 레이아웃 편집기의 디자인 뷰 사용 27129.3 요약 271CHAPTER 30 ConstraintSet으로 ConstraintLayout 사용하기 27230.1 코틀린 코드 vs. XML 레이아웃 파일 27230.2 뷰 생성하기 27330.3 뷰 속성 27330.4 ConstraintSet 274 30.5 요약 278CHAPTER 31 안드로이드 ConstraintSet 예제 프로젝트 27931.1 안드로이드 스튜디오로 예제 프로젝트 생성하기 27931.2 액티비티에 뷰 추가하기 27931.3 뷰 속성 설정하기 28131.4 뷰 id 생성하고 사용하기 28231.5 제약 설정 구성하기 28231.6 EditText 뷰 추가하기 28431.7 dp를 px로 변환하기 28531.8 요약 286CHAPTER 32 안드로이드 스튜디오의 ‘변경 적용’ 기능 사용하기 28732.1 변경 적용 기능 개요 28732.2 변경 적용 옵션 28732.3 ‘변경 적용’ 기능 사용하기 28832.4 변경 적용 설정하기 28932.5 변경 적용 기능 연습 프로젝트 생성하기 29032.6 ‘코드 변경 적용’ 기능 사용하기 29032.7 ‘변경 적용과 액티비티 재시작’ 기능 사용하기 29132.8 요약 291CHAPTER 33 안드로이드 이벤트 처리 개요 29233.1 안드로이드 이벤트 이해하기 29233.2 android:onClick 리소스 사용하기 29333.3 이벤트 리스너와 콜백 함수 29333.4 이벤트 처리 예제 29433.5 사용자 인터페이스 디자인하기 29533.6 이벤트 리스너와 콜백 함수 29633.7 이벤트 소비하기 29733.8 요약 299CHAPTER 34 터치와 다중 터치 이벤트 처리하기 30034.1 터치 이벤트 처리하기 30034.2 MotionEvent 객체 30134.3 터치 액션 이해하기 30134.4 다중 터치 처리하기 30234.5 다중 터치 앱 생성하기 30234.6 액티비티 사용자 인터페이스 디자인하기 30334.7 터치 이벤트 리스너 구현하기 30434.8 앱 실행하기 30634.9 요약 307CHAPTER 35 안드로이드 제스처 감지 클래스로 일반 제스처 처리하기 30835.1 일반 제스처 감지와 처리하기 30835.2 제스처 처리 프로젝트 생성하기 30935.3 리스너 클래스 구현하기 31035.4 GestureDetectorCompat 인스턴스 생성하기 31235.5 onTouchEvent() 함수 구현하기 31235.6 앱 테스트하기 31335.7 요약 313CHAPTER 36 커스텀 제스처와 핀치 인식 구현하기 31436.1 안드로이드 제스처 빌더 앱 31436.2 GestureOverlayView 클래스 31436.3 제스처 감지하기 31436.4 제스처 확인하기 31536.5 제스처 빌더 앱의 설치와 실행 31536.6 제스처 파일 생성하기 31536.7 예제 프로젝트 생성하기 31636.8 SD 카드 영역에서 제스처 파일 추출하기 31636.9 제스처 파일을 프로젝트에 추가하기 31736.10 사용자 인터페이스 디자인하기 31736.11 제스처 파일 로드하기 31836.12 이벤트 리스너 등록하기 31936.13 onGesturePerformed 함수 구현하기 31936.14 앱 테스트하기 32136.15 GestureOverlayView 구성하기 32136.16 제스처 가로채기 32136.17 핀치 제스처 처리하기 32236.18 핀치 제스처 예제 프로젝트 32236.19 요약 325CHAPTER 37 안드로이드 프래그먼트 개요 32637.1 프래그먼트란? 32637.2 프래그먼트 생성하기 32637.3 레이아웃 XML 파일을 사용하여 액티비티에 프래그먼트 추가하기 32837.4 코드에서 프래그먼트 추가하고 관리하기 32937.5 프래그먼트 이벤트 처리하기 33137.6 프래그먼트 간의 통신 구현하기 33237.7 요약 333CHAPTER 38 프래그먼트 사용 예제 프로젝트 33538.1 예제 프래그먼트 앱 개요 33538.2 예제 프로젝트 생성하기 33538.3 첫 번째 프래그먼트 레이아웃 생성하기 33638.4 뷰 바인딩을 사용하도록 프래그먼트 변경하기 33838.5 두 번째 프래그먼트 추가하기 33938.6 액티비티에 프래그먼트 추가하기 34038.7 ToolbarFragment가 액티비티와 통신하게 만들기 34238.8 액티비티에서 TextFragment로 통신하기 34538.9 앱 테스트하기 34638.10 요약 346CHAPTER 39 최신 안드로이드 앱 아키텍처: Jetpack 34739.1 안드로이드 Jetpack이란? 34739.2 종전 아키텍처 34739.3 최신 안드로이드 아키텍처 34839.4 ViewModel 컴포넌트 34839.5 LiveData 컴포넌트 34939.6 ViewModel의 상태 저장 35039.7 LiveData와 데이터 바인딩 35039.8 안드로이드 생명주기 35139.9 리포지터리 모듈 35139.10 요약 352CHAPTER 40 Jetpack ViewModel 예제 프로젝트 35340.1 프로젝트 개요 35340.2 ViewModel 예제 앱 생성하기 35340.3 프로젝트 살펴보기 35440.3.1 메인 액티비티 35440.3.2 콘텐츠 프래그먼트 35540.3.3 ViewModel 35640.4 프래그먼트 레이아웃 디자인하기 35640.5 ViewModel 구현하기 35740.6 ViewModel에 프래그먼트 연결하기 35840.7 프래그먼트 변경하기 35940.8 ViewModel 데이터 사용하기 36040.9 프로젝트 테스트하기 36040.10 요약 361CHAPTER 41 Jetpack LiveData 예제 프로젝트 36241.1 LiveData 핵심 요약 36241.2 ViewModel에 LiveData 추가하기 36241.3 옵저버 구현하기 36441.4 요약 366CHAPTER 42 Jetpack 데이터 바인딩 개요 36742.1 데이터 바인딩 개요 36742.2 데이터 바인딩의 핵심 구성요소 36742.3 요약 375CHAPTER 43 Jetpack 데이터 바인딩 예제 프로젝트 37643.1 중복 코드 제거하기 37643.2 데이터 바인딩 활성화하기 37743.3 레이아웃 요소 추가하기 37843.4 레이아웃 파일에 데이터 요소 추가하기 37943.5 바인딩 클래스 사용하기 37943.6 데이터 바인딩 변수에 ViewModel 인스턴스 지정하기 38143.7 바인딩 표현식 추가하기 38143.8 환전 함수 추가하기 38243.9 리스너 바인딩 추가하기 38343.10 앱 테스트하기 38343.11 요약 384CHAPTER 44 ViewModel 상태 저장 예제 프로젝트 38544.1 ViewModel 상태 저장 이해하기 38544.2 ViewModel 상태 저장 구현하기 38644.3 상태 저장 및 복원하기 38744.4 ViewModelDemo 프로젝트에 상태 저장 지원 추가하기 38844.5 요약 390CHAPTER 45 안드로이드 생명주기-인식 컴포넌트 사용하기 39145.1 생명주기-인식 39145.2 생명주기 소유자 39245.3 생명주기 옵저버 39345.4 생명주기 상태와 이벤트 39345.5 요약 395CHAPTER 46 Jetpack 생명주기-인식 예제 프로젝트 39646.1 생명주기 예제 프로젝트 생성하기 39646.2 생명주기 옵저버 생성하기 39646.3 옵저버 추가하기 39846.4 옵저버 테스트하기 39946.5 생명주기 소유자 생성하기 40046.6 커스텀 생명주기 소유자 테스트하기 40246.7 요약 402CHAPTER 47 내비게이션 아키텍처 컴포넌트 개요 40347.1 내비게이션 이해하기 40347.2 내비게이션 호스트 선언하기 40547.3 내비게이션 그래프 40647.4 내비게이션 컨트롤러 사용하기 40847.5 내비게이션 액션 실행하기 40947.6 인자 전달 40947.7 요약 410CHAPTER 48 Jetpack 내비게이션 컴포넌트 예제 프로젝트 41148.1 NavigationDemo 프로젝트 생성하기 41148.2 빌드 구성에 내비게이션 라이브러리 추가하기 41148.3 내비게이션 그래프 리소스 파일 생성하기 41248.4 내비게이션 호스트 선언하기 41348.5 내비게이션 목적지 추가하기 41548.6 목적지 프래그먼트 레이아웃 디자인하기 41748.7 내비게이션 그래프에 액션 추가하기 41848.8 OnFragmentInteractionListener 구현하기 41948.9 목적지 프래그먼트에 뷰 바인딩 지원 추가하기 42048.10 액션 실행하기 42148.11 Safeargs를 사용한 데이터 전달 42248.12 요약 426CHAPTER 49 MotionLayout 개요 42749.1 MotionLayout이란? 42749.2 MotionLayout 클래스 42749.3 MotionScene 42849.4 ConstraintSet 구성하기 42949.5 커스텀 속성 43049.6 애니메이션 시작하기 43149.7 호 형태의 이동 43349.8 키 프레임 43349.9 애니메이션 속도 변경 43649.10 KeyTrigger 43749.11 사이클 키 프레임과 시간 사이클 키 프레임 43849.12 코드에서 애니메이션 시작하기 43849.13 요약 439CHAPTER 50 MotionLayout 편집기 예제 프로젝트 44050.1 MotionLayoutDemo 프로젝트 생성하기 44050.2 ConstraintLayout을 MotionLayout으로 변환하기 44050.3 시작과 끝 ConstraintSet 구성하기 44250.4 MotionLayout 애니메이션 미리보기 44450.5 OnClick 제스처 추가하기 44550.6 속성 키 프레임 추가하기 44650.7 CustomAttribute 추가하기 44850.8 위치 키 프레임 추가하기 45050.9 요약 452CHAPTER 51 MotionLayout KeyCycle 45351.1 사이클 키 프레임 개요 45351.2 사이클 편집기 사용하기 45751.3 KeyCycleDemo 프로젝트 생성하기 45951.4 시작과 끝 ConstraintSet 구성하기 45951.5 KeyCycle 생성하기 46151.6 애니메이션 미리보기 46351.7 MotionScene 파일에 KeyFrameSet 추가하기 46351.8 요약 466CHAPTER 52 플로팅 액션 버튼과 스낵바 사용하기 46752.1 머티리얼 디자인 46752.2 디자인 라이브러리 46852.3 플로팅 액션 버튼(FAB) 46852.4 스낵바 46952.5 예제 프로젝트 생성하기 46952.6 프로젝트 살펴보기 46952.7 프래그먼트 간의 이동 코드 삭제하기 47152.8 플로팅 액션 버튼 변경하기 47252.9 스낵바에 액션 추가하기 47352.10 요약 474CHAPTER 53 탭 인터페이스 생성하기 47553.1 ViewPager2 개요 47553.2 TabLayout 컴포넌트 개요 47553.3 TabLayoutDemo 프로젝트 생성하기 47653.4 첫 번째 프래그먼트 생성하기 47753.5 프래그먼트 복제하기 47853.6 TabLayout과 ViewPager2 추가하기 48053.7 FragmentStateAdapter 생성하기 48153.8 초기화 작업하기 48253.9 앱 테스트하기 48353.10 TabLayout 커스터마이징 48453.11 요약 485CHAPTER 54 RecyclerView와 CardView 사용하기 48654.1 RecyclerView 개요 48654.2 CardView 개요 48954.3 요약 490CHAPTER 55 RecyclerView와 CardView 예제 프로젝트 49155.1 CardDemo 프로젝트 생성하기 49155.2 Basic Activity 프로젝트 변경하기 49155.3 CardView 레이아웃 디자인하기 49255.4 RecyclerView 추가하기 49355.5 이미지 파일 추가하기 49355.6 RecyclerView 어댑터 생성하기 49455.7 RecyclerView 컴포넌트 초기화하기 49655.8 앱 테스트하기 49855.9 카드 선택에 응답하기 49855.10 요약 499CHAPTER 56 레이아웃 편집기에서 샘플 데이터 사용하기 50056.1 프로젝트에 샘플 데이터 추가하기 50056.2 커스텀 샘플 데이터 사용하기 50456.3 요약 507CHAPTER 57 앱 바와 컬랩싱 툴바 레이아웃 사용하기 50857.1 AppBar 개요 50857.2 예제 프로젝트 50957.3 RecyclerView와 Toolbar 연동시키기 50957.4 컬랩싱 툴바 레이아웃 개요 51157.5 제목과 스크림 색상 변경하기 51457.6 요약 515CHAPTER 58 안드로이드 스튜디오 기본/상세 플로 51658.1 기본/상세 플로 개요 51658.2 기본/상세 플로 액티비티 생성하기 51858.3 기본/상세 플로 템플릿 살펴보기 51958.4 기본/상세 플로 템플릿 변경하기 52058.5 콘텐츠 모델 변경하기 52058.6 상세 패널 변경하기 52258.7 WebsiteDetailFragment 클래스 변경하기 52458.8 WebsiteListFragment 클래스 수정하기 52558.9 매니페스트 퍼미션 추가하기 52658.10 앱 실행하기 52658.11 요약 527CHAPTER 59 안드로이드 인텐트 개요 52859.1 인텐트 개요 52859.2 명시적 인텐트 52959.3 액티비티에서 데이터 반환하기 53059.4 암시적 인텐트 53159.5 인텐트 필터 사용하기 53259.6 인텐트 사용 가능 여부 확인하기 53359.7 요약 533CHAPTER 60 명시적 인텐트 예제 프로젝트 53560.1 예제 프로젝트 생성하기 53560.2 MainActivity의 사용자 인터페이스 디자인하기 53560.3 두 번째 액티비티 클래스 생성하기 53760.4 ActivityB의 사용자 인터페이스 레이아웃 디자인하기 53860.5 앱의 매니페스트 파일 살펴보기 53960.6 인텐트 생성하기 54060.7 인텐트 데이터 추출하기 54160.8 서브 액티비티로 ActivityB 시작시키기 54260.9 서브 액티비티에서 데이터 반환하기 54360.10 앱 테스트하기 54460.11 요약 544CHAPTER 61 암시적 인텐트 예제 프로젝트 54561.1 암시적 인텐트 예제 프로젝트 생성하기 54561.2 사용자 인터페이스 디자인하기 54561.3 암시적 인텐트 생성하기 54661.4 암시적 인텐트로 시작되는 액티비티 생성하기 54761.5 사용자 인터페이스에 웹 뷰 추가하기 54861.6 인텐트 URL 얻기 54861.7 MyWebView 프로젝트의 매니페스트 파일 변경하기 54961.8 장치에 MyWebView 패키지 설치하기 55161.9 앱 테스트하기 55261.10 요약 553CHAPTER 62 브로드캐스트 인텐트와 브로드캐스트 수신자 55462.1 브로드캐스트 인텐트 개요 55462.2 브로드캐스트 수신자 개요 55562.3 브로드캐스트 수신자로부터 결과 데이터 받기 55762.4 스티키 브로드캐스트 인텐트 55762.5 브로드캐스트 인텐트 예제 프로젝트 55862.6 예제 앱 생성하기 55862.7 브로드캐스트 인텐트를 생성하고 전송하기 55962.8 브로드캐스트 수신자 생성하기 55962.9 브로드캐스트 수신자 등록하기 56162.10 브로드캐스트 앱 테스트하기 56262.11 시스템 브로드캐스트 인텐트 리스닝하기 56262.12 요약 563CHAPTER 63 스레드와 AsyncTask 56463.1 스레드 개요 56463.2 앱의 메인 스레드 56463.3 스레드 처리 56563.4 기본적인 AsyncTask 예제 프로젝트 56563.5 AsyncTask의 서브 클래스 생성하기 56763.6 앱 테스트하기 57063.7 작업 취소하기 57163.8 요약 571CHAPTER 64 코틀린 코루틴 개요 57264.1 코루틴이란? 57264.2 스레드 vs. 코루틴 57364.3 코루틴 범위 57364.4 정지 함수 57464.5 코루틴 디스패처 57464.6 코루틴 빌더 57564.7 Job 57664.8 코루틴의 정지와 실행 재개 57664.9 코루틴에서 결과 받기 57864.10 withContext 사용하기 57864.11 코루틴 채널 통신 58064.12 요약 581CHAPTER 65 코틀린 코루틴 예제 프로젝트 58265.1 코루틴 예제 앱 생성하기 58265.2 코루틴 지원 라이브러리 추가하기 58265.3 사용자 인터페이스 디자인하기 58365.4 SeekBar 구현하기 58465.5 정지 함수 추가하기 58565.6 launchCoroutines 함수 구현하기 58665.7 앱 테스트하기 58665.8 요약 587CHAPTER 66 스타트 서비스와 바운드 서비스 개요 58866.1 스타트 서비스 58866.2 인텐트 서비스 58966.3 바운드 서비스 58966.4 서비스 생명주기 59066.5 소멸된 서비스 재시작 옵션 제어하기 59166.6 매니페스트 파일에 서비스 선언하기 59166.7 시스템 부팅 시 서비스 시작시키기 59366.8 요약 593CHAPTER 67 스타트 서비스 구현 예제 프로젝트 59467.1 예제 프로젝트 생성하기 59467.2 사용자 인터페이스 디자인하기 59467.3 Service 클래스 생성하기 59567.4 매니페스트 파일에 서비스 추가하기 59767.5 서비스 시작시키기 59767.6 JobIntentService 테스트하기 59867.7 Service 클래스 사용하기 59967.8 새로운 서비스 생성하기 59967.9 서비스를 시작하도록 변경하기 60067.10 앱 실행하기 60167.11 서비스 작업에 코루틴 사용하기 60167.12 요약 603CHAPTER 68 로컬 바운드 서비스 예제 프로젝트 60468.1 바운드 서비스 이해하기 60468.2 바운드 서비스 상호작용 옵션 60468.3 로컬 바운드 서비스 예제 프로젝트 60568.4 프로젝트에 바운드 서비스 추가하기 60568.5 Binder 구현하기 60668.6 서비스에 클라이언트 바인딩하기 60868.7 예제 프로젝트 마무리하기 61068.8 앱 테스트하기 61168.9 요약 611CHAPTER 69 원격 바운드 서비스 예제 프로젝트 61269.1 클라이언트에서 원격 서비스로 통신하기 61269.2 예제 앱 생성하기 61269.3 사용자 인터페이스 디자인하기 61369.4 원격 바운드 서비스 구현하기 61369.5 매니페스트 파일에 원격 서비스 구성하기 61469.6 원격 서비스를 시작시키고 바인딩하기 61569.7 원격 서비스에 메시지 전송하기 61769.8 요약 617CHAPTER 70 안드로이드 알림 개요 61870.1 알림 개요 61870.2 NotifyDemo 프로젝트 생성하기 62070.3 사용자 인터페이스 디자인하기 62070.4 두 번째 액티비티 생성하기 62170.5 알림 채널 생성하기 62170.6 기본 알림을 생성하고 전달하기 62370.7 알림에서 액티비티 시작시키기 62670.8 알림에 액션 추가하기 62770.9 알림 메시지 묶기 62870.10 요약 630CHAPTER 71 안드로이드 직접 응답 알림 구현 63171.1 DirectReply 프로젝트 생성하기 63171.2 사용자 인터페이스 디자인하기 63171.3 알림 채널 생성하기 63271.4 RemoteInput 객체 생성하기 63371.5 PendingIntent 객체 생성하기 63471.6 응답 액션 생성하기 63571.7 직접 응답 입력 데이터 수신하기 63771.8 알림 변경하기 63871.9 요약 639CHAPTER 72 폴더블 장치와 다중 창 지원 64072.1 폴더블과 다중 창 지원 64072.2 폴더블 에뮬레이터 사용하기 64272.3 다중 창 모드로 전환하기 64372.4 다중 창 지원을 활성화하고 사용하기 64472.5 자유형식 모드의 지원 여부 확인하기 64472.6 다중 창 지원을 앱에서 활성화하기 64572.7 다중 창 관련 속성 지정하기 64572.8 액티비티에서 다중 창 모드인지 검사하기 64672.9 다중 창 관련 통지받기 64772.10 다중 창 모드에서 액티비티 시작시키기 64872.11 자유형식 모드로 실행되는 액티비티의 크기와 위치 구성하기 64872.12 요약 649CHAPTER 73 안드로이드 SQLite 데이터베이스 개요 65073.1 데이터베이스 테이블 이해하기 65073.2 데이터베이스 스키마 개요 65173.3 열과 데이터 타입 65173.4 데이터베이스 행 65173.5 기본 키 개요 65173.6 SQLite란? 65273.7 SQL 65273.8 AVD에서 SQLite 사용해 보기 65373.9 안드로이드 Room 퍼시스턴스 라이브러리 65673.10 요약 656CHAPTER 74 안드로이드 Room 퍼시스턴스 라이브러리 65774.1 최신 앱 아키텍처 다시 보기 65774.2 Room 데이터베이스 퍼시스턴스의 핵심 요소 65874.3 엔터티 이해하기 65974.4 DAO 66274.5 Room 데이터베이스 66474.6 리포지터리 66574.7 인메모리 데이터베이스 66574.8 데이터베이스 탐색기 66674.9 요약 666CHAPTER 75 TableLayout과 TableRow 개요 66775.1 TableLayout과 TableRow 66775.2 Room 데이터베이스 프로젝트 생성하기 66975.3 LinearLayout으로 변환하기 66975.4 사용자 인터페이스에 TableLayout 추가하기 67075.5 TableRow 구성하기 67075.6 레이아웃에 버튼 추가하기 67275.7 RecyclerView 추가하기 67275.8 레이아웃 마진 조정하기 67375.9 요약 674CHAPTER 76 Room 데이터베이스와 리포지터리 예제 프로젝트 67576.1 예제 프로젝트 개요 67576.2 빌드 구성 변경하기 67576.3 엔터티 생성하기 67676.4 DAO 생성하기 67876.5 Room 데이터베이스 추가하기 67976.6 리포지터리 추가하기 68076.7 ViewModel 변경하기 68376.8 제품 항목 레이아웃 생성하기 68576.9 RecyclerView 어댑터 추가하기 68576.10 MainFragment 변경하기 68676.11 버튼 리스너 추가하기 68876.12 LiveData 옵저버 추가하기 68976.13 RecyclerView 초기화하기 69076.14 RoomDemo 앱 테스트하기 69076.15 데이터베이스 탐색기 사용하기 69076.16 요약 692CHAPTER 77 구글 클라우드 스토리지 액세스하기 69377.1 스토리지 액세스 프레임워크 69377.2 스토리지 액세스 프레임워크 사용하기 69477.3 피커의 파일 내역 선별하기 69477.4 인텐트 결과 처리하기 69677.5 파일 내용 읽기 69677.6 파일에 내용 쓰기 69777.7 파일 삭제하기 69877.8 파일의 지속적인 액세스 얻기 69877.9 요약 699CHAPTER 78 안드로이드 스토리지 액세스 프레임워크 예제 프로젝트 70078.1 스토리지 액세스 프레임워크 예제 프로젝트 개요 70078.2 스토리지 액세스 프레임워크 예제 프로젝트 생성 70078.3 사용자 인터페이스 디자인하기 70178.4 요청 코드 선언하기 70278.5 새로운 스토리지 파일 생성하기 70278.6 onActivityResult() 함수 70378.7 스토리지 파일에 데이터 저장하기 70578.8 스토리지 파일 열고 읽기 70778.9 스토리지 액세스 앱 테스트하기 70978.10 요약 710CHAPTER 79 동영상 재생 구현하기 71179.1 안드로이드 VideoView 클래스 개요 71179.2 안드로이드 MediaController 클래스 개요 71279.3 동영상 재생 예제 프로젝트 생성하기 71379.4 VideoPlayer 앱의 레이아웃 디자인하기 71379.5 동영상 파일 다운로드하기 71479.6 VideoView 구성하기 71579.7 VideoView에 MediaController 추가하기 71679.8 onPreparedListener 설정하기 71779.9 요약 718CHAPTER 80 안드로이드 PiP 모드 71980.1 PiP 모드의 기능 71980.2 PiP 모드 활성화하기 72080.3 PiP 매개변수 구성하기 72180.4 PiP 모드 진입하기 72180.5 PiP 모드 변경 감지하기 72280.6 PiP 액션 추가하기 72280.7 요약 723CHAPTER 81 안드로이드 PiP 예제 프로젝트 72481.1 PiP 지원 활성화하기 72481.2 PiP 버튼 추가하기 72481.3 PiP 모드 진입하기 72581.4 PiP 모드 변경 감지하기 72781.5 브로드캐스트 수신자 추가하기 72781.6 PiP 액션 추가하기 72981.7 PiP 액션 테스트하기 73181.8 요약 731CHAPTER 82 런타임 퍼미션 요청하기 73282.1 보통 퍼미션과 위험 퍼미션 이해하기 73282.2 퍼미션 예제 프로젝트 생성하기 73482.3 퍼미션 확인하기 73482.4 런타임 시에 퍼미션 요청하기 73682.5 퍼미션 요청 이유 제공하기 73782.6 퍼미션 앱 테스트하기 73982.7 요약 739CHAPTER 83 안드로이드 오디오 녹음 및 재생하기 74083.1 오디오 재생하기 74083.2 MediaRecorder 클래스를 사용해서 오디오 녹음하기 74183.3 예제 프로젝트 개요 74383.4 AudioApp 프로젝트 생성하기 74383.5 사용자 인터페이스 디자인하기 74383.6 마이크 확인하기 74483.7 액티비티 초기화하기 74583.8 recordAudio() 함수 구현하기 74783.9 stopAudio() 함수 구현하기 74783.10 playAudio() 함수 구현하기 74883.11 매니페스트 파일에 퍼미션 구성하기 74883.12 앱 테스트하기 75183.13 요약 751CHAPTER 84 안드로이드 인쇄 프레임워크 사용하기 75284.1 안드로이드 인쇄 아키텍처 75284.2 인쇄 서비스 플러그인 75284.3 구글 클라우드 인쇄 75384.4 구글 드라이브로 인쇄하기 75484.5 PDF로 저장하기 75484.6 안드로이드 장치에서 인쇄하기 75484.7 안드로이드 앱에 포함되는 인쇄 지원 옵션 75584.7.1 이미지 인쇄 75584.7.2 HTML 콘텐츠 생성과 인쇄 75684.7.3 기존 웹 페이지 인쇄하기 75884.7.4 커스텀 문서 인쇄하기 75984.8 요약 759CHAPTER 85 HTML과 웹 콘텐츠 인쇄 예제 프로젝트 76085.1 HTML 인쇄 예제 앱 생성하기 76085.2 동적 HTML 콘텐츠 인쇄하기 76085.3 기존 웹 페이지 인쇄 예제 앱 생성하기 76385.4 플로팅 액션 버튼 삭제하기 76385.5 프래그먼트 간의 이동 코드 삭제하기 76485.6 사용자 인터페이스 레이아웃 디자인하기 76585.7 메인 액티비티에서 WebView 사용하기 76685.8 WebView에 웹 페이지 로드하기 76685.9 인쇄 메뉴 옵션 추가하기 76785.10 요약 769CHAPTER 86 안드로이드 커스텀 문서 인쇄 77086.1 안드로이드 커스텀 문서 인쇄 개요 77086.1.1 커스텀 인쇄 어댑터 77186.2 커스텀 문서 인쇄 프로젝트 준비하기 77186.3 커스텀 인쇄 어댑터 생성하기 77286.4 onLayout() 콜백 함수 구현하기 77386.5 onWrite() 콜백 함수 구현하기 77786.6 페이지가 인쇄 범위에 있는지 확인하기 77986.7 페이지 캔버스에 콘텐츠 그리기 78086.8 인쇄 작업 시작시키기 78286.9 앱 테스트하기 78386.10 요약 784CHAPTER 87 안드로이드 앱 링크 78587.1 안드로이드 앱 링크 개요 78587.2 앱 링크 인텐트 필터 78587.3 앱 링크 인텐트 처리하기 78687.4 앱을 웹사이트와 연관시키기 78787.5 요약 788CHAPTER 88 앱 링크 예제 프로젝트 78988.1 예제 앱에 관하여 78988.2 데이터베이스 스키마 78988.3 프로젝트 실행하기 79088.4 URL 매핑 추가하기 79188.5 인텐트 필터 추가하기 79388.6 인텐트 처리 코드 추가하기 79488.7 앱 링크 테스트하기 79788.8 앱 링크를 웹사이트에 연결하기 79888.9 요약 800CHAPTER 89 안드로이드 스튜디오 프로파일러 80189.1 안드로이드 프로파일러 사용하기 80189.2 최신 프로파일링 활성화하기 80189.3 안드로이드 프로파일러 도구 창 80289.4 Sessions 패널 80389.5 CPU 프로파일러 80489.6 메모리 프로파일러 80889.7 네트워크 프로파일러 80989.8 에너지 프로파일러 81089.9 요약 811CHAPTER 90 안드로이드 생체 인증 81290.1 생체 인증 개요 81290.2 생체 인증 프로젝트 생성하기 81390.3 장치의 지문 인증 구성하기 81390.4 매니페스트 파일에 생체 퍼미션 추가하기 81490.5 사용자 인터페이스 디자인하기 81490.6 Toast 메시지를 보여 줄 함수 추가하기 81590.7 장치의 보안 설정 확인하기 81690.8 인증 콜백 구성하기 81790.9 CancellationSignal 추가하기 81890.10 생체 인증 시작시키기 81890.11 앱 테스트하기 81990.12 요약 820CHAPTER 91 안드로이드 앱 번들 생성, 테스트, 업로딩 82191.1 앱 출시 준비 절차 82191.2 안드로이드 앱 번들 82191.3 구글 플레이 개발자 콘솔 계정 등록하기 82291.4 콘솔에서 앱 구성하기 82391.5 구글 플레이 앱 서명 활성화하기 82491.6 키스토어 파일 생성하기 82591.7 안드로이드 앱 번들 생성하기 82791.8 테스트 APK 파일 생성하기 82991.9 구글 플레이 개발자 콘솔에 앱 번들 업로드하기 83091.10 앱 번들 살펴보기 83191.11 테스터 관리하기 83291.12 테스트를 위한 앱 출시 83391.13 새 버전의 앱 번들 업로드하기 83391.14 앱 번들 파일 분석하기 83591.15 요약 836CHAPTER 92 안드로이드 동적 기능 모듈 83792.1 동적 기능 모듈 개요 83792.2 동적 기능 모듈 아키텍처 83892.3 동적 기능 모듈 생성하기 83992.4 기존 모듈을 동적 기능 모듈로 변환하기 84192.5 동적 기능 모듈 사용하기 84492.6 대형 동적 기능 모듈 처리하기 84692.7 요약 847CHAPTER 93 동적 기능 모듈 예제 프로젝트 84893.1 DynamicFeature 프로젝트 생성하기 84893.2 프로젝트에 동적 기능 지원 추가하기 84893.3 기본 액티비티 UI 디자인하기 85093.4 동적 기능 모듈 추가하기 85193.5 동적 기능 모듈 살펴보기 85293.6 동적 기능 모듈 액티비티 추가하기 85493.7 launchFeature() 함수 구현하기 85793.8 테스트를 위해 앱 번들 업로드하기 85893.9 installFeature() 함수 구현하기 85993.10 업데이트 리스너 추가하기 86193.11 대형 다운로드 처리하기 86493.12 지연 설치 사용하기 86693.13 동적 기능 모듈 제거하기 86693.14 요약 866CHAPTER 94 안드로이드 스튜디오의 그래들 개요 86794.1 그래들 개요 86794.2 그래들과 안드로이드 스튜디오 86894.2.1 합리적인 디폴트 86894.2.2 의존성 86894.2.3 빌드 변이 86994.2.4 매니페스트 항목 86994.2.5 APK 서명하기 86994.2.6 ProGuard 지원 86994.3 최상위 수준의 그래들 빌드 파일 86994.4 모듈 수준의 그래들 빌드 파일 87094.5 빌드 파일에 서명 설정 구성하기 87394.6 명령행에서 그래들 작업 실행하기 87594.7 요약 876찾아보기 878
최신 안드로이드 스튜디오와 안드로이드 OS 반영!안드로이드 스튜디오 설치부터 안드로이드 개발까지!이 책은 최신 버전의 안드로이드 스튜디오를 사용해서 안드로이드 앱을 개발하는 데 필요한 핵심적인 내용을 알려 줍니다. 즉, 안드로이드 스튜디오의 기능과 활용법은 물론이고, 최신의 핵심적인 안드로이드 컴포넌트와 라이브러리를 사용한 안드로이드 프로그래밍 기법도 자세하게 가르쳐 줍니다. 그리고 이 모든 것을 안드로이드 스튜디오의 실습 프로젝트로 구성하여 독자 여러분이 직접 만들어 체험하면서 쉽게 배울 수 있도록 구성하였습니다. 따라서 안드로이드 스튜디오를 사용해서 안드로이드 앱 개발을 배우고 시작하려는 분들과 최신의 안드로이드 컴포넌트를 활용한 프로그래밍 기법을 알고자 하는 기존 개발자분들께 적극 권하고 싶은 책입니다. 이 책의 특징 및 구성-모든 내용을 최신의 안드로이드 스튜디오 Arctic Fox 버전에 맞춰 작성하였으며, 프로젝트 코드는 Arctic Fox 버전과 Bumblebee 버전 모두에서 테스트를 완료하였습니다.-용어 선정에 신중을 기하고 독자 여러분의 이해를 돕는 데 필요한 설명을 많이 추가하였습니다.-책의 각종 프로젝트를 독자 여러분이 만들면서 실습하는 데 도움이 될 수 있도록 저자에게 문의하여 원서의 결함을 수정하고 미비한 점을 보완하였습니다.이 책의 대상 독자-코틀린 기반으로 안드로이드 앱 개발을 하려는 분-최신 안드로이드 스튜디오의 기초부터 고급까지를 모두 익히고자 하는 분-안드로이드 핵심 컴포넌트와 라이브러리를 이용한 안드로이드 프로그래밍을 배우고자 하는 분-안드로이드 아키텍처 컴포넌트와 같은 최신 안드로이드 컴포넌트를 사용한 안드로이드 앱 개발 기법을 파악하고자 하는 분