Kotlin 기본문법 - 2
- 코틀린 기본문법 -
제어문
제어문이란 범위클래스, for문, while문, if문 등 프로그래밍에서의 과정 제어를 조금 더 쉽게 해주는 것이라 생각하면 되겠다. 코틀린에서는 아주 간결한 제어문을 많이 소개하고 있으니 잘 활용하도록 하자.
범위클래스
범위클래스는 특정 범위의 값들을 간편하게 표현하고자 만든 클래스인데, 대표적으로 IntRange, LongRange, CharRange와 같은 것들을 통해서 정해진 범위 내의 값들을 쉽게 표현할 수 있다
예시)
val numRange : IntRange = 1..5 // numRange라는 변수에 1에서 5까지의 값을 넣는다
println(numRange.contains(3)) // numRange에 3이라는 값이 포함되어 있는가? 라는 물음 - 있기에 결과는 true
println(numRange.contains(10)) // numRange에는 1에서 5의 값만 있기에 결과는 false가 되겠다
이와 같게, 알파벳의 범위도 저장할 수 있다
val charRange : CharRange = 'a'..'e'. // 알파벳 a에서 e까지 저장
println(charRange.contains('d'). // 결과값 : true
for문
for문은 반복문의 일종으로, 반복적인 값을 처리하는데 아주아주아주 큰 도움을 주는 제어문이다
코틀린에서는 in 연산자와 함께 쓰여 간편하게 사용할 수 있다 예를 한번 보자
for(i in 1..5){
println(i) // i 라는 변수가 1에서 5의 값을 받아 한번 씩 돌아가며 출력한다 -- 결과값 : 1, 2, 3, 4, 5
}
만약 5에서 1로 출력하고 싶다면? - downTo 키워드를 사용하면 된다
for(i in 5 downTo 1){
println(i) // 5, 4, 3, 2, 1
}
1에서 10까지 2씩 증가하며 출력하고 싶다면? -- step 키워드를 사용하면 된다
for(i in 1..10 step 2){
println(i) // 1, 3, 5, 7, 9
}
배열 내 요소들을 출력하는데도 for문을 사용할 수 있다
예시)
val students = arrayOf("seunghwan", "minsu", "seho")
for(name in students){
println(name) // seunghwan, minsu, seho
}
withIndex()함수를 쓰면 배열에 저장된 요소들의 숫자 즉, 인덱스도 함께 가져올 수 있다.
예시)
for((index, name) in students.withIndex()){
println("번호 : $index, 이름 : $name")
}
// 출력 결과
// 번호 : 0, 이름 : seunghwan
// 번호 : 1, 이름 : minsu
// 번호 : 2, 이름 : seho
while문
while문 또한 for문과 같이 반복문의 일종이지만, while문은 주어진 조건을 참이라 인식할때 계속 반복하는 반복문이다. while문은 크게 while과 do while이 있으며 do while은 조건과 관계없이 최소 한번은 실행된다
while(조건){
반복수행 내용
}
예)
var num = 1
while(num <= 5){
println("$num은 5 이하") // 1, 2, 3, 4, 5 까지 출력
num++
}
이와 유사하지만 조금은 다르게, do while은 먼저 반복 한번 실행 후, 조건을 판단하여 다시 실행할지 결정
var num = 1
do{
println(num) // 1, 2, 3, 4, 5
num++
} while(num <= 5)
if문
if문은 조건문으로, 어떠한 조건이 참이라 판단되면 실행한다 기본적인 문법은 아래와 같다
if(조건1){
(실행명령)
} else if(조건2){
(실행명령)
} else{
(실행명령)
}
if문에서 if조건이 아니라면, 다음 else if에서 조건을 충족하는지 판단하고, 만약 맞다면 실행을, 그것도 아니라면 else 즉 나머지를 실행한다
예)
val examScore = 40
var isPass = false
if(examScore<70){
println(isPass) // false
} else {
isPass = true
println(isPAss)
}
if문은 일반적 명령문으로 어떠한 동작을 수행하는 것에만 그치지 않고 표현식으로도 사용할 수 있다.
표현식이란 하나의 값으로 평가되는 문장으로서 값을 남기는 식이다. if문을 활용해 변수에 값을 할당할 수 있지만 대신 아무런 값도 대입되지 않으면 안되기에 else문을 필수로 가져야한다.
예)
val myAge = 23
val isAdult = if(myAge > 19) true else false
println("성인 여부 : $isAdult") // 성인 여부 : true
when문
자바와 파이썬과 같이 값에 따라 나눠서 코드를 실행하는 switch문이 코틀린에는 없다, 하지만 코틀린에는 when문이 그 역할을 대신한다.
기본문법은 아래와 같다
val int = 23
when(int){
19 -> {println("고등학교 3학년")}
in 20..30 -> {println("젊은 나이")}
in 31..40 -> {println("늦지 않은 나이")}
// 범위 안에 들어가지 않는 경우
!in 0..200 -> {println("잘못된 값입니다")}
else -> {println("잘 모르겠다")}
}
when과 매개변수를 넣고, 그 매개변수가 when문 내 값과 일치할 시 '->' 모양의 화살표 옆의 명령을 실시한다
when문도 if문과 마찬가지로, 값을 반환하는 표현식으로 사용할 수 있다. 값을 무조건 할당해야하기에 else문이 필수로 들어가야한다.
예)
val essaScore = 90
val grade = when(essayScore){
in 0..40 -> 'D'
in 41..70 -> 'C'
in 71..85 -> 'B'
else -> 'A'
}
println("에세이 학점 : $grade") // 결과값 : A
컬렉션
자바 내에서 List, Set, Map과 같은 자료구조는 코틀린에서도 찾아볼 수 있다. 코틀린에서는 이러한 컬렉션이 두 가지로 나뉜다, 하나는 읽기 전용 컬렉션이고 하나는 읽기-쓰기 컬렉션이다. 이름만 보아도 유추할 수 있듯 읽기 전용 컬렉션(immutable-collection)은 말 그대로 수정 및 추가가 되지 않는 컬렉션이고 읽기-쓰기 컬렉션(mutable-collection)은 컬렉션의 수정과 추가, 삭제등이 가능하다.
리스트(List)
리스트는 순서가 존재하는 자료구조이다. 선언은 아래와 같다.
val numImmutableList = listOf(1, 2, 3) // listOf()함수는 List를 생성하지만, 읽기 전용으로 생성한다
numImmutableList[0] = 3 // 그렇기에 첫 번째 인자를 3으로 바꾸겠다는 해당 내용은 오류가 발생한다
읽기-쓰기 전용 리스트를 만들려면 listOf() 함수가 아닌, mutableListOf()함수를 사용하면 된다
val numMmutableList = mutableListOf(1, 2, 3)
numMmutableList[0] = 3
println(numMutableList) // 결과 값 : [3, 2, 3]
추가로, 리스트에 어떠한 요소가 있는지 확인하려면 contains()함수를 사용하면 된다
println(numMutableList.contains(2)) // true
println(numMutableList.contains(1)) // false
셋(Set)
셋은 순서가 없다. 또한 각각의 요소가 중복되지 않으므로 값을 추가하더라도 기존에 있던 값일 경우 하나만 저장된다.
셋은 리스트와 마찬가지로 읽기 전용 셋과 읽기-쓰기용 셋 두 가지를 제공한다. 각각 setOf(), mutableSetOf() 함수로 객체를 생성한다.
기본 문법은 아래와 같다.
변수(읽기전용) = setOf(값)
변수(읽기-쓰기 용) = mutableSetOf(값)
예)
// 읽기 전용 셋
val ImmutableSet = setOf(1, 1, 1, 1, 2, 2, 2, 3, 3, 3)
println(ImmutableSet) // [1, 2, 3]
// 읽기-쓰기 셋
val mutableSet = mutableSetOf(1, 1, 1, 1, 2, 2, 2, 3, 3, 3)
println(mutableSet) // [1, 2, 3]
mutableSet.add(4)
mutableSet.remove(2)
println(mutableSet) // [1, 3, 4]
맵(Map)
맵은 키와 값을 짝지어 저장하는 자료구조다. 키는 값을 대중목욕탕으로 비유하자면, 목욕탕에서 주는 열쇠들은 각 열쇠로 사물함을 열면 각 손님들의 고유한 옷과 시계들이 들어있을 것이다. 여기서 열쇠가 맵에서의 키이고, 각각의 다른 옷가지들이 값이라 이해하면 되겠다. 맵 또한 읽기전용 맵과 읽기-쓰기 맵이 있다. 기본 문법은 아래와 같다.
변수내용(읽기 전용) = mapOf(키 to 값, 키 to 값 ...)
예)
// 읽기 전용 맵
val immutableMap = mapOf("name" to "seunghwan", "age" to 23, "height" to 250, "height" to 150)
println(immutableMap) // 결과값 : {name=seunghwan, age=23, height=150}. --- height는 마지막 선언한 것이 출력
// 읽기-쓰기 용 맵
val mutableMap = mutableMapOf("강아지" to "닥스훈트", "고양이" to "똥고양이", "오리" to "꽥꽥")
println(mutableMap) // 결과값 : {강아지=닥스훈트, 고양이=똥고양이, 오리=꽥꽥}
mutableMap.put("막국수", "한식") // {막국수=한식} 추가
mutableMap.remove("강아지") // {강아지=닥스훈트}에서, 키 값인 강아지를 삭제해서 값도 함께 삭제됨
mutableMap.replace("고양이", "보우") // {고양이=똥고양이}에서, 키 값이 고양이인 인자의 값을 보우로 바꿈
println(mutableMap) // {고양이=귀여운고양이, 오리=꽥꽥, 막국수=한식}
주의해야 할 점? --> 읽기-쓰기 용 맵은 기존에 선언한 키와 밸류의 형식이 같아야 한다.
즉, Key=Value가 String = String 이라면, 추가되거나 대체되는 것들도 String = String의 형식을 따라야 한다는 것