본문 바로가기

오탈자 정보

[실무에 바로 적용하는 안드로이드 프로그래밍]_오탈자

현재까지 발견된 위 책의 오탈자 정보와 오류 사항 그리고 보다 매끄러운 문장을 위해 수정한 내용들입니다. 불편을 끼쳐드려 죄송합니다.


혹시 이 외의 오탈자 정보를 발견하시는 분이 계시면 출판사 메일 jeipub골뱅이gmail.com이나 역자 메일 jcspro골뱅이hanafos.com으로 연락주시면고맙겠습니다.



최종수정일자: 2015년 1월 13일

2쇄본 오탈자


아래의 오탈자 사항은 추후 3쇄 시에는 모두 반영하도록 하겠습니다. 번역과 편집 시에 미처 확인을 하지 못해 불편을 끼쳐드려 다시 한 번 죄송하다는 말씀을 드립니다. 아래에 (역자 제공)으로 표시한 것들은 책이 출간되자마자 역자이신 심재철 님께서 책 전체를 재검토하여 보내주신 것들입니다. 출간 전 교정 작업을 다른 책에 비해 더 많이 했음에도 불구하고 오류 사항이 제법 발견되어 송구스럽습니다. 독자 여러분들의 양해를 구합니다. 


125쪽 리스트 본문 4번째 문단(독자 님 제공)

자식 액티비티가 setResult(...)를 호출할 필요가 없을 때도 있다. 만일 결과 코드와 인텐트의 데이터 수신을 구분할 필요가 없다면, 운영체제가 디폴트 결과 코드를 전달하게 놔두면 된다.

==>

자식 액티비티에서는 setResult(...)를 호출하지 않을 수도 있다. 만일 어떤 결과 코드인지 구분할 필요가 없거나 인텐트의 데이터를 받을 필요가 없다면, 운영체제가 디폴트 결과 코드를 전달하게 놔두면 된다.


206쪽 리스트 9.3에서 8번째 줄(독자 님 제공)

c.setSolved(I % 2 == 0); --> c.setSolved(i % 2 == 0);


308쪽 '리소스 지역화하기' 절 두 번째 문단 두 번째 줄(이*운 님 제공)

(한국어는 -kr이다). ==> (한국어는 -ko다). 


433쪽 본문 두 번째 줄(WJK 님 제공)

버전에서는 그 메서드들을 ==>  버전에서는 그 메서드들을


433쪽 본문 끝에 다음의 내용을 추가(역자 제공)

안드로이드는 첫 번째 형태에 가깝다. 신 버전 SDK에서 구 버전 SDK와의 호환성을 유지한다. 즉, deprecated된 API 메서드일지라도 제거되지 않는다는 의미다. 따라서 그런 메서드를 사용해도 가능하지만, 만일 사용하면 deprecation 경고 메시지가 나타난다. 그럴 때는 426페이지의 리스트 20.16처럼 @SuppressWarnings("deprecation") 주석을 사용해서 경고 메시지를 나타나지 않게 할 수 있다. 그러나 꼭 필요하지 않다면 deprecated된 API 메서드를 사용하지 않는 것이 바람직하다.


484쪽 마지막 문단 3-5행(WJK 님 제공)

스택의 제일 위에 있는 액티비티를 기본 액티비티(base activity)라고 하며, 그것이 어떤 액티비티이건 사용자가 현재 화면에 보는 액티비티가 된다.

==>
스택의 제일 밑에 있는 액티비티를 기본 액티비티(base activity)라고 하며, 제일 위에 있는 액티비티가 현재 화면에서 사용자가 보는 액티비티가 된다.

496쪽 리스트 24.1 1행(WJK 님 제공)
extends Activity SingleFragmentActivity ==> extends Activity SingleFragmentActivity 

498쪽 코드 위에서 8-10행(WJK 님 제공) 
android:layout_weight="1"
android:layout_margin="15dp"
android:background="#555555"
==>
android:layout_weight="1"
android:background="#555555"


515쪽 본문 두 번째 문단 2행(WJK 님 제공) 
botton_text_color.xml로 주고
==>
button_text_color.xml로 주고

537쪽, 538쪽, 542쪽, 574쪽, 599쪽에서(WJK 님 제공)
플리커 사이트의 URL 정책 변경으로 인한 수정 내용입니다.
아래의 행에서 모두 다음과 같이 변경해야 합니다. 
http:// ==> https:// 

