단원 2 : 앱 UI 빌드
Compose 사용 시 알아야 하는 Android 기본사항 | 앱 UI 빌드 | Android Developers
Kotlin의 기본 사항을 계속 학습하고 더욱 확대된 대화형 앱을 빌드하기 시작합니다.
developer.android.com
활동 5 - 연습 : Kotlin 기초
연습: Kotlin 기초 | Android Developers
Kotlin 프로그래밍 언어의 기본 개념을 적용하여 주어진 문제를 해결합니다.
developer.android.com
지난 포스팅에 이어 단원 2 - 활동 5 내용에 대해 정리하고, 퀴즈까지 풀어보는 포스팅을 작성해 보도록 하겠다.
이번 활동은 [시작하기 전에] - [모바일 알림] - [영화 티켓 가격] - [온도 변환기] - [노래 카탈로그] - [인터넷 프로필] - [폴더블 스마트폰] - [특별 경매] - [솔루션 코드] - [추가 연습] 총 10개의 과정으로 이루어진 활동이다.
아마 이번 활동에서는 각 주제에 대한 내 풀이 코드를 올리는 위주로 진행이 될 것 같다.
모바일 알림
문제는 간단하다. 메시지 알림을 인자로 받는 printNotificationSummary 함수를 완성하는 것이다.
조건은 위에 명시된 대로 알림이 100개 미만일 경우에는 정확한 알림 수를 표시하고 100개를 넘는 경우 99+ 알림이 나타나게 하는 것이다. 나는 아래와 같이 코드를 작성했다. (매우 쉬움!)
fun printNotificationSummary(numberOfMessages: Int) {
// Fill in the code.
if(numberOfMessages < 100) {
println("You have $numberOfMessages notifications.")
} else {
println("Your phone is blowing up! You have 99+ notifications.")
}
}
영화 티켓 가격
이번에도 역시나 문제는 간단하다. 위의 모바일 알림보다는 조건이 조금 추가된 것일 뿐... 간단하다.
구간이 조금 설정되어 있는 관계로 이번에는 when 절을 사용해서 한 번 풀어봤다.
fun ticketPrice(age: Int, isMonday: Boolean): Int {
// Fill in the code.
when(age) {
in 1..12 -> return 15
in 13..60 -> if(isMonday) return 25 else return 30
in 61..100 -> return 20
else -> return -1
}
}
이번에도 역시 간단..!
온도 변환기
이번에는 섭씨에서 화씨로, 캘빈에서 섭씨로, 화씨에서 캘빈으로 변환하는 프로그램을 짜야한다. 그중에서도 우리는 main 함수를 완료해야 하는데, printFinalTemperature 함수를 보게 되면 coneversionFormula 가 함수 유형으로 되어 있는 것을 볼 수 있다. 파라미터로 Double 형을 받고 return 값 유형도 Double인 함수 유형을 전달해야 하므로, 우리는 main 함수에서 이 함수 유형을 정의하고 파라미터로 전달하는 게 목표로 보인다.
fun main() {
// Fill in the code.
val celToFah : (Double) -> Double = {
it*9/5+32
}
val kelToCel : (Double) -> Double = {
it - 273.15
}
val fahToKel : (Double) -> Double = {
(it - 32)*5/9 + 273.15
}
printFinalTemperature(initialMeasurement = 27.0, initialUnit = "Celsius", finalUnit = "Fahrenheit", conversionFormula = celToFah)
printFinalTemperature(initialMeasurement = 350.0, initialUnit = "Kelvin", finalUnit = "Celsius", conversionFormula = kelToCel)
printFinalTemperature(initialMeasurement = 10.0, initialUnit = "Fahrenheit", finalUnit = "Kelvin", conversionFormula = fahToKel)
}
노래 카탈로그
이번에는 더더더더 간단하다. Song 클래스를 만들고 위에서 얘기하는 속성을 정의하면 된다. (제목, 아티스트, 연도)
class Song(val title: String, val artist: String, val year: Int, val playCnt: Int) {
var isPopular = false
init {
if(playCnt >= 1000) isPopular = true
}
fun printDescription() {
println("[$title], [$artist], [$year]")
}
}
fun main() {
val s = Song(title = "Home Sweet Home", artist = "BigBang", year = 2024, playCnt = 100000)
s.printDescription()
println(s.isPopular)
}
Kotlin에서 기본 속성들을 바로 정의하고, 생성자를 바로 쓰는 방법을 몰라 조금 헤맸는데, 찾아보니 init 키워드를 사용하면 된다고 한다. 기본 생성자 동작 후 바로 호출되는 게 init 함수라고 한다. 그래서 init 함수를 사용하여 playCnt가 1000회 이상일 때만 유명하다는 속성이 true로 되게끔 했다.
인터넷 프로필
이번엔 null 값을 허용하는 변수를 처리하는 것을 해결하는 방법을 묻고 있다. hobby와 referrer 속성이 각각 null 값을 허용하고 있는데 showProfile 메서드에서 이를 처리하길 바라고 있다.
class Person(val name: String, val age: Int, val hobby: String?, val referrer: Person?) {
fun showProfile() {
println("Name : $name")
println("Age: $age")
if(hobby != null) print("Likes to $hobby. ")
if(referrer != null) {
val referName = referrer.name ?: ""
val referHobby = referrer.hobby ?: ""
if(referHobby == "") {
print("Has a referrer named $referName, who likes to play nothing.")
} else {
print("Has a referrer named $referName, who likes to play $referHobby.")
}
} else {
print("Doesn't have a referrer")
}
println("")
println("")
}
}
폴더블 스마트폰
이번에는 기존 Phone 클래스를 상속받아 FoldablePhone 클래스를 만들고 휴대전화가 접혀있는지 속성, switchOn 함수 동작을 사용하여 휴대전화가 접혀 있지 않을 때만 화면이 켜지도록 하는 클래스를 만들어야 한다.
fun main() {
val phone = FoldablePhone()
phone.switchOn()
phone.checkPhoneScreenLight()
phone.switchFoldingStatus()
phone.switchOn()
phone.checkPhoneScreenLight()
}
open class Phone(var isScreenLightOn: Boolean = false){
open fun switchOn() {
isScreenLightOn = true
}
fun switchOff() {
isScreenLightOn = false
}
fun checkPhoneScreenLight() {
val phoneScreenLight = if (isScreenLightOn) "on" else "off"
println("The phone screen's light is $phoneScreenLight.")
}
}
class FoldablePhone(var isFolded: Boolean = true, var isLightOn: Boolean = false) : Phone(isScreenLightOn = isLightOn) {
override fun switchOn() {
if(isFolded != true) isScreenLightOn = true
}
fun switchFoldingStatus() {
isFolded = !isFolded
}
}
특별 경매
마지막 특별 경매 코드다. auctionPrice() 함수를 완료하는 것이 목표. null 값 처리를 하는 것이 핵심으로 보인다.
fun auctionPrice(bid: Bid?, minimumPrice: Int): Int {
// Fill in the code.
if(bid != null && bid.amount > minimumPrice) {
return bid.amount
}
return minimumPrice
}
솔루션 코드
이제는 내가 작성한 코드랑 Codelab에서 제시하는 솔루션 코드랑 비교해보려고 한다. 비슷한 코드는 무시하고, 다른 부분만 다시 정리해보려고 한다.
온도 변환기 문제에서 나는 함수 유형을 각 변수에 직접 만들어서 작업을 했었는데, 어차피 간단한 수식이니 후행 람다로 표현하면 훨씬 간단하게 할 수 있었다. 아래와 같다.
fun main() {
// Fill in the code.
printFinalTemperature(initialMeasurement = 27.0, initialUnit = "Celsius", finalUnit = "Fahrenheit") { it * 9 / 5 + 32 }
printFinalTemperature(initialMeasurement = 350.0, initialUnit = "Kelvin", finalUnit = "Celsius") { it - 273.15 }
printFinalTemperature(initialMeasurement = 10.0, initialUnit = "Fahrenheit", finalUnit = "Kelvin") { (it - 32) * 5 / 9 + 273.15 }
}
노래 카탈로그에서도 init 함수를 사용해서 isPopular 속성 값을 할당했었는데, 아래와 같이 간단하게 처리가 가능하다.
class Song(val title: String, val artist: String, val year: Int, val playCnt: Int) {
val isPopular: Boolean
get() = playCnt >= 1000
fun printDescription() {
println("[$title], [$artist], [$year]")
}
}
fun main() {
val s = Song(title = "Home Sweet Home", artist = "BigBang", year = 2024, playCnt = 100000)
s.printDescription()
println(s.isPopular)
}
특별 경매의 경우 내가 지문을 멋대로 해석해서... 더 높은 가격이 반환되게끔 작성했는데 그럴 필요 없이 입찰자가 없는 경우 최소 요금만 입찰자가 있는 경우에는 입찰자의 금액을 리턴하면 되는 것으로 아래와 같이 간단하다.
class Bid(val amount: Int, val bidder: String)
fun auctionPrice(bid: Bid?, minimumPrice: Int): Int {
// Fill in the code.
return bid?.amount ?: minimumPrice
}
퀴즈 풀기
드디어 이번 활동이 끝났다. 대망의 퀴즈 풀기! (번역이 이상하게 된 것 같아서... 두 번 풀어서 10점 만점 받은 것은 안 비밀!)
이번 활동 정리는 여기서 마무리하고 다음은 이제 "앱에 버튼 추가" 활동으로 이어서 해보겠다.
'Kotlin(Android) > Android Studio Kotlin Codelab' 카테고리의 다른 글
Android Kotlin 기초 Codelab - 단원 2. 앱 UI 빌드 (과정 3 - UI 및 상태와 상호작용 - 1) (0) | 2024.12.12 |
---|---|
Android Kotlin 기초 Codelab - 단원 2. 앱 UI 빌드 (과정 2 - 앱에 버튼 추가) (1) | 2024.12.06 |
Android Kotlin 기초 Codelab - 단원 2. 앱 UI 빌드 (1-3, 람다) (0) | 2024.11.29 |
Android Kotlin 기초 Codelab - 단원 2. 앱 UI 빌드 (1-2, 클래스, 속성 위임) (3) | 2024.11.28 |
Android Kotlin 기초 Codelab - 단원 2. 앱 UI 빌드 (1-1) (0) | 2024.11.26 |