본문 바로가기

카테고리 없음

이것이 안드로이드다, 박성근의 안드로이드 앱 프로그래밍

학생들에게 안드로이드를 가르치는 입장에서 말씀드리겠습니다.저는 매 학기마다 가능하면 다른 책들을 선정해서 가르칩니다.그 이유는 제가 해당 과목에 대해 다양한 책들을 공부하기 위함도 있고, 그렇게 함으로써 책들을 서로 비교해서 좋은 책들을 찾아가고, 무엇보다 저 스스로가 한 번 한 거 다시 반복하는 거에 대해 따분해 하는 부분도 있어서입니다.대신 나쁜 책을 고르면 학생들에게 피해가 가겠죠. 그래서 서평도 보고, 무엇보다 분량이 많은 책들은 아무래도 실패할 확률이 적기 때문에 믿고 고르는 편인데요.그렇게 학기 시작하기 전인 2월에 이 책을 골랐는 데, 중간에 다른 책으로 바꾸려다, 한 학생이 책을 사는 바람에 그냥 그대로 진행했습니다. 중간 시험까지 가르친 지금의 느낌은 죄송합니다만 조금 별로인 책이라는 느낌입니다.솔직히 왜 별점이 높은지 모르겠습니다.다른 리뷰에서 장점들을 말씀하셨으니, 단점들을 지적해 보겠습니다. 글쓴 이께서 보시고 너그러이 받아주셨으면 합니다. 일단 네트워크 프로그래밍 부분이 없습니다.네트워크 프로그래밍은 별도의 쓰레드를 직접 만들어서 하거나 AsyncTask 같이 편리한 객체를 이용해서 별도의 쓰레드에서 하면 됩니다. 네트워크 프로그래밍은 많이 쓰이고 매우 중요합니다. 근데 없습니다.이 책에서 네트워크 프로그래밍은 쓰레드를 얘기할 때 잠깐 나옵니다.네트워크 프로그래밍을 별도의 쓰레드에서 하는 이유는 메인 쓰레드가 네트워크 쪽 처리를 하면 네트워크를 기다리는 시간 등으로 인해 반응 속도가 느려지기 때문입니다. 이런 중요한 점들이 언급은 되어 있습니다. 그건 좋습니다.그런데, 네트워크 프로그래밍 예제가 없거나 적어도 찾기 힘듭니다. 애니메이션 쪽도 없습니다. 뷰 애니메이션, 프로퍼티 애니메이션... 전혀 없습니다. 가벼운 게임을 만들려고 하거나 최소한 UI에서 좋은 효과를 내려면 당연히 애니메이션을 할 줄 알아야 하고, 안드로이드는 풍부한 애니메이션 객체를 편리하게 제공하는 데, 설명 없습니다.그래픽 쪽도 없습니다.이건 정말 이해가 안가는 데, 기본적인 커스텀 뷰의 그래픽 쪽이 없습니다.onDraw, invalidate 없습니다.커스텀뷰라고 커스텀 위젯 비슷하게 만드는 거 한 두 페이지 나오고 맙니다.원래 안드로이드는 에뮬레이터에서 하드웨어 가속 문제로 invalidate가 Rect 쪽이 제대로 안됩니다.이건 몇 년 전부터 이어온 고질적인 문제로, 제데로 된 결과를 보려면 스마트폰 기계에서 직접 실행해야 합니다.초보자들은 당황하게 되는 부분이죠. 그런 점도 책에서 지적해 주면서, 그래픽 쪽을 잘 보여줬으면 좋겠는 데, 내용이 전혀 없습니다. 나중에 시간이 된다면 정리해서 추가하겠지만, 제가 리뷰하는 이 책의 어떤 예제들은 학생들에게 시켜보면, 에뮬레이터에서 안돌아간다고 합니다. 그래서 폰에서 돌려보면 돌아가긴 하는 데, 그것도 완벽하게 안돌아가는 경우도 있습니다. 제대로 테스트 안해보고 학생들에게 시킨 제가 미안한 상황입니다. 이런 예제들을 왜 넣었는지도 모르겠습니다. 커스텀 뷰의 그래픽이 없으니, SurfaceVIew 는 말할 것도 없고, GLSurfaceView 도 설명이 없습니다.안드로이드에서 게임이나 반응성이 좋은 앱을 만들 사람은 애초에 보면 안되는 책인 셈입니다.뭐 유니티로 만들라고 할지 모르겠지만, 그래도 안드로이드로 기본적인 것을 이해하는 게 중요합니다. 푸쉬 쪽도 설명이 별로 없습니다. 실은 스마트폰에서는 이런 부분들이 중요합니다. 최근 안드로이드에서 중요해지는 부분들인데, 내용이 없거나 있어도 잠깐 언급하는 수준입니다.(브로드캐스트 리시버나 메신저 서비스를 다루는 부분이 있긴 합니다.)스마트폰에서 중요한 센서 쪽 내용도 없습니다.GPS, 카메라, 가속도센서, NFC 등등이쯤 되면 도대체 뭘로 그 1000 페이지를 채웠는지 궁금할 지경입니다. 게다가 멀티미디어 쪽도 거의 없습니다.동영상 플레이, 사운드 플레이...이게 뭐가 어렵다고 뺐는지 모르겠습니다. 데이터베이스를 보면 답답합니다.쿼리를 하는 데, 쿼리을 커서를 돌리면서 결과를 스트링에 계속 추가합니다.쿼리 결과가 100만 개 나오면 어떻게 할려고 하는지 궁금할 지경입니다.참고로 저는 안드로이드를 2008년부터 가르쳤는 데, 국내에서 최초의 안드로이드 책 중 하나가 에드 버넷의 "헬로 안드로이드"입니다. 이 책은 두껍지도 않습니다. 350쪽 정도입니다.그런데 에드 버넷은 진짜로 현장에서 실력을 갖춘 고급 프로그래머입니다.에드 버넷의 그 책을 보면 비슷한 코드가 나옵니다. 쿼리를 돌리면서 계속 스트링빌더에 붙이는 코드죠.그리고 나서 에드 버넷은 자기가 제시한 그 코드를 정말 무식한 코드라고 비웃습니다. 그리고 나서 어댑터를 사용하라고 하고, 그 예를 보여줍니다.참고로 국내의 안드로이드 책들을 보면 데이터베이스 쪽이 부족한 책들이 많습니다.지금 리뷰하는 이 책도 마찬가지입니다. 이른바 좋다는 다른 1000 페이지 넘는 책들이 거의 다 그렇습니다.주로 국내 저자들이 쓴 책들인데, 안드로이드의 데이터베이스 쪽을 제대로 쓴 책은 본 적이 없습니다. 제가 왜 부족하다고 하는지 이유를 설명드리겠습니다.액티비티의 startManagingCursor 같은 것들 때문입니다.이건 deprecated 되었습니다. deprecated 되었다는 말은 말 그대로 장래에 없어질지 모르니 쓰지 말라는 얘기입니다. 이유는 네트워크 프로그래밍이 별도의 쓰레드에 들어가는 이유와 동일한 데, 메인 쓰레드에서 데이터베이스 커서까지 관리하면 반응 속도가 느려지고 부담이 커지기 때문입니다.이에 대한 해결책은 CursorLoader와 LoaderManager를 사용하는 건데, 이에 대해 제대로 설명된 국내 저자가 쓴 교재를, 제가 과문해서인지, 아직까지 본 적이 없습니다.대부분 쿼리를 무식하게 가져다 붙이거나, 아예 데이터베이스 예제 자체를 허접한 것들만 보여주고 끝냅니다. 국내 번역서 중에서 그나마 유일하게 CursorLoader와 LoaderManager를 다루는 책이 빌 필립스의 "실무에서 바로 적용하는 안드로이드 프로그래밍"입니다. 그나마 예제 없이 설명만 하고 끝냅니다.안드로이드에서 쓰레드 쪽으로 책을 쓰실 분들에게 한가지 커멘트를 하고 싶습니다.Effective Java 라는 책은 자바를 중급 수준으로라도 실력을 올리고 싶은 사람은 꼭 봐야 할 책입니다. 물론 읽으셨겠지만, 혹시 안읽으셨으면 꼭 보시기 바랍니다. Effective Java 책을 보면 쓰레드를 직접 만들지 말고 ExecutorService를 쓰라고 지적합니다.안드로이드도 ExecutorService가 있는 거 같은 데, 책을 쓰실 때 이런 점들도 지적해 주셨으면 합니다. 