537쪽의 위에서 일곱 번째 줄과 밑에서 두 번째 줄, 
538쪽 리스트 26.7의 위에서 세 번째 줄,
542쪽 리스트 26.11의 위에서 세 번째 줄,
574쪽 리스트 28.1의 위에서 세 번째 줄,
599쪽 리스트 29.6의 위에서 다섯 번째 줄

567쪽 리스트 27.7의 6-7행(WJK 님 제공)
두 행 모두에 <ImageView> 제네릭 타입을 추가해야 합
mThumbnailThread = new ThumbnailDownloader();
mThumbnailThread = new ThumbnailDownloader(new Handler());
==>
mThumbnailThread = new ThumbnailDownloader<ImageView>();
mThumbnailThread = new ThumbnailDownloader<ImageView>(new Handler());



최종수정일자: 2014년 1월 13일

1쇄본 오탈자


아래의 오탈자 사항은 추후 2쇄 시에는 모두 반영하도록 하겠습니다. 번역과 편집 시에 미처 확인을 하지 못해 불편을 끼쳐드려 다시 한 번 죄송하다는 말씀을 드립니다. 아래에 (역자 제공)으로 표시한 것들은 책이 출간되자마자 역자이신 심재철 님께서 책 전체를 재검토하여 보내주신 것들입니다. 출간 전 교정 작업을 다른 책에 비해 더 많이 했음에도 불구하고 오류 사항이 제법 발견되어 송구스럽습니다. 독자 여러분들의 양해를 구합니다. 



213쪽 리스트 9.12 소스 1행(신*창 님 제공)

public class CrimeActivity extends FragmentActivity SingleFragmentActivity {

==>

public class CrimeActivity extends FragmentActivity SingleFragmentActivity {


26쪽 상단 소스 네 번째 주석문(역자 제공)

// Does nothing yet, but soon! ==> // 아직은 아무 일도 하지 않지만 곧 코드가 추가된다!


29쪽 리스트 1.13 바로 아래 문장에서(김*민 님 제공)

makeText(…)에서는 Context 인자로 QuizActivity의 인스턴스를 전달한다. 여기서 new View.OnClickListener() {…}는 익명의 내부 클래스를 정의하고 그것의 인스턴스를 생성한다는 의미다. 따라서 QuizActivity.this의 this는 View.OnClickListener의 인스턴스를 참조한다.

==>

여기서 new View.OnClickListener() {…}는 익명의 내부 클래스를 정의하고 그것의 인스턴스를 생성한다는 의미다. 그리고 makeText(…)에서는 Context 인자로 QuizActivity의 인스턴스를 전달한다. 그러나 이때 단순히 this만 전달하면 안 된다. QuizActivity.this라고 해야 한다. this는 내부 클래스인 View.OnClickListener의 인스턴스를 참조하는 것이기 때문이다.


56쪽 그림 2.7 아래 본문 두 줄 위치 변경(역자 제공)

(위치 변경) 그림 2.7 아래의 본문 두 줄을 그림 2.7 위로 변경


56쪽 그림 2.7 교체(역자 제공)

(1쇄에는 안드로이드 버전이 4.3으로 되어 있는데, 4.4로 변경)



59쪽 '챌린지'절 마지막 문단에서(역자 제공)

오른쪽 버튼을 클릭하면, 새로운 ==> 오른쪽 버튼을 클릭하고 Paste를 선택하면 새로운


68쪽 그림 3.3 그림 교체(역자 제공)

(그림에서 우측 하단 영역에 Console 부분이 없어야 함)



69쪽 그림 3.4 그림 교체(역자 제공)

(그림에서 우측 하단 영역에 Console 부분이 없어야 함)



84쪽 그림 3.17에서 메서드 이름 수정(역자 제공)

 로그 레벨

 메서드

 ==>

 로그 레벨

 메서드

 ERROR

 Log.e(...)

 ==>

 ERROR

 Log.e(...)

 WARNING

 Log.e(...)

 ==>

 WARNING

 Log.w(...)

 INFO

 Log.e(...)

 ==>

 INFO

 Log.i(...)

 DEBUG

 Log.e(...)

 ==>

  DEBUG

 Log.d(...)

 VERBOSE

 Log.e(...)

 ==>

 VERBOSE

