Part 01 안드로이드 시작하기01 _ 개발환경을 구축하자!1.1. 안드로이드 스튜디오 개발환경 구축1.1.1. 자바 설치1.1.2. 안드로이드 스튜디오 설치1.1.3. 안드로이드 스튜디오 설정1.2. 첫 번째 앱 만들고 실행하기1.2.1. 프로젝트 생성1.2.2. AVD 매니저1.2.3. AVD에서 실행1.2.4. 스마트폰에서 실행1.2.5. 개발 편의를 위한 설정1.3. 앱 배포1.3.1. APK 파일 추출1.3.2. APK 파일 배포02 _ 안드로이드 프로젝트 이해2.1. 안드로이드 앱 개발 특징2.1.1. 안드로이드의 특징2.1.2. 안드로이드 플랫폼 아키텍처2.1.3. 컴포넌트 기반 개발2.1.4. 리소스를 이용한 개발2.2. 개발 디렉터리와 파일 구조2.2.1. 앱의 디렉터리와 파일2.2.2. R.java의 이해2.3. 그레이들(gradle) 파일2.3.1. settings.gradle2.3.2. 프로젝트 수준의 그레이들2.3.3. 모듈 수준의 그레이들2.4. Hello World 앱 코드 분석 2.4.1. AndroidManifest.xml 2.4.2. MainActivity.java 2.4.3. activity_main.xml 2.5. 안드로이드 버전Part 02 기본 앱을 만들어보자03 _ 사용자 인터페이스3.1. UI의 기본 구조3.1.1. 액티비티-뷰 구조3.1.2. UI 프로그램 작성 방법 : 자바 코드 VS 레이아웃 XML3.1.3. 뷰의 기초 속성3.2. 뷰 아키텍처3.2.1. 뷰의 계층구조3.2.2. 뷰 계층구조 구현3.3. 기초 뷰 활용3.3.1. TextView3.3.2. ImageView3.3.3. EditText3.3.4. Button3.3.5. Checkbox, RadioButton04 _ 레이아웃을 활용한 다양한 뷰 배치4.1. LinearLayout4.1.1. LinearLayout 소개4.1.2. 레이아웃 중첩4.1.3. LinearLayout 속성4.2. RelativeLayout4.2.1. RelativeLayout 소개4.2.2. align 속성4.2.3. alignParentXXX 속성4.3. FrameLayout4.3.1. FrameLayout 소개4.3.2. 탭 화면 구현 : TabHost4.4. TableLayout4.5. GridLayout 4.5.1. GridLayout 소개 4.5.2. GridLayout 속성 4.6. ConstraintLayout 4.6.1. 상대적 위치 지정 4.6.2. 여백(margin) 4.6.3. 가운데 맞춤과 치우침(bias) 4.6.4. 비율(Ratio)05 _ 다양한 사용자 알림 효과5.1. 진동과 소리 5.1.1. 진동 울리기 5.1.2. 소리 울리기 5.2. 다이얼로그 5.2.1. 토스트(Toast) 5.2.2. 알림 창(AlertDialog) 5.2.3. 목록(AlertDialog) 5.2.4. 프로그레스 다이얼로그(ProgressDialog) 5.2.5. 날짜 선택(DatePickerDialog) 5.2.6. 시간 선택(TimePickerDialog) 5.2.7. 커스텀 다이얼로그(AlertDialog)06 _ 사용자 이벤트 처리6.1. 델리게이션 이벤트 모델 6.1.1. 이벤트 프로그램 구조 6.1.2. 다양한 이벤트 처리 6.2. 하이어라키 이벤트 모델 6.2.1. 터치 이벤트 6.2.2. 키 이벤트 07 _ 리소스 활용 및 스마트폰 크기 호환성7.1. 안드로이드 리소스 7.1.1. 리소스 종류 7.1.2. 다양한 리소스 활용 7.2. 스마트폰 크기 호환성 7.2.1. 리소스 폴더명 조건 명시법 7.2.2. DisplayMetrics 7.2.3. 논리적 단위로 스마트폰 크기 호환성 확보 도전 과제Mission 1: 페이스북의 메신저 인트로 화면 구성 Mission 2: 브런치 앱의 새 글 작성 화면 및 앱 종료 다이얼로그 띄위기 Mission 3: 주소록 앱의 새 연락처 화면 구성 Part 03 앱의 데이터를 영속화하자08 _ DBMS을 이용한 데이터 영속화8.1. SQLite을 이용한 영속화 8.1.1. SQLiteDatabase 클래스 8.1.2. SQLiteOpenHelper 클래스 8.1.3. insert( ), query( ), update( ), delete( ) 함수 이용8.2. Realm을 이용한 데이터 영속화 8.2.1. Realm 소개 8.2.2. Realm 사용 설정 8.2.3. Realm 사용09 _ 파일 및 SharedPreferences을 이용한 데이터 영속화9.1. 퍼미션 9.1.1. 퍼미션이란? 9.1.2. 안드로이드 6.0 (API Level 23) 변경사항 9.2. 파일에 읽고 쓰기 9.2.1. 외부 저장 공간 이용 9.2.2. 내부 저장 공간 이용 9.3. SharedPreferences와 앱 설정 자동화 9.3.1. SharedPreferences 9.3.2. 앱 설정 자동화 9.3.3. 앱 설정 자동화 적용 도전 과제Mission 1: 주소록 앱의 새로운 연락처 등록 화면 기능 구현 Mission 2: 스마트폰의 환경설정 화면 및 설정 데이터 저장Part 04 다양한 화면을 구성하자10 _ AdapterView 활용10.1. Adapter와 AdapterView 10.1.1. AdapterView의 구조 10.1.2. 라이브러리의 Adapter 10.2. 커스텀 Adapter 10.2.1. 커스텀 Adapter가 필요한 예10.2.2. 커스텀 Adapter 작성 방법 10.2.3. 커스텀 Adapter 추가 고려 사항11 _ 다양한 뷰 활용11.1. Spannable 11.1.1. Spannable의 필요성 11.1.2. Spannable 적용 11.1.3. fromHtml( ) 함수로 적용 11.2. WebView 11.2.1. WebView 활용 11.2.2. 자바스크립트와 자바 연동 11.2.3. 이벤트 처리 11.3. 기타 유용한 뷰 11.3.1. 콤보박스 : Spinner 11.3.2. 텍스트 자동완성 : AutoCompleteTextView 11.3.3. 프로그레스바 : ProgressBar 11.3.4. 값을 입력받는 프로그레스바 : SeekBar 12 _ ActionBar와 메뉴12.1. ActionBar 12.1.1. ActionBar 구성 12.1.2. 표시 옵션 12.2. 안드로이드 API Level과 하위 호환성 12.3. 메뉴 12.3.1. 메뉴 작성 방법 12.3.2. MenuInflater 활용 12.3.3. 메뉴 다양하게 이용하기13 _ 커스텀 뷰 개발13.1. 커스텀 뷰 작성 방법 13.2. 그래픽 프로그램 13.2.1. 뷰를 그리는 방법 13.2.2. Paint 클래스 13.2.3. 코드에서 논리적 크기 획득 도전 과제Mission 1: 전화 앱의 로그 화면 구현 Mission 2: 피트니스 앱의 활동 로그 도넛 작성 Mission 3: 검색 추천단어 화면 구성 14 _ 인텐트와 구글 기본 앱 연동14.1. 인텐트 14.1.1. 인텐트의 기본 개념 14.1.2. 명시적 인텐트, 암시적 인텐트 14.1.3. 인텐트 필터(Intent Filter) 14.1.4. Extra 데이터 14.1.5. 결과 되돌리기 14.2. 구글 기본 앱 연동 14.2.1. 주소록 앱 14.2.2. 카메라 앱 14.2.3. 갤러리 앱 14.2.4. 음성인식 앱 14.2.5. 기타 앱 연동15 _ 액티비티 생명주기 및 다양한 제어15.1. 액티비티 생명주기 15.1.1. 생명주기 15.1.2. 액티비티 상태 저장 15.2. 태스크 관리 15.2.1. 시스템의 태스크 관리 15.2.2. 태스크 제어 방법 1 : launchMode 속성 설정 15.2.3. 태스크 제어 방법 2 : Intent 플래그 이용 15.3. 액티비티를 위한 다양한 설정 15.3.1. 키보드 제어 15.3.2. 다중 창 지원 15.3.3. Picture In Picture(Android Oreo 추가사항) 15.3.4. 기타 설정 16 _ 스레드와 핸들러16.1. ANR과 스레드-핸들러 16.1.1. 액티비티 ANR 16.1.2. ANR 문제 해결방법 16.1.3. 핸들러 16.2. AsyncTask와 Looper 16.2.1. AyncTask 16.2.2. Looper 도전 과제Mission 1: 카메라 앱 연동 Mission 2: 구글 기본 앱 연동Part 06 상용 앱 수준의 화면을 구성하자17 _ Support 라이브러리 활용17.1. Fragment 17.1.1. Fragment 이해 17.1.2. Fragment 작성법 17.1.3. Fragment 생명주기 17.1.4. 다양한 Fragment 17.2. ViewPager 17.3. RecyclerView 17.3.1. RecyclerView 소개 17.3.2. Adapter, ViewHolder 17.3.3. LayoutManager 17.3.4. ItemDecoration 18 _ 머티리얼 디자인18.1. NavigationDrawer, NavigationView 18.1.1. NavigationDrawer 18.1.2. NavigationView 18.2. Snackbar, FloatingActionButton, TabLayout 18.2.1. Snackbar 18.2.2. FloatingActionButton 18.2.3. TabLayout 18.3. Toolbar, AppBarLayout, CoordinationLayout 18.3.1. Toolbar 18.3.2. AppBarLayout 18.3.3. CoordinatorLayout 18.4. Bottom Sheet 18.4.1. persistent bottom sheet 18.4.2. modal bottom sheet도전 과제Mission 1: AppBar, CoordinatorLayout Mission 2: NavigationDrawer, NavigationView Mission 3: RecyclerViewPart 07 컴포넌트를 제대로 이해하고 개발하자19 _ 브로드캐스트 리시버와 알림19.1. 브로드캐스트 리시버19.1.1. 브로드캐스트 리시버 이해 19.1.2. 브로드캐스트 리시버 작성 방법 19.1.3. 시스템 브로드캐스트 인텐트 19.1.4. 백그라운드 서비스 제한 (Android Oreo 변경사항) 19.2. 알림 19.2.1. 알림의 기본 구성 19.2.2. NotificationChannel(Android Oreo 추가사항) 19.2.3. 기본적인 알림 구성 19.2.4. 알림의 다양한 구성 20 _ 서비스 컴포넌트20.1. 서비스 기본 개념 20.1.1. 서비스 작성 방법 20.1.2. 서비스 생명주기 20.1.3. 데이터 공유 20.2. AIDL의 이해 20.2.1. AIDL 프로그램 구조 20.2.2. AIDL 작성 방법20.3. 인텐트 서비스(IntentService) 20.4. 시스템 서비스(SystemService) 20.4.1. ActivityManager 20.4.2. PackageManager 20.4.3. AlarmManager 20.5. 백그라운드 서비스 제한 21 _ 콘텐츠 프로바이더21.1. 콘텐츠 프로바이더 이해 21.1.1. 콘텐츠 프로바이더 구조 21.1.2. 콘텐츠 프로바이더 작성법 21.1.3. 콘텐츠 프로바이더 이용 21.2. 구글 기본 앱의 콘텐츠 프로바이더 이용 21.2.1. 주소록 앱 데이터 획득 21.2.2. 갤러리 앱 데이터 획득 도전 과제Mission 1: 알람 앱 Mission 2: 블로그 앱 에디터 Part 08 위치 기반 서비스를 제공하자22 _ 위치 정보 획득22.1. LocationManager 이용 22.1.1. 위치 정보 제공자 22.1.2. 위치 정보 획득 22.2. Fused Location API 이용23 _ 지도 활용23.1. 지도 출력 23.1.1. 구글 지도를 위한 설정 23.1.2. 구글 지도 화면 출력 23.2. 구글 지도 제어 23.2.1. 지도 중심 위치 이동 23.2.2. GoogleMap 이벤트 처리 23.2.3. 현재 위치 표시 23.2.4. 주소와 위경도 변환 도전 과제Mission 1: 카카오택시의 출발 위치 조정 Mission 2: 구글 지도 앱 화면Part 09 서버 데이터를 활용하자24 _ 네트워크 정보 활용24.1. 다양한 네트워크 정보 활용 24.1.1. TelephonyManager 24.1.2. ConnectivityManager 24.1.3. WifiManager 24.2. XML, JSON 데이터 파싱 24.2.1. XML 파싱 24.2.2. JSON 파싱 25 _ HTTP 통신25.1. Java API를 이용한 HTTP 통신 25.2. Volley API를 이용한 HTTP 통신 25.3. Glide를 활용한 HTTP 통신26 _ 실시간 서버 푸시26.1. 소켓 프로그램 26.1.1. 소켓 프로그램 작성 방법 26.1.2. 소켓 프로그램 작성 시 주의점 26.2. Firebase 클라우드 메시지 도전 과제Mission 1: HTTP 통신을 통한 날씨 정보 제공 Part 10 다양한 기능을 제공하자27 _ 스마트폰 기능 활용27.1. SMS 송수신 27.1.1. SMS 송신 27.1.2. SMS 수신 27.2. 센서 다루기 27.2.1. 근접 센서 다루기 27.2.2. 가속도 센서 다루기 27.3. 블루투스 27.3.1. 블루투스 제어 27.3.2. 블루투스 통신 28 _ 카메라 활용28.1. SurfaceView vs TextureView 28.1.1. SurfaceView 28.1.2. TextureView 28.2. Camera API28.3. Camera2 API 28.3.1. Camera2 API 구조 28.3.2. Camera2 API 활용 29 _ 앱 위젯 개발29.1. 앱 위젯 기본 구조 29.1.1. 앱 위젯 개념 29.1.2. 앱 위젯 개발 29.2. Collection 앱 위젯 개발 29.2.1. Collection 앱 위젯 구조 29.2.2. Collection 앱 위젯 개발 30 _ 멀티미디어 활용30.1. 오디오, 비디오 재생 30.1.1. 오디오 재생 30.1.2. 비디오 재생 30.2. 음성, 영상 녹화 30.2.1. 음성 녹음 30.2.2. 영상 녹화 도전 과제Mission 1: 카메라 앱 구현 Mission 2: 날씨 정보 앱 위젯 구현Part 11 코틀린으로 안드로이드 앱을 개발하자!31 _ 안드로이드 스튜디오에서 코틀린으로 개발하기31.1. 코틀린 소개 31.2. 안드로이드 스튜디오 3에서 코틀린 개발환경 31.2.1. 안드로이드 스튜디오 2.x 31.2.2. 안드로이드 스튜디오 3 31.2.3. 코틀린 클래스 추가 31.2.4. 자바 코드를 코틀린 코드로 변환 31.3. 간단한 코드 분석으로 코틀린 이해하기 32 _ 코틀린 기초 작성법32.1. 코틀린 파일 작성 규칙 32.1.1. 패키지 정의 32.1.2. 파일로 작성 32.2. 기초 타입 32.2.1. Numbers Type 32.2.2. String 32.2.3. Characters, Booleans 32.2.4. Arrays 32.2.5. Any 32.2.6. Nullable과 Null 체크 32.2.7. 타입 체크 : is 연산자 32.3. 변수 및 함수 선언 32.3.1. 변수 선언 32.3.2. 함수 선언 32.4. 실행 흐름 제어 32.4.1. If 표현식 32.4.2. When 표현식 32.4.3. For 반복 32.4.4. While 반복33 _ 코틀린 OOP 프로그램33.1. 클래스 정의 33.1.1. 클래스 선언 및 생성 33.1.2. 생성자 33.2. 상속 33.2.1. 상속 관계 명시 33.2.2. 함수 오버라이딩 33.2.3. 변수 오버라이딩 33.3. 추상 클래스와 인터페이스 33.3.1. 추상 클래스 33.3.2. 인터페이스 33.4. 프로퍼티 33.5. 접근 제한자 33.5.1. 패키지 접근 제한 33.5.2. 클래스 접근 제한 34 _ 코틀린으로 만드는 안드로이드 앱 찾아보기