저자는 2010년부터 안드로이드 프레임워크 분석과 앱 개발을 병행했고 사내 강사로 활약했다. 그간의 저자의 경험을 녹여낸 이 책은 무작정 암기하지 않아도 자연스럽게 고급 정보를 익힐 수 있어 실무에 강한 전문가로 여러분을 이끌어 줄 것이다. 무료 동영상 강의, 강의용 PPT, 온라인 카페를 통한 Q&A를 제공한다.

1장. 시작하기
1.1 안드로이드 역사
1.2 안드로이드 릴리즈 정보
1.3 안드로이드 구성 및 특징
1.4 안드로이드 구조
1.5 마치며

2장. 전문가가 추천하는 최적의 개발 환경 구축하기
2.1 첫 관문: PC 사양 체크
2.2 앱 개발 과정
2.3 JDK 설치
2.4 안드로이드 SDK 설치
2.5 이클립스 IDE 설치
2.6 이클립스 플러그인 ADT 설치
2.7 안드로이드 개발 환경 간편 구축
2.8 가상 단말기 실행하기
2.9 에뮬레이터에 앱 설치 및 실행하기
2.10 편리한 이클립스 환경 설정하기
2.11 마치며

3장. 나의 첫 안드로이드 앱 만들기
3.1 새로운 안드로이드 프로젝트 생성
3.2 생성된 프로젝트 구조 이해하기
3.3 마치며

