본문 바로가기

Java & Kotlin

[Kotlin] Kotlin 기본 문법 정리 (1편 - 변수와 상수, 함수 선언, 반복문, 조건문, 자료형, 배열)

1️⃣  변수와 상수

var는 변수 선언, val는 상수 선언에 이용된다. val는 Java의 final과 동일하여 선언 시에만 값 초기화가 가능하다.
또한 타입 추론또한 지원하기 때문에 자료형을 명시하지 않아도 초기화하는 값으로 타입이 지정된다.

var a: Int
a = 20
var b: Int = 123
b = 15

val a: Int = 150 

📌 null값 사용하기

코틀린에서 null값을 사용하기 위해서는 타입 뒤에 ?를 붙여줘야 한다. Java에서는 NPE로 귀찮은 일이 많았는데 코틀린에서 ?를 지원하기 때문에 좀더 쉽게 null 처리를 할 수 있다.

var a: Int? = 10
a = null // 오류 발생

var b: Int? = null // 정상

또한 Swift에서와 같이 Chaining을 제공하는데, 사실 ? 문법은 이미 Java 8에서 등장한 Optional 객체를 요약한 것이라고 한다.
아래 예시는 str이 null이 아닐 때에만 toUppserCase()를 실행하는 예시이다.

val str = "abc"
println(str?.toUpperCase())

이는 Java에서 아래와 같다.

if(str!=null) {
    return str.toUpperCase() 
} else { 
    return null
}

그리고 null인 경우에 대비하여 값을 할당할 수 있는 엘비스 연산자가 존재한다.

val a: String? = null
println(a?.length: 0)

추가로, 강제로 null이 아님을 명시할 수도 있다. 물론 null인 경우 NPE가 발생한다.

var a: String? = null
var b = a!!

만약 null이 아닌 경우에만 특정 구문을 실행하고 싶다면 let을 이용하면 된다.

var a: String? = "안녕하세요"
a?.let { println(it) }

2️⃣  함수

가장 기본적인 함수의 형태는 아래와 같다.

fun add(a: Int, b: Int): Int {
    return a + b
}

Java와 비교했을 때, 파라미터의 이름과 타입 위치가 바뀌었고, 콜론이 추가되었으며, return 타입을 뒤쪽에 명시해주는 것을 볼 수 있따.

또한 함수의 축약도 가능하다.

fun add(a: Int, b: Int) = a + b

3️⃣  자료형(type)

코틀린의 기본적인 자료형은 아래와 같다.

 

정수 : Byte, Short, Int, Long / UByte, UShort, UInt, ULong
실수 : Float, Double
논리 : Boolean
문자 : Char
문자열 : String

 

앞서 말했듯 코틀린은 타입 추론을 통해 변수의 자료형을 부여한다.

val a: Byte = 123 // Byte형을 지정해서 선언
val b: Int = 123 // 기본적으로 Int형으로 추론
val c = 123L // Long형 추론
val d = 0X0F // 16진수형 Int형 추론

 

또한 언더스코어(_)를 이용하여 가독성을 높일 수 있다. 자릿수를 구분하는 용도로 사용되지만 아무 위치에나 추가할 수 있다. 값에는 변화가 없다.

val a = 1_234_567
val b = 123_4_56_7

여러가지 자료형들의 예시

val a:Float = 3.14e-2 // 0.0314
val b = 3.14e2 // 314

val c: Boolean = true
val d: Char = 'A'
val e: String = "Hello"

4️⃣  반복문

📌 for문

기본적인 반복문의 형태는 아래와 같다.

// 기본적인 형태
for(i in 1..5){
	println(i)
}

// 역순으로 반복
for(i in 5 downTo 1){
	println(i)
}

// 일정 간격으로 반복
for(i in 1..5 step 2){
	println(i)
}

// 끝 번호를 제외하고 반복
for(i in 1 until 5){
	println(i)
}

ArrayList의 경우에는 아래와 같이 사용할 수 있다.

var arrayList: ArrayList<String> = ArrayList<>()
for(str in arrayList){
	println(str)
}

📌 While문

while문도 다른 언어와 마찬가지로 사용할 수 있다.

while(i < 3){
    println(i)
    i++
}

📌 흐름제어

break와 continue도 다른 언어와 동일하다.

for(i in 1..5){
	if(i==1) continue
}

for(i in 1..5){
	if(i==1) break
}

5️⃣  조건문

📌 if문

if문의 경우 다른 언어들과 동일하다.

var a = 5
if(a > 3){
    println(a)
} else {
    print("exit")
}

📌 When문

when문은 Switch를 대신하여 사용할 수 있다. 눈여겨 볼 부분은 else가 default의 역할을 한다는 것이다.

whenPrint(2)

fun whenPrint(a: Any){
    when(a) {
        5 -> print(a)
        "awd" -> print(a)
        else -> print(a)
    }
}

또한 값을 return할 때에도 when문을 사용할 수 있다.
값을 return할 때에는 모든 케이스를 정의해줘야 한다.

var input: Boolean? = false

val a = when(input) {
    true -> 5
    false -> 0
    null -> 3
}

또한 When문에서는 is문을 통한 타입 비교나 범위를 통해 조건을 설정해줄 수 있다.

var score = 0

val grade = when(score) {
    in 90 .. 100 -> "A"
    in 80 until 90 -> "B"
    else -> "F"
}

6️⃣ 배열

코틀린의 배열은 Array의 타입으로 구성된다.

아래와 같이 arrayOf 메서드로 특정 원소를 가지는 배열을 생성할 수 있으며, 타입은 생략 가능하다.

val arr: Array<Int> = arrayOf(1,2,3)
val arr2: Array<String> = arrayOf("안","녕")

val arr = arrayOf(1,2,3)
val arr2 = arrayOf("test","test2")

배열을 생성할 때 초기화되는 값이 필요하다면 아래와 같이 할 수 있다.

val arr: Array<Boolean> = Array(3) { false }

만약 Null 배열을 선언하고 싶으면 아래와 같이 arrayOfNulls를 이용하면 된다.

val arr = arrayOfNulls<Int>(5)

2차원 배열은 다음의 방식으로 만들 수 있다.

var arr = Array<Array<Int>>(5){ Array<Int>(5){ 0 } }
var arr1 = Array(5, { Array(5, { 0 }) })
var arr2 = arrayOf(arrayOf(1, 2, 3), arrayOf(4, 5, 6))

참조

코틀린 문법 정리