[코틀린] 03.Kotlin/Native - 첫 컴파일과 숫자야구 게임
이 블로그에서 사용하는 몇가지 IT 용어 정리.
compile (컴파일)은 (주로 영어단어로 이루어진) 고급 프로그래밍 언어 소스(if, for, ...)를 컴퓨터가 알 수 있는 기계어(01000010, 10011000, ...)로 번역하는 것을 의미한다. 이 때, 번역을 처리하는 프로그램을 compiler(컴파일러)라고 한다.
윈도우의 폴더 (folder)는 디렉토리 (directory)와 동일한 의미로 사용한다.
이전 블로그에서 윈도우 '명령 프롬프트' 창에서 코틀린 소스를 컴파일 할 수 있는 Kotlin/Native를 설치 해 보았다.
2019/11/28 - [안드로이드/코틀린+안드로이드 스튜디오] - [코틀린] 01.소개와 맛보기
2019/11/28 - [안드로이드/코틀린+안드로이드 스튜디오] - [코틀린] 02.Kotlin/Native - 설치하기
코틀린/네이티브 설치 – 3. 첫 컴파일
이 블로그에서는 "Hello, Kotlin/Native!!"를 화면에 출력하기 위해 아래 순서로 진행할 것이다.
1) 윈도우 '명령 프롬프트' 창 열기
2) 코틀린 소스가 저장될 폴더 생성하기 (kotlin_test 폴더 생성)
3) 코틀린 소스 만들기 (test1.kt 파일 생성)
4) 컴파일 하기 (이 때 .konan 이라는 컴파일용 파일 2.8GB가 자동 설치 된다)
5) 실행하여 확인 하기
차근차근 따라 해 보자.
1) 코틀린 소스를 컴파일 하기 위해 윈도우의 '명령 프롬프트' 창을 연다.
윈도우 하단 작업표시줄의 '검색' 창에서 'cmd' 명령어를 입력 후 엔터키를 치거나, 화면에 나타나는 '명령 프롬프트'를 선택한다.
2) 코틀린 소스가 저장될 폴더를 생성한다.
폴더 생성은 탐색기에서 '새로 만들기 > 폴더'로 생성해도 된다. 하지만, 험난한 길을 선택했으니 커맨드 명령어로 폴더를 생성 해 보자.
① 탐색기 좌측에서 자신의 컴퓨터에 드라이브 'C:' 나 'D:' 가 있는지 확인 하고 코틀린 소스를 저장할 곳을 정한다.
② 코틀린 소스를 저장하기 위한 폴더를 만든다.
(이 블로그는 D드라이브에 ‘D:\kotlin_test’ 폴더를 만들었다.)
-
d: : D드라이브로 이동하는 명령어
-
mkdir kotlin_test : kotlin_test라는 폴더를 만드는 명령어 (mkdir = make directory)
-
cd kotlin_test : kotlin_test라는 폴더로 이동하는 명령어 (cd = change directory)
③ 윈도우 메모장(notepad)을 열어 코틀린 소스를 입력하는 파일(test1.kt)을 생성한다.
-
notepad test1.kt : 코틀린 소스의 확장자는 .kt 이다.
④ 메모장이 나타나고 '새 파일을 만드시겠습니까?' 하면 '예'를 클릭한다.
⑤ 아래 코틀린 소스를 입력한 후 '메뉴 파일 > 저장' 또는 단축키 'Ctrl+S'로 저장한다.
fun main() {
println("Hello, Kotlin/Native!!")
}
⑥ '명령 프롬프트' 창에서 'kotlinc-native test1.kt –o test1'을 입력하여 엔터키를 친다.
-
kotlinc-native : Kotlin/Native 컴파일러를 실행하는 윈도우 스크립트
-
test1.kt : 코틀린 소스 파일
-
-o test1 : 컴파일된 파일명 (test1.exe가 생성된다. test1을 기억하자.)
⑦ Kotlin/Native를 처음으로 컴파일하면 최초 1회만 아래와 같이 .konon 이라는 2.8GB 분량의 파일을 다운로드 받는다. 잠시 기다리자.
⑧ 다운로드 후 정상적으로 컴파일 되면 아래와 같이 프롬프트가 나타난다.
⑨ 컴파일된 test1.exe 파일을 실행한다.
(이 블로그에서는 '명령 프롬프트' 창의 화면을 깨끗이 지운 다음 생성된 파일을 확인하고 실행했다.)
-
cls : '명령 프롬프트' 창의 화면을 지우는 명령어 (cls = clear screen)
-
dir : 폴더 내의 파일 목록을 보는 명령어 (dir = directory)
-
test1 : 윈도우에서 실행 가능한 파일 확장자는 '.exe, .bat' 이다. 따라서, 파일명만 입력하면 해당 확장자를 가진 파일을 찾아서 실행한다.
"Hello, Kotlin/Native!!"가 출력 되었다.
이 한 줄을 보기 위해 많은 과정을 거쳤다.
잠시 머리를 식히기 위해 ‘숫자야구 게임’을 만들어 보겠다.
코틀린/네이티브 - 숫자야구 게임
'숫자야구' 게임은 컴퓨터가 추출한 0~9 까지 중복 없는 숫자 3개를 플레이어가 맞추는 커맨드 라인 기반 게임이다. (외국에서는 Bulls and cows라 하며, 중복 없는 숫자 4개를 추출 한다.)
[게임 방식]
1) 컴퓨터가 0~9 사이 숫자 중 난수 3개를 만든다.
2) 플레이어가 생각하는 (중복 없는) 3자리 숫자를 입력한다.
3) 플레이어 숫자와 컴퓨터 숫자 간 위치와 숫자가 맞으면 맞은 숫자만큼 '스트라이크'가 된다.
4) 플레이어 숫자와 컴퓨터 숫자 간 숫자는 맞는데 위치가 다르면 맞은 숫자만큼 '볼'이 된다.
[예시]
>컴퓨터 숫자 : 592
>플레이어 추측 : 123 (0스트라이크 1볼)
>플레이어 추측 : 567 (1스트라이크 0볼)
>...
>플레이어 추측 : 592 (3스트라이크 0볼) - 정답입니다.
컴파일 순서는 아래와 같다. 위 '3. 첫 컴파일' 항목과 비슷하니 비교하면서 실습해 보시길 바란다.
① 윈도우 메모장(notepad)을 열어 코틀린 소스를 입력하는 파일(game1.kt)을 생성한다.
② 메모장이 나타나고 '새 파일을 만드시겠습니까?' 하면 '예'를 클릭한다.
③ 아래 코틀린 소스를 입력(또는 복사)한 후 '메뉴 파일 > 저장' 또는 단축키 'Ctrl+S'로 저장한다.
④ '명령 프롬프트' 창에서 'kotlinc-native game1.kt –o game1'을 입력하여 엔터키를 친다.
('3. 첫 컴파일' 항목에서 .konon을 다운로드 받았으므로 바로 컴파일이 된다.)
⑤ 컴파일된 game1.exe 파일을 실행한다.
숫자야구 게임 전체 소스는 아래와 같다.
// game1.kt
fun main() {
// ----- ----- ----- ----- ----- ----- ----- -----
// 012~987 사이 중복 없는 3자리 난수 생성
var 컴숫자: String
var 컴숫자_임시 = Array(3, {0})
컴숫자_임시[0] = (0..9).random()
do {
컴숫자_임시[1] = (0..9).random()
} while ( 컴숫자_임시[1] == 컴숫자_임시[0] )
do {
컴숫자_임시[2] = (0..9).random()
} while ( 컴숫자_임시[2] == 컴숫자_임시[0]
|| 컴숫자_임시[2] == 컴숫자_임시[1] )
컴숫자 = "${컴숫자_임시[0]}${컴숫자_임시[1]}${컴숫자_임시[2]}"
// ----- ----- ----- ----- ----- ----- ----- -----
// 게임 시작
val 입력기회 = 9
var 내숫자: String
var 입력횟수 = 0
println("\n0~9 사이 (중복 없는) 숫자 3개를 추측해 보세요.")
println("최대 ${입력기회} 번의 기회가 있습니다.\n")
while (true) {
// 플레이어 숫자 입력
print("추측 숫자는? : ")
내숫자 = readLine()!!
// ----- ----- ----- ----- ----- ----- ----- -----
// 입력값 검증
val 검증 = """^\d{3}$""".toRegex()
if (검증.find(내숫자) == null
|| 내숫자.toSet().size < 3)
println("\n 중복 없는 3자리 숫자를 넣으세요.\n")
// ----- ----- ----- ----- ----- ----- ----- -----
// 판정
else {
var 스트라이크 = 0
var 볼 = 0
for ((i, v) in 내숫자.withIndex()) {
if (컴숫자[i] == v) 스트라이크++
else if (v in 컴숫자) 볼++
}
println("\n 판정 결과 : 스트라이크 = ${스트라이크} 볼 = ${볼}\n")
입력횟수++
// ----- ----- ----- ----- ----- ----- ----- -----
// 입력기회 초과 시 처리
if (입력횟수 == 입력기회) {
print("\n 도전 가능 횟수 ${입력횟수} 번을 넘었습니다. ")
println("정답은 ${컴숫자} 입니다. 다시 도전하세요.\n")
return
}
}
// ----- ----- ----- ----- ----- ----- ----- -----
// 성공 메시지
if (내숫자 == 컴숫자) {
when {
입력횟수 <= 3 -> print("\n 놀랍습니다!!! ")
입력횟수 <= 5 -> print("\n 매우 좋습니다!!! ")
else -> print("\n 축하합니다!!! ")
}
println("${입력횟수} 번 만에 맞추었습니다!\n")
return
}
} // end while
} // end main
어디까지나 머리를 식히는 용도이므로 그냥 즐기면 좋겠지만 궁금하신 분들을 위해 소스를 간략하게 설명하자면...
1) 코틀린은 한글 변수 선언이 가능하다. (안드로이드 스튜디오도 마찬가로 한글 변수 선언이 가능함)
2) '컴숫자_임시[0] = (0..9).random()' : 0~9 사이의 숫자 중 난수를 생성하여 첫 번째 배열에 넣음. 두 번째, 세 번째 배열도 난수를 생성하지만, 이전 배열과 같은 숫자가 나오면 다시 난수를 생성 함.
3) '내숫자 = readLine()!!' : '명령 프롬프트' 창에서 엔터키를 칠때까지 키보드 입력 받음
4) 'val 검증 = """^\d{3}$""".toRegex()' : 키보드로 입력 받은 값을 검증하기 위한 정규식. '처음(^)에서 숫자(\d) 3자리({3})로 끝($)'인 값을 찾음.
5) '내숫자.toSet().size < 3' : 변수 '내숫자'에 입력된 값의 요소 집합 크기를 비교하여 중복된 숫자가 있는지 확인 (예, '122'의 요소 집합은 '1, 2'로 크기는 2임)
6) 'for ((i, v) in 내숫자.withIndex()) { ... }' : 변수 '내숫자'와 '컴숫자'의 숫자를 하나하나 비교하기 위한 for문. 아래 for문과 같음.
for (i in 내숫자.indices) {
if (컴숫자[i] == 내숫자[i])
스트라이크++
else
for (j in 컴숫자.indices) {
if (컴숫자[j] == 내숫자[i])
볼++
}
}
7) 'when { 입력횟수 <= 3 -> print(...) ...}' : if문을 좀 더 보기 좋게 만든 when문. 아래 if문과 같음. (코틀린에서는 좀 더 다양한 형태의 when문이 지원 된다)
if (입력횟수 <= 3)
print("\n 놀랍습니다!!! ")
else if (입력횟수 <= 5)
print("\n 매우 좋습니다!!! ")
else
print("\n 축하합니다!!! ")
윈도우 메모장(notepad)으로 2개의 코틀린 소스(test1.kt, game1.kt)를 입력하고 컴파일 해 보았다.
많이 답답하지 않은가?
소문에 의하면 윈도우 메모장만으로 프로그래밍을 하는 고수 개발자가 있다고 한다.
개인 취미로는 괜찮지만 업무상으로는 글쎄요...
다음 회에서는 윈도우 메모장보다 기능이 많은 '노트패드++'를 이용한 Kotlin/Native 개발 환경을 만들어, 윈도우 메모장보다는 쾌적한 개발 환경을 구성해 보겠다.
한 번 더 이야기 하지만, 'IntelliJ IDEA Community Edition'을 설치하면 매우~ 쾌적한 개발 환경에서 실습할 수 있다.