4장. 레이아웃의 구성 요소 View 와 ViewGroup
4.1 뷰와 뷰그룹
4.2 화면 배치 정보 LayoutParams
4.3 마치며

5장. 대표적인 뷰그룹
5.1 LinearLayout과 LayoutParams
5.2 RelativeLayout과 LayoutParams
5.3 FrameLayout과 LayoutParams
5.4 AbsoluteLayout과 LayoutParams
5.5 TableLayout, TableRow와 LayoutParams
5.6 GridLayout과 LayoutParams
5.7 뷰그룹 한눈에 비교하기
5.8 마치며

6장. 대표적인 뷰
6.1 대표 뷰 5가지
6.2 최상위 뷰
6.3 텍스트뷰
6.4 에디트텍스트
6.5 버튼
6.6 이미지뷰
6.7 마치며

7장. 자바로 레이아웃 구성하기
7.1 화면은 어떻게 구성될까?
7.2 XML 레이아웃 리소스로 콘텐트 영역 채우기
7.3 자바 소스로 콘텐트 영역 채우기
7.4 마치며

8장. 이벤트
8.1 터치 이벤트
8.2 키 이벤트
8.3 마치며

9장. 리소스
9.1 Values 리소스
9.2 Drawable 리소스
9.3 색상 상태 리스트 리소스
9.4 레이아웃 리소스
9.5 raw 리소스와 에셋
9.6 리소스 퀄리파이어
9.7 마치며

10장. 액티비티 실행과 인텐트
10.1 인텐트: 액티비티 실행의 매개체
10.2 직렬화 객체 인텐트
10.3 인텐트
10.4 마치며

11장. 액티비티 생명주기
11.1 액티비티 생명주기 함수
11.2 액티비티 상태에 따라 호출되는 생명주기 함수
11.3 액티비티 데이터 복원
11.4 한눈에 보는 액티비티의 생명주기
11.5 마치며

12장. 태스크
12.1 액티비티 태스크
12.2 새로운 태스크 생성
12.3 액티비티 실행 모드
12.4 태스크 내 액티비티 정리 및 변경
12.5 마치며

13장. 액티비티 간 데이터 주고받기
13.1 실행되는 액티비티에 데이터 전달하기
13.2 실행된 액티비티가 실행한 액티비티에 인텐트 전달
13.3 액티비티 간 데이터를 주고받을 때의 제약사항
13.4 마치며

14장. 안드로이드 프로세스와 스레드
14.1 스레드란?
14.2 메인 스레드와 작업 스레드
14.3 안드로이드 메인 스레드 구조
14.4 편리한 헬퍼 클래스들
14.5 마치며

15장. 브로드캐스트 리시버
15.1 방송과 브로드캐스트 리시버
15.2 리시버 호출 순서와 우선순위
15.3 원하는 패키지의 리시버에만 방송하기
15.4 시스템이 발송하는 방송
15.5 마치며

16장. 파일과 데이터베이스
16.1 파일
16.2 데이터베이스
16.3 마치며

17장. 콘텐트 프로바이더
17.1 콘텐트 프로바이더
17.2 DB 외의 데이터를 제공하는 프로바이더
17.3 콘텐트 리졸버의 안전한 사용
17.4 마치며

18장. 서비스
18.1 서비스의 필요성
18.2 스타티드 서비스와 바운드 서비스
18.3 스타티드 서비스
18.4 바운드 서비스
18.5 내부 바운드 서비스
18.6 인텐트 서비스와 메신저를 이용한 서비스
18.7 단말기에서 실행 중인 서비스 정보 보기
18.8 마치며

19장. 애플리케이션 객체
19.1 애플리케이션 객체
19.2 애플리케이션 객체를 이용한 컴포넌트 간 데이터 공유
19.3 애플리케이션의 액티비티 생명주기 콜백 인터페이스
19.4 마치며

20장. 제한된 화면 크기를 극복하기 위한 뷰그룹
20.1 스크롤뷰
20.2 어댑터뷰
20.3 BaseAdapter를 이용한 리스트뷰
20.4 BaseAdapter에서 파생된 어댑터
20.5 리스트뷰
20.6 스피너
20.7 마치며

21장. 윈도우
21.1 윈도우에 대해
21.2 액티비티 윈도우
21.3 다이얼로그 윈도우
21.4 편리한 다이얼로그 파생 클래스
21.5 메뉴 윈도우
21.6 팝업 윈도우
21.7 토스트 윈도우
21.8 마치며