오늘부터 본격적으로 코틀린의 기본문법부터 학습하는 날이다. 본캠프 이전 사전캠프 기간에 미리 코틀린에 대해 학습해두었던 터라 지급받은 강의의 내용을 이해하는데 큰 문제는 없었다. 미리 학습해두길 잘했다는 생각이 들었다.
강의 말미에 간단한 과제가 있어 그것을 해결한 내용을 정리해본다.
1. 과제 풀어보기
1-1. 과제 Lv 1.
[문제]
사용자에게 메뉴를 입력받아서 각 메뉴에 해당하는 기능을 실행시켜주세요.
프로그램을 실행하면 화면에 메뉴를 입력해주세요.
라는 문구와 함께 선택할 수 있는 메뉴가 출력됩니다.
- 게임 시작하기 메뉴
게임을 시작합니다.
라는 문구가 화면에 출력됩니다.
- 게임 끝내기 메뉴
게임을 종료합니다.
라는 문구가 화면에 출력됩니다.
[풀이]
사실 문제의 뜻을 이해하는데 시간이 좀 걸렸다. 이런 텍스트 기반의 게임 같은 걸 플레이해 본 경험이 없기 때문에 이해가 어려웠던 것 같다.
먼저 프로그램이 시작되면 다음과 같은 문구가 뜨도록 만들었다.
게임을 실행합니다.
메뉴를 입력해주세요.
게임을 시작하려면 1, 게임을 종료하려면 2
그 다음 사용자에게 입력을 받아 startInput이라는 변수에 넣어주었고, start()라는 함수를 만들었다.
start() 함수에는 when문을 이용해 1을 입력하면 "게임을 시작합니다.", 2를 입력하면 "게임을 종료합니다.", 다른 것을 입력하면 "잘못 입력하셨습니다."가 출력되도록 코드를 작성하였다.
[작성한 코드]
fun main() {
println("게임을 실행합니다.")
println("메뉴를 입력해주세요.")
println("게임을 시작하려면 1, 게임을 종료하려면 2")
val startInput = readln().toInt()
start(startInput)
}
fun start(a:Int) {
when (a) {
1 -> println("게임을 시작합니다.")
2 -> println("게임을 종료합니다.")
else -> println("잘못 입력하셨습니다.")
}
}
1-2. 과제 LV 2.
[문제]
캐릭터 추가, 캐릭터 목록 출력 메뉴를 추가해주세요.
- 캐릭터 추가 메뉴
1. 캐릭터는 이름과 직업을 가집니다.
2. 사용자로부터 추가할 캐릭터의 이름과 직업을 입력받습니다.
3. 입력받은 캐릭터를 저장합니다.
- 캐릭터 목록 출력 메뉴
프로그램을 실행한 이후로 추가한 캐릭터 목록을 출력합니다.
[풀이]
먼저 위의 코드에서 "게임을 시작하려면 1, 게임을 종료하려면2" 이 부분에 문구를 추가해주었다. "게임을 시작하려면 1, 게임을 종료하려면 2, 캐릭터를 추가하려면 3"으로 만들어주었다.
when문에도 3일때를 만들고 addCharacter()라는 함수를 추가로 만들어주었다.
addCharacter() 함수안에 먼저 characters라는 변수를 선언하고 MutableMap을 넣어주었다. 입력값으로 받을 이름과 직업이 모두 문자열이기 때문에 MutableMap<String,String>으로 타입을 정해주었다.
그리고 wantToAddCharacter라는 변수를 하나 또 만들어주었다. 일단 캐릭터를 하나 이상은 생성해야한다고 가정하고 여기에 "네"를 넣어주었다.
그 다음 while문 안에 이름과 직업의 입력을 받도록 하고 입력받은 이름과 직업을 characters에 각각 key와 value로 넣어주었다. 그런 다음 wantToAddCharacter에도 다시 입력을 받아 "네"를 입력하면 다시 while문이 반복되고 다른 문자열을 입력하면 while문이 종료된다.
그런 다음 character에 저장된 값들이 모두 출력되도록 만들어주었다. 그냥 출력되면 심심하기때문에 아래와 같은 형식으로 출력되도록 만들었다.
"캐릭터 이름:아무개, 직업: 전사"
아래가 작성한 코드와 실행 결과이다.
[작성한 코드]
fun main() {
println("게임을 실행합니다.")
println("메뉴를 입력해주세요.")
println("게임을 시작하려면 1, 게임을 종료하려면 2, 캐릭터를 추가하려면 3")
val startInput = readln().toInt()
start(startInput)
}
fun start(a:Int) {
when (a) {
1 -> println("게임을 시작합니다.")
2 -> println("게임을 종료합니다.")
3 -> addCharacter()
else -> println("잘못 입력하셨습니다.")
}
}
fun addCharacter() {
val characters: MutableMap<String, String> = mutableMapOf()
var wantToAddCharacter = "네"
while (wantToAddCharacter == "네") {
println("캐릭터의 이름을 입력하세요")
val name = readln()
println("캐릭터의 직업을 입력하세요")
val profession = readln()
characters[name] = profession
println("캐릭터를 더 추가하시겠습니까?")
println("추가하려면: '네'를 입력, 아니면: 아무 문자나 입력")
wantToAddCharacter = readln()
}
characters.forEach { println("캐릭터 이름: ${it.key}, 직업: ${it.value}")}
}
코드 실행 결과
게임을 실행합니다.
메뉴를 입력해주세요.
게임을 시작하려면 1, 게임을 종료하려면 2, 캐릭터를 추가하려면 3
3 // 입력값
캐릭터의 이름을 입력하세요
가렌 // 입력값
캐릭터의 직업을 입력하세요
전사 // 입력값
캐릭터를 더 추가하시겠습니까?
추가하려면: '네'를 입력, 아니면: 아무 문자나 입력
네 // 입력값
캐릭터의 이름을 입력하세요
아칼리 // 입력값
캐릭터의 직업을 입력하세요
암살자 // 입력값
캐릭터를 더 추가하시겠습니까?
추가하려면: '네'를 입력, 아니면: 아무 문자나 입력
네 // 입력값
캐릭터의 이름을 입력하세요
자크 // 입력값
캐릭터의 직업을 입력하세요
탱커 // 입력값
캐릭터를 더 추가하시겠습니까?
추가하려면: '네'를 입력, 아니면: 아무 문자나 입력
ㅇ // 입력값
캐릭터 이름: 가렌, 직업: 전사
캐릭터 이름: 아칼리, 직업: 암살자
캐릭터 이름: 자크, 직업: 탱커
1-3. 과제 LV 3.
[문제]
사용자가 메뉴를 잘못 선택했을 경우메뉴를 잘못 선택하셨습니다. 다시 선택해주세요.
라는 안내메시지를 출력해주세요.
올바른 선택을 다시 할 수 있게 다시 입력받아주세요.
[풀이]
예외처리에 관해서는 사용해본적이 거의 없다보니 실제 적용하는데 애를 좀 먹었다.
선택지가 1,2,3 밖에 없기 때문에 나는 입력값이 1,2,3이 아니면 무조건 예외를 던지도록 코드를 짜고싶었다. 그런데 사용자가 꼭 숫자만 입력하리라는 법이 없다는 문제가 있었다.
이리저리 코드를 짜다보니 인텔리제이가 힌트를 줬는데 toInt()를 쓰려고했는데 아래에 toIntOrNull()이라는 함수가 뜨는걸 보았다. 찾아보니 이 함수는 문자열을 정수로 변환할수 있다면 정수로 반환해주고, 문자열을 정수로 변환할 수 없다면 null을 반환해준다.
만약 사용자가 입력값을 숫자가 아닌 문자를 입력하게 되면 readLine()!!.toInt()(또는 readln().toInt())의 경우에는 입력시에 예외가 발생하게 된다. toIntOrNull()을 사용하면 이런 문제가 발생하지 않고 1,2,3이 아닌 모든 경우(null과 1,2,3이 아닌숫자)에 대해서만 예외처리를 해주면되기 때문에 이것을 이용해서 코드를 작성해보았다.
1,2,3이 아닌 입력값을 입력했을 때 "숫자 (1,2,3)만 입력 가능합니다. 다시 입력해주세요!"라는 문구가 뜨도록 예외처리를 해주었다.
그리고 게임 시작을 나타내는 start()함수의 인자의 타입도 null을 허용하는 정수로 변환시켜주어야했다.
아래가 완성된 코드와 실행 결과이다.
[작성한 코드]
fun main() {
println("게임을 실행합니다.")
println("메뉴를 입력해주세요.")
println("게임을 시작하려면 1, 게임을 종료하려면 2, 캐릭터를 추가하려면 3")
var isValidInput = false
while(isValidInput == false) {
try {
val startInput = readln().toIntOrNull()
start(startInput)
isValidInput = true
} catch (e: Exception) {
println(e.message)
}
}
}
fun start(input:Int?) {
if (input !in 1..3) {
throw IllegalArgumentException("숫자 (1,2,3)만 입력 가능합니다. 다시 입력해주세요!")
}
when (input) {
1 -> println("게임을 시작합니다.")
2 -> println("게임을 종료합니다.")
3 -> addCharacter()
}
}
fun addCharacter() {
val characters: MutableMap<String, String> = mutableMapOf()
var wantToAddCharacter = "네"
while (wantToAddCharacter == "네") {
println("캐릭터의 이름을 입력하세요")
val name = readln()
println("캐릭터의 직업을 입력하세요")
val profession = readln()
characters[name] = profession
println("캐릭터를 더 추가하시겠습니까?")
println("추가하려면: '네'를 입력, 아니면: 아무 문자나 입력")
wantToAddCharacter = readln()
}
characters.forEach { println("캐릭터 이름: ${it.key}, 직업: ${it.value}")}
}
코드 실행 결과
게임을 실행합니다.
메뉴를 입력해주세요.
게임을 시작하려면 1, 게임을 종료하려면 2, 캐릭터를 추가하려면 3
얍 // 입력값
숫자 (1,2,3)만 입력가능합니다. 다시 입력해주세요!
10 // 입력값
숫자 (1,2,3)만 입력가능합니다. 다시 입력해주세요!
3 // 입력값
캐릭터의 이름을 입력하세요
신드라 // 입력값
캐릭터의 직업을 입력하세요
마법사 // 입력값
캐릭터를 더 추가하시겠습니까?
추가하려면: '네'를 입력, 아니면: 아무 문자나 입력
네 // 입력값
캐릭터의 이름을 입력하세요
문도 // 입력값
캐릭터의 직업을 입력하세요
탱커 // 입력값
캐릭터를 더 추가하시겠습니까?
추가하려면: '네'를 입력, 아니면: 아무 문자나 입력
네 // 입력값
캐릭터의 이름을 입력하세요
가렌 // 입력값
캐릭터의 직업을 입력하세요
전사 // 입력값
캐릭터를 더 추가하시겠습니까?
추가하려면: '네'를 입력, 아니면: 아무 문자나 입력
아니오 // 입력값
캐릭터 이름: 신드라, 직업: 마법사
캐릭터 이름: 문도, 직업: 탱커
캐릭터 이름: 가렌, 직업: 전사
2. 오늘 배운 것
- 코틀린 기본 문법을 복습해보는 시간을 가졌다.
- 객체 지향 프로그래밍은 아직도 익숙하지 않아서 많은 연습이 필요할 것 같다.
'오늘 배운 것' 카테고리의 다른 글
24-04-24 Kotlin 계산기 만들기 (0) | 2024.04.24 |
---|---|
24-04-23 Kotlin 간단한 텍스트 rpg 만들어보기 (2) (0) | 2024.04.23 |
24-04-21 Kotlin filter()와 filterNotNull() (0) | 2024.04.21 |
24-04-20 Kotlin 컬렉션 정렬하기 (2) (0) | 2024.04.20 |
24-04-19 프로젝트 회고 (0) | 2024.04.19 |