국가 수도 맞추기 앱 만들기 #02


 지난번에는 문제번호와 국가 정보만 노출되는 부분까지 구현했습니다. 

 이번에는 이전, 다음 버튼의 Click에 대한 동작을 구현하겠습니다. 이것을 Java로 구현한다면 다음과 같습니다.

        mPrevButton = (Button) findViewById(R.id.prev_button);

        mPrevButton.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                mCurrentIndex = mCurrentIndex - 1;

                if (mCurrentIndex < 0) {

                    mCurrentIndex = mQuestions.length - 1;

                }

                updateQuestion();

            }

        });


        mNextButton = (Button) findViewById(R.id.next_button);

        mNextButton.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                mCurrentIndex = (mCurrentIndex + 1) % mQuestions.length;

                updateQuestion();

            }

        });


 버튼에 사용할 변수에 레이아웃 위젯을 할당하고 그 변수에 클릭 리스너를 달고 onClick 함수를 오버라이딩 하고 있습니다. 코클린은 람다식을 지원하여 이와같은 부분이 축약될 수 있습니다.


람다식이 기억나지 않는다면? 람다 표현식 문법


 람다식을 적용하면 onClick 함수에 View 타입의 변수 v를 가지고 있어서 v -> 를 통해서 변수를 받아서 사용할 수 있습니다. 다음과 같이 말이죠.

mPrevButton.setOnClickListener {

v -> body


 지금은 변수 v를 사용하지 않으니 해당 부분도 불필요합니다. 그래서 다음과 같은 뼈대만 남고 여기에 필요한 동작을 넣어주면 됩니다.


mPrevButton.setOnClickListener {

 ...

}


 그러면 다음과 같이 되겠죠? 버튼 변수가 mPrevButton이 아닌 prev_button라고 사용한 이유는 앞서 말씀드렸듯이 코틀린에서는 레이아웃 위젯의 id를 바로 코드에서 사용가능하기 때문이라는 사실, 다시 한 번 상기할 수 있습니다.


        prev_button.setOnClickListener {

            mCurrentIndex = mCurrentIndex - 1

            if (mCurrentIndex < 0) {

                mCurrentIndex = mCountryList.mQuestions.size - 1

            }

            updateQuestion()

        }


        next_button.setOnClickListener {

            mCurrentIndex = (mCurrentIndex + 1) % mCountryList.mQuestions.size

            updateQuestion()

        }


 코드가 한층 간결해졌다는 느낌을 받을 수 있습니다. 정말 별 것 아닌 일이지만 Java에서 코틀린으로 넘어가는 기본 단계라고 생각합니다. 이 예제를 통해 각종 클릭 리스너를 등록할 때 코틀린을 적용할 수 있을 것 같습니다.


 클릭시 동작에 관해 간단히 설명하자면 mCurrentIndex는 현재 문제의 번호입니다. mCountryList는 전체 국가 정보가 들어있는 리스트이므로 해당 국가의 개수가 총 문제의 수와 같습니다. 따라서 1번 문제에서 이전 버튼시 가장 끝 번호로 갈수 있도록 if 문으로 처리되었습니다. 다음 버튼을 눌렀을 때는 mCurrentIndex 1씩 증가하며 끝번호로 가면 다시 처음부터 시작되도록 하였습니다.


 그 후 updateQuestion()가 동작하는데 해당 함수는 다음 시간에 살펴보겠습니다. 함수 내용은 문제의 번호와 국가 정보를 갱신하고 Answer 버튼에 들어갈 정답, 오답 수도 정보를 갱신하는 동작을 합니다.


 다음에는 Answer 4개 버튼에 대한 처리 및 랜덤으로 Answer 버튼을 배치하고 앱을 완성하도록 하겠습니다. 


참고로 모든 기능이 구현된 코드는 이미 아래 GitHub에 업로드 되어 있습니다.

https://github.com/MyStoryG/CapitalQuiz

+ Recent posts