 Log.v(...)


88쪽 위에서 첫 번째 줄에서(역자 제공)

디폴트 페스펙티브는 ==> 디폴트 퍼스펙티브는


92쪽 리스트 4.3 코드 4행에서(빈행 포함)(역자 제공)

public void ==> private void


93쪽 리스트 4.4 코드 5행에서(빈행 포함)(역자 제공)

public void ==> private void


94쪽 그림 4.6 교체(역자 제공)

(그림 안 코드 수정)


136쪽 본문 두 번째 문단에서(역자 제공)

장치의 절반 이상이 여전히 ==> 장치의 30% 정도가 여전히


152쪽 본문 마지막 문단 두 번째 줄에서(역자 제공)

더욱 확실하기 알게 ==> 더욱 확실하게 알게


162쪽 그림 7.11에서 중단(Stopped) 우측 아래 메서드 수정(역자 제공)

onStop ==> onStop()


176쪽 그림 7.18에서 중단(Stopped) 우측 아래 메서드 수정(역자 제공)

onStop ==> onStop()


213쪽 리스트 9.12 두 번째 주석문 수정(한글로 번역하고 취소선 삽입)(역자 제공)

/** Called when the activity is first created. */

==>

/** 이 액티비티가 최초 생성될 때 호출된다. */


242쪽-243쪽 코드의 들여쓰기 수정(역자 제공)

    public void onListItemClick(ListView l, View v, int position, long id) {

    // 어댑터로부터 Crime 객체를 받는다.

    Crime c = ((CrimeAdapter)getListAdapter()).getItem(position);

    Log.d(TAG, c.getTitle() + " was clicked");

    // CrimeActivity를 시작시킨다.

    Intent i = new Intent(getActivity(), CrimeActivity.class);


    startActivityForResult(i, REQUEST_CRIME);

}

    @Override

    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == REQUEST_CRIME) {

            // 결과 값을 처리한다.

        }

    }

}


==>


    public void onListItemClick(ListView l, View v, int position, long id) {

        // 어댑터로부터 Crime 객체를 받는다.

        Crime c = ((CrimeAdapter)getListAdapter()).getItem(position);

        Log.d(TAG, c.getTitle() + " was clicked");

        // CrimeActivity를 시작시킨다.

        Intent i = new Intent(getActivity(), CrimeActivity.class);


        startActivityForResult(i, REQUEST_CRIME);

    }

    @Override

    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == REQUEST_CRIME) {

            // 결과 값을 처리한다.

        }

    }

}


314쪽 '비호환의 디렉터리들을 제외시키기' 절의 두 번째 문단에서(역자 제공)

만일 장치를 가로 방향(potrait)으로 ==> 만일 장치를 세로 방향으로


383쪽 우측 하단 페이지 번호 옆의 절 제목(역자 제공)

챌린지: ActionBarSherlock 사용하기 ==> (삭제되어야 함)


416쪽 리스트 20.7의 하단 부분 주석문 삭제(역자 제공)

    } else if (requestCode == REQUEST_PHOTO) {

        // 새로운 사진(Photo) 객체를 생성하고 그것을 범죄(crime) 데이터에 첨부한다.

        String filename = data

==>

    } else if (requestCode == REQUEST_PHOTO) {

        String filename = data


419쪽 리스트 20.10 들여쓰기 및 일부 볼드체로 수정(역자 제공)

            updateDate();

        } else if (requestCode == REQUEST_PHOTO) {

        // 새로운 사진(Photo) 객체를 생성하고 그것을 범죄(crime) 데이터에 첨부한다.

        String filename = data

            .getStringExtra(CrimeCameraFragment.EXTRA_PHOTO_FILENAME);

        if (filename != null) {

            Log.i(TAG, "filename: " + filename);


            Photo p = new Photo(filename);

            mCrime.setPhoto(p);

            Log.i(TAG, "Crime: " + mCrime.getTitle() + " has a photo");

        }

    }

}

==>

            updateDate();

        } else if (requestCode == REQUEST_PHOTO) {

            // 새로운 사진(Photo) 객체를 생성하고 그것을 범죄(crime) 데이터에 첨부한다.

            String filename = data

                .getStringExtra(CrimeCameraFragment.EXTRA_PHOTO_FILENAME);

            if (filename != null) {

                Log.i(TAG, "filename: " + filename);


                Photo p = new Photo(filename);

                mCrime.setPhoto(p);

                Log.i(TAG, "Crime: " + mCrime.getTitle() + " has a photo");

            }

        }

}


440쪽 상단 코드 한글화(역자 제공)

<string name="crime_report">%1$s! The crime was discovered on %2$s. %3$s, and %4$s

==>

<string name="crime_report">%1$s! 이 범죄가 발견된 날짜는 %2$s. %3$s, and %4$s


567쪽 리스트 22.7 10번째 줄(빈행 포함)(역자 제공)
mThumbnailThread = new ThumbnailDownloader<ImageView>(new Handler());

==>

mThumbnailThread.setListener(new ThumbnailDownloader.Listener<ImageView>() {


668쪽 그림 33.1 교체(역자 제공)

(Compile With 부분이 Google APIs (Google Inc.) (API 19)로 되어야 함)


669쪽 그림 33.2 제목 수정(역자 제공)

SDK 4.3의 구글 API 설치하기 ==> SDK 4.4의 구글 API 설치하기


705쪽 소소 코드 하단 5줄 볼드체 제거(빈행 포함)(역자 제공)

    private static class RunCursorAdapter extends CursorAdapter {


        private RunCursor mRunCursor;


        ...

==>

    private static class RunCursorAdapter extends CursorAdapter {


        private RunCursor mRunCursor;


        ...







  • 강영준 2014.03.11 14:51

    76페이지에 221페이지가 있으며 76페이지는 누락되었음.

    • 아. 죄송합니다. 말씀하신 것으로 봐서 그 책은 제본상 실수로 인한 파본인 것 같습니다. 다른 책을 확인해봤는데 사무실에 있는 책들은 이상이 없네요. 구매한 곳에서 반품을 요청하시면 교환이 가능할 것 같은데, 혹시 교환이 안 된다면 출판사로 다시 연락주시길 바랍니다.

  • 독자 2014.07.16 21:30

    오타는 그렇다 치고, 번역 자체가 틀린게 많아요...
    여기 있는 것 말고도 수두룩합니다. 이 좋은 책을 왜 이렇게 번역을 해놨는지...
    29쪽의 굉장히 중요한 부분의 잘못된 번역을 보고 역자에 대해 의심을 하고 이해가 안가는 부분을 원서를 보면서 살펴봤는데 잘못 번역된 부분이 너무 많습니다. 역자가 개발자가 맞는지도 의심스럽습니다.
    특히 랜드스케이프 모드 레이아웃을 풍경레이아웃으로 번역해 놓은거보고 기절할 뻔했습니다.

    • 안녕하세요?
      위의 오탈자 사항은 2쇄(2014년 3월 20일 발행)에서는 모두 반영하여 인쇄되었고, 현재는 2쇄가 판매 중임을 먼저 알려드리고요.
      말씀하신 랜드스케이프(landscape)나 포트레이트(portrait) 모드는 보통 랜드스케이프 모드, 포트레이트 모드 혹은 가로 모드, 세로 모드 형태로 번역을 하고 있으나, 원 의미상으로는 풍경 모드, 초상 모드가 맞겠죠. 그러나 음차를 하거나 풍경, 초상으로 쓰면 곧바로 이해가 안 되니 보통 가로 모드, 세로 모드로 표현하는 것 같습니다.

      역자분도 이 사실을 모르고 있는 게 아니라, 원 의미를 알려주자는 취지로 그렇게 표현한 것으로 알고 있습니다. 그리고 처음에 그 단어가 나올 때 영어 단어를 괄호 안에 병기 해주고, 그 옆에 가로방향, 세로방향도 함께 언급하고 있습니다.

      평소에 쓰지 않는 단어라 오해하실 수도 있겠지만, 양해를 부탁드리겠습니다.

    • 심재철(역자) 2014.07.18 05:41

      안녕하세요? 이 책의 역자입니다.

      아시다시피 Landscape은 스마트 폰이나 태블릿 등의
      안드로이드 장치를 길이가 긴 쪽으로 눕혔을 때를 말하죠. 즉, 가로 방향입니다. 제가 이 용어를 번역할 때 고심을 했습니다만,
      원어의 의미 그대로 풍경이라는 직관적인 표현을 사용하는 것이
      좋겠다고 생각하여 그리 나타낸 것입니다. 사진이나 미술 분야, 아니
      일상적인 생활에서 길이가 긴쪽으로 눕힌 가로 방향은 풍경,
      세워놓은 세로 방향은 초상(또는 인물)으로 많이 사용합니다.
      영어에서도 실제 그런 의미를 갖고 있고 모든 사람들이 이해합니다.

      또한 풍경이라는 용어가 많이 나오지는 않습니다만,
      혹시 이 용어를 오해하실 분들이 있을까봐
      풍경(가로) 이런 형태로 추가 해 두었으며,
      용어 선정을 함부로 한 것이 아니라는 것을 말씀드리고 싶습니다.

      그리고 29쪽의 내부 클래스 설명 부분은 이미 오타 수정 내역에
      나와 있습니다. 자바에서 익명의 내부 클래스를 정의하는 것에
      대해 친숙하지 않은 분들이 혹시나 있을까봐 부연 설명을 하는
      부분인데 제가 실수로 잘못 표현한 것 입니다. 1판을 구입하신 분들은
      오타 수정 내역을 참조하시기를 부탁드립니다. 2판에서는
      수정이 되어 있습니다.

      또한 죄송한 말씀입니다만, 문의는 실명으로 해 주셨으면
      감사하겠습니다. 이 책은 제가 최선을 다해서 번역한 책 입니다.
      단순히 원본만을 직역한 책이 절대 아닙니다.
      많은 노력과 정성이 담긴 책 입니다. 혹시 번역이 잘못된 부분이
      또 있으면 구체적으로 알려주시면 감사하겠습니다.
      독자분들께 도움이 될 수 있도록 즉시 바로 잡겠습니다.
      오늘도 좋은 하루 되십시오!

  • 독자 2014.07.18 10:18

    생각나는 것 몇가지 빠르게...

    1. 풍경레이아웃
    이 부분은 잘못된 번역이라는 걸 말하기 위함 보다 그 외에 이런것도있었다 정도의 의미로 끝에 붙인 말입니다.(ps.정도)
    처음에 (가로모드)라고 표기를 해서 괜찮다고 하는데, 독자들은 이 책을 처음부터 본다는 가정이 없습니다. 이미 앞 부분은 쉬운부분이기때문에 뒷쪽의 내용이 필요해서 보는 사람들도 많을 것입니다.저도 뒷쪽의 내용이 필요했습니다만 이 책이 예전부터 아마존의 베스트 셀러기 때문에 처음부터 본 것입니다.


    2. 29쪽 내부 클래스
    역자는 이 부분이 내부클래스에 익숙하지 않은 독자들을 위해 번역과 별개로 부연설명을 하는 부분이라고 하는데, 원문에 그대로 나와있는 부분입니다.

    3. 117쪽 하단
    Context 객체는 Class 객체를 찾을 수 있는 패키지를 ActivityManager에게 알려준다.
    -> 그대로 직역하면 더 이해하기 쉬울것을 의역을 한것인지 부드럽고 자연스럽게 번역을 하려고한건지 도무지 무슨 말인지 이해를 못하겠습니다.(이게 무슨 뜻인가요?)

    4.125쪽 중간
    자식 액티비티가 setResult(…)를 호출할 필요가 없을 때도 있다.만일 결과 코드와 인텐트의 데이터 수신을 구분할 필요가 업다면,운영체제가 디폴트 결과 코드를 전달하게 놔두면된다.
    -> 변역이 틀렸습니다.

    • 심재철(역자) 2014.07.18 12:42

      문의하신 내용을 간략하게 답변드리겠습니다.

      2번에서, 익명의 내부 클래스는 자바를 알고 있는 분 중에서도
      정확하게 그 의미를 모르는 분들이 많더군요. 그동안 제가 자바
      강의를 많이 하면서 느꼈던 사항입니다. 그래서 실은 이 부분을
      별도로 제가 더 추가하려고 했지만 이 책의 흐름을 방해할까봐
      참았습니다.

      3번의 경우는 아무 문제가 없는데 무엇이 이해가 안 되시는지
      잘 모르겠습니다. 그 말 그대로 현재의 주어진 컨텍스트에서
      Class 객체를 찾을 수 있게 알려준다는 것입니다만.....

      4번에서는 첫 번째 줄을 얘기하시는 것 같군요. 문단 전체적으로
      잘못된 내용은 없구요, 맨 앞 줄만 이렇게 다듬는 게 좋겠습니다.

      " 자식 액티비티에서는 setResult(...)를 호출하지 않을 수도 있다.
      만일 어떤 결과 코드인지 구분할 필요가 없거나 또는 인텐트의
      데이터를 받을 필요가 없다면, 운영체제가 디폴트 결과 코드를
      전달하게 놔두면 된다."

      이 부분은 독자님이 지적해 주신 오탈자로 등록하도록 하겠습니다.
      많은 관심가져 주셔서 감사드립니다.^^

  • WJK 2014.07.29 04:58

    399 페이지 중앙 부분:

    카메라 체크하는 부분 코드가 원서와 다릅니다. (하단 첨부 참조)
    그리고 두 식의 의미는 차이가 있는 것 같습니다.
    번역서에서는 GINGERBREAD 미만이기만하면 무조건 참이 나옵니다.


    <번역본>
    boolean hasACamera = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) ||
    pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT) ||
    Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD ||
    Camera.getNumberOfCameras() > 0;

    <원서>
    boolean hasACamera = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) ||
    pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT) ||
    (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD &&
    Camera.getNumberOfCameras() > 0);

    • 심재철(역자) 2014.07.29 18:49

      안녕하세요? 역자입니다.
      문의하신 내용에 답변드립니다.

      제가 이 책을 번역할 때 원서에는 많은 오탈자와 오류가 있었습니다.
      본문의 내용이 틀린 것들이 있고 소스 코드에도 오류가 있었죠.
      그런 것들을 제가 직접 확인하여 수정한 것도 있지만
      이 책을 출판한 Big Nerd Ranch에서 포럼의 ERRATA로
      수정해서 올린 내용도 있습니다.

      1차 원고 작성 후에 그것들 모두를 제가 일일이 확인해서
      수정한 후 번역본을 출간한 것 입니다.
      따라서 독자 여러분께서는 원서에서 여러 오류가 수정된
      내용을 보시는 셈입니다. 요즘 인쇄된 원서에서는 그것들이
      수정되었는지 모르겠습니다만...

      문의하신 내용에 대해 결론부터 말씀드리면 이렇습니다.

      스마트폰이나 태블릿 등의 안드로이드 기기에는 대개
      두 개(또는 한 개)의 카메라 하드웨어가 달려 있습니다.
      전면과 후면 카메라죠. 그러나 경우에 따라서는 하나도 없는
      기기가 있을 수도 있죠. 그래서 혹시나 카메라가 아예 없는
      기기에서 우리 앱을 실행할 때는 그림 19.7 화면 왼쪽 위에 있는
      카메라 이미지 버튼이 동작되지 않도록 하기 위해서
      소스 코드에 그 내용이 필요한 것 입니다.

      그러나 우리 앱을 에뮬레이터에서 실행할 때도
      카메라가 없는 것으로 인식되어 그 버튼을 테스트 할 수 없기
      때문에 번역본 코드처럼 수정한 것입니다.
      (제일 끝의 &&(AND) 대신 ||(OR).)

      단, 에뮬레이터(AVD)를 생성할 때 어떤 장치를 선택하느냐 및
      전면과 후면 카메라를 지정하느냐 여부에 따라 인식 여부가
      달라질 수는 있습니다.

      그리고 에뮬레이터에서 테스트 할 때는 진저브레드 버전의 확인은
      큰 의미가 없습니다. 따라서 번역본 코드 그대로 하시면 됩니다.
      실제 장치에서는 진저브레드 버전부터 카메라가 있을 수 있어서 실제 카메라 개수와 함께 확인이 필요할 수는 있습니다만...

      코드 제일 끝에서 Camera.getNumberOfCameras() 메서드는
      기기의 카메라 개수를 정수 값으로 반환합니다. 없으면 0 이죠.
      (참고로, Camera 클래스는 android.hardware 패키지에 있는
      것을 사용합니다. android.graphics 패키지의 Camera 클래스가
      아닙니다.)

      그리고 문의하신 글에 알려주신 원서 코드는 최초 출간된 원서의
      것과 다르군요. 아마 요즘 인쇄된 원서는 오류가 수정된 것 같습니다.

      참고로, 최초 출간된 원서의 오류 코드는 다음과 같았습니다.

      if(!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) &&
      !pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)) {
      mPhotoButton.setEnabled(false);
      }

      문의 감사합니다. 건투(?)를 빕니다!!

  • WJK 2014.07.29 18:47

    답변 감사드립니다.
    사실 각각의 코드 의미는 알고 있습니다.

    다음 개정쇄를 내실 때는 최신 원서(원서의 개정쇄)를 구입하셔서 자체적으로 수정하셨던 부분을 비교해봐도 좋을 것 같습니다.








    • 심재철(역자) 2014.07.29 21:00

      앞에서 말씀드렸듯이 최근에 출간된 원서에서 오류 수정된 내용은
      Big Nerd Ranch 포럼의 ERRATA에 있는 내용을 반영한 것 입니다.
      아마도 그 외에 더 추가된 것은 없을 것 입니다.
      번역본에는 이미 그 내용이 반영되어 있으며,
      제가 추가로 바로 잡은 부분도 있습니다.

      그리고 말씀하신대로 최근에 출간된 원서를 구해서 살펴보도록
      하겠습니다. 감사합니다.^^

  • WJK 2014.07.30 03:12

    일단 답변은 빨리 주시네요.
    그러지 않는 저자들도 많습니다. ^^

    그건 그렇고 p433에서 '... 곧 없어질 것이므로 구 버전에서는 그 메서드들을...'에서 '신 버전에서는'이 문맥상 맞지 않나요?

    • 심재철(역자) 2014.07.30 07:56

      아, 네. 말씀하신대로
      -----------------------------------------------------------
      433페이지의 "구 버전"을 "신 버전"으로 바꾸는 것이 좋겠습니다.
      -----------------------------------------------------------
      좋은 지적 감사드립니다.

      그리고 같은 페이지 제일 끝 부분에 다음 내용을 추가하면
      좋겠습니다.
      --------------------------------------------------------------
      안드로이드는 첫 번째 형태에 가깝다. 신 버전 SDK에서
      구 버전 SDK와의 호환성을 유지한다. 즉 deprecated된
      API 메서드일지라도 제거되지 않는다는 의미다. 따라서
      그런 메서드를 사용해도 가능하지만, 만일 사용하면
      deprecation 경고 메시지가 나타난다. 그럴 때는 426페이지의
      리스트 20.16처럼 @SuppressWarnings("deprecation";)
      주석을 사용해서 경고 메시지를 나타나지 않게 할 수 있다.

      그러나 꼭 필요하지않다면 deprecated된 API 메서드를
      사용하지 않는 것이 바람직하다.
      --------------------------------------------------------------

      이 두 가지 내용은 오탈자에 추가하도록 하겠습니다.
      (첫 번째 내용은 WJK님, 두 번째 내용은 역자 명의로 오탈자에
      추가해 주세요.)

  • WJK 2014.08.01 03:53

    484쪽 하단 부분 번역 오류입니다.
    여러 번 읽어도 뭔가 앞뒤가 안맞아서 원문 찾아봤습니다.
    일단 가장 '위'가 아닌 가장 '바닥'에 있는 액티비티가 base activity입니다.

    The activity at the bottom of the stack is called the base activity,
    --> 스택의 가장 바닥에 있는 activity를 base activity라 한다.

    and whatever activity is on top (of the stack) is the activity that the user sees.
    --> (스택의) 가장 위에 있는 activity (그것이 무엇이든 간에; base activity일 수도 있고, 그 위에 다른 activity가 놓여져 있을 수도 있음)가 사용자가 보는 activity이다.

    가장 바닥에 있는 base activity 상태에서 Back 버튼을 눌러야 홈 화면으로 돌아갑니다.

    태스크와 back 스택에 관한 정석은 아래 링크 참조
    http://developer.android.com/guide/components/tasks-and-back-stack.html

    수고하세요.

    • 심재철(역자) 2014.08.01 07:06

      네, 484쪽 밑의 4번째 줄에서 다음 두 가지를 수정하면 되겠습니다.

      "제일 위" -> "제일 밑",
      "그것이 어떤 액티비티이건" -> "제일 위에 있는 액티비티가"

      좋은 지적 감사드립니다.

  • WJK 2014.08.20 00:09

    496쪽 중앙에 'extends Activity SingleFragmentActivity'라고 나오는데 가운데 있는 Activity는 불필요합니다.
    498쪽 상단에 'android:layout_margin="15dp"' 부분은 505페이지 그림24.4처럼 나오려면 삭제되어야 합니다.

    • 심재철(역자) 2014.08.20 06:53

      네, 지적해 주신대로

      496쪽 리스트 24.1의 첫 번째 줄에서 Activity에 취소선을 추가하는 것이 맞습니다. 편집시 누락되었군요.

      498쪽 위에서 9번째 줄인
      android:layout_margin="15dp"는 삭제하는 것이 맞습니다.
      원서 인쇄본에 오류가 있었군요.

      다운로드해서 참고하시라고 제공해 드린 소스 코드에는
      이상 없이 위의 두 가지 모두 반영이 되어 있습니다.

      많은 분들이 애를 쓰셔서 더욱 더 좋은 책이 되는 것 같습니다.
      좋은 지적 다시 한 번 감사드립니다.
      활기찬 좋은 하루 되세요!!

    • WJK님! 저희 출판사로 전화나 메일 주실 수 있을까요?
      070-8201-9010이나 jeipub@gmail.com으로 꼭 부탁드립니다.

  • WJK 2014.08.23 11:00

    515쪽 중앙에 botton_text_color.xml 은 button_text_color.xml의 오타같습니다.

    • 심재철(역자) 2014.08.23 23:04

      아, 네.
      말씀하신 대로 button_text_color.xml이 맞습니다.
      bo가 아니라 bu 입니다.
      감사합니다.^^

  • WJK 2014.09.02 23:30

    538쪽 상단에 ... ENDPOINT = http://api.flickr.com/... 에서 http를 https로 수정 필요합니다.
    이건 책 오타라기 보다 flickr가 책 출판 후 https로 변경했기 때문입니다.

    (HttpURLConnection은 HttpsURLConnection으로 바꾸나 안바꾸나 차이가 없네요.)

    • 심재철(역자) 2014.09.03 07:02

      네, 말씀하신 게 맞습니다.
      책 발간 이후에 플리커 사이트에서 사진 라이브러리 접속을
      https로 변경했군요. 책의 오류는 아니지만 독자분들께서는
      종단점(endpoint)의 url에서 http를 https로
      변경해서 보시면 될 것 같습니다.

      해당되는 페이지는,

      537쪽의 위에서 일곱 번째 줄과 밑에서 두 번째 줄,
      538쪽 리스트 26.7의 위에서 세 번째 줄,
      542쪽 리스트26.11의 위에서 세 번째 줄,
      574쪽 리스트 28.1의 위에서 세 번째 줄,
      599쪽 리스트 29.6의 위에서 다섯 번째 줄입니다.

      그리고 javax.net.ssl.HttpsURLConnection은
      java.net.HttpURLConnection의 서브 클래스라서
      여기서는 기능적으로 어느 것을 사용해도 문제 없을 것 같습니다.

      감사합니다. 즐거운 한가위 되세요.^^

  • WJK 2014.09.03 23:43

    567쪽 하단 코드에서
    mThumbnailThread = new ThumbnailDownloader<ImageView>(new Handler());
    와 같이 제네릭 타입 <ImageView>가 들어가야 할 것 같습니다.
    (지워진 부분에서도 마찬가지로...)

    즐거운 한가위 보내세요.

    • 심재철(역자) 2014.09.04 05:55

      네, 말씀하신 게 맞습니다.
      책과 같이 제공해 드린 소스 코드에는 제대로 되어 있는데
      원서 인쇄본에서 빠졌었군요. 미처 확인을 못했던 부분입니다.

      567쪽 리스트 27.7의 위에서 6번째 줄의 삭제 표시한 코드와
      그 바로 밑의 코드 모두에 <ImageView> 제네릭 타입을
      추가해야 합니다.

      (6번째 줄의 삭제 코드 -> <ImageView>와 삭제 선 추가)
      mThumbnailThread = new ThumbnailDownloader<ImageView>();

      (7번째 줄의 코드 -> <ImageView> 추가)
      mThumbnailThread = new ThumbnailDownloader<ImageView>(new Handler());

      참고로,
      584쪽 리스트 28.8, 596쪽 리스트 29.3,
      603쪽 리스트 29.9, 606쪽 리스트29.13 에는
      모두 다 정상적으로 되어 있습니다.

      좋은 지적 감사 드립니다.^^

  • 독자 2015.01.12 10:58

    206 쪽 리스트 9.3에서 8번째 줄
    c.setSolved(I % 2 == 0); --> c.setSolved(i % 2 == 0);

    • Favicon of https://lemonflavor.tistory.com BlogIcon 레몬에이드 2015.01.12 13:21 신고

      안녕하세요.

      확인해 주셔서 감사합니다.
      대소문자가 잘못되었네요.

      오탈자 리스트에 등록하고 재쇄시 반영하도록 하겠습니다.
      감사합니다!