국가 수도 맞추기 앱 만들기 #02
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
'프로그래밍 > Kotlin' 카테고리의 다른 글
국가 수도 맞추기 앱 만들기 #03 (1) | 2018.02.19 |
---|---|
국가 수도 맞추기 앱 만들기 #01 (0) | 2018.02.06 |
코틀린으로 Activity에 Hello World 출력하기 (0) | 2018.01.21 |
코틀린(Kotlin) List & Map (0) | 2018.01.17 |
코틀린(Kotlin) 배열(Array) (0) | 2018.01.11 |
코틀린(Kotlin) 리시버가 있는 함수 리터럴 (0) | 2018.01.05 |
코틀린 익명 함수 (Anonymous Function) (0) | 2018.01.02 |