Post

Kotlin 문법 (1)

서론

이제 앞서서하던 Java를 이용한 Springboot 프로젝트가 마무리되면서 다음 프로젝트로는 Kotlin을 사용한 프로젝트를 계획하게 되었다.
해당 프로젝트에 들어가기 앞서 Kotlin 문법에 대해서 공부하고자 이 포스팅을 작성하게 되었다.

변수

변수 선언은 Java 보다는 Javascript에 가깝다고 느꼈다.

var: 변수값이 변경 가능한 변수 선언 (Javascript의 var,let)
val: 선언시에만 초기화 가능 (Javascript의 const, Java의 final)

fun main() {
    var a: Int
    a = 123
    print(a) // 123

    a = 234
    print(a) // 234

    val b:Int = 1232
    print(b) // 1232

    b = 3 // 에러 발생
    print(b)
}

변수를 선언할 떄 변수이름 옆에 :(타입) 을 입력해줘야한다.
그리고 타입 옆에 ?를 붙여주면서 nullable을 나타낼 수 있다.

fun main() {
    var a:Int? = null
    print(a) //null
}

형변환

형 변환은 Java와 크게 다르지 않다.
to변수타입() 을 통해 형변환이 가능하다.

fun main() {
    var a:Int = 123
    var b:String = a.toString;
}

참고로 코틀린은 암시적 형변환을 지원하지 않는다.

배열

fun main() {
    var intArr:Array<Int> = arrayOf(1,2,3,4) // Int형으로 배열 생성
    var intArr2 = arrayOfNulls<Int>(5) // Type선언 생략가능, Nullable
    var anyArr : Array<Any> = arrayOf(1,"a",3.2) // Any타입을 통해 어느 데이터든 들어갈 수 있음
    
    print(intArr[0]) // 1
    print(intArr2[0]) // null
    print(anyArr[1]) // a
}

함수

함수 선언은 fun (함수이름) 으로 적는다.
그 다음 괄호에 매개변수를 적고 매개변수 타입을 선언해준다.
그리고 매개변수 뒤에 반환될 타입을 선언해준다.

fun main() {
    print(add(1,2,3)) // 6
}

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

위와 같은 함수는 아래와 같이 단일 표현식으로도 적을 수 있다.

fun add(a: Int, b: Int, c: Int) = a + b + c // Int타입만을 더하기때문에 Int타입으로 추론가능

조건문

기본적으로 다른 언어들과 크게 다르지 않다.
조금 다른게 있다면 Switch문을 when으로 쓴다는 점이다.

1
2
3
4
5
when(a){
    1 -> print(2)
    "awd" -> print("dwa")
    else -> print(a)
}

값을 할당해줄때도 다음과 같이 쓸 수 있다.

1
2
3
4
5
var b = when(a){
    1 -> 1
    "awd" -> "dwa"
    else -> a
}

반복문

반복문 또한 다른 언어와 크게 다르지 않다.

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

// i가 0부터 3까지 높아지며 반복
for(i in 0..3){
    print(i)
    print(" ")
}

// i가 3부터 0까지 낮아지며 반복
for(i in 3 downTo 0){
     print(i)
    print(" ")
}

// i가 0부터 5까지 2씩 높아지며 반복
for(i in 0..5 step 2){
    print(i)
    print(" ")
}

// i가 a부터 e까지 알파벳 순서로 반복
for(i in 'a'..'e'){
    print(i)
    print(" ")
}

클래스

자바와 가장 다른점은 이 클래스 선언일 것이다.
일단 자바와 다르게 생성자를 따로 선언해주지 않아도 된다.

class a(var name:String, val age:Int) {
    fun introduce() {
        println("$name $age")
    }
}

fun main() {
    var b = a("홍길동",26)

    b.introduce() // 홍길동 26
    println("${b.name}, %{b.age}) // 홍길동, 26
}

코틀린의 클래스에는 init이라는 기능이 있는데 이는 클래스가 인스턴스로 생성될 때 발생하는 로직을 정할 수 있다.

class a(var name:String, val age:Int) {
    init{
        println(create : ${this.name})
    }
}

fun main() {
    var b = a("홍길동",26) // create : "홍길동"
}

상속에 대해서도 조금 다른점이 있다.
상속을 받기 위해서는 부모클래스의 메소드에 open이라는 값을 입력해줘야한다.
상속받은 메소드를 override를 붙여서 override할 수 있다.

open class Person(var name:Strings, var job:String) {
    open fun introduce() {
        println("${this.name} ${this.job}")
    }
}

class Artist(var name:String, var job:String) : Person(name, "예술가") {
    override fun introduce() {
        super.introduce()
    }
}
This post is licensed under CC BY 4.0 by the author.