Suhwanc

* 해당 내용은 Kotlin 공식 레퍼런스에 있는 "Basic Syntax" 내용을 번역하고 제 방식으로 이해해서 작성하였습니다.

 

1. Package 정의와 import 방법

package com.example.suhwanc

import kotlin.text.*

소스 파일의 맨 윗부분에 이런 식으로 선언하면 된다.

import 맨 뒤 '*' 표시는 kotlin.text 안에 있는 모든 라이브러리를 가져온다는 의미로 자주 쓰이니 꼭 알아두자.

 

 

2. 프로그램 시작 지점

fun main(){
    println("Hello World!")
}

코틀린 프로그램은 main 함수가 시작이다.

함수 선언은 앞에 fun을 붙이면 되고, 반환형과 파라미터는 따로 선언을 해주어야 한다.

여기서는 println("Hello World!")라는 문장만 써두었는데

print는 출력하기 위한 함수이고 그 뒤에 ln을 붙이면 뒤에 개행(엔터) 문자를 붙인 것이 된다.

내부에는 공백도 되고 어떤 자료형도 출력할 수 있다.

 

3. 함수

fun sum(a: Int, b:Int) : Int{
    return a + b
}
fun main(){
    println(sum(1, 2))
}

함수의 기본틀은 이러하다.

1) fun 선언

2) 함수 이름 (여기서는 sum)

3) 소괄호() 안에 파라미터 (함수로의 전달 값)

4) 함수의 리턴 자료형 (여기서는 : Int)

5) 함수의 표현식 body (중괄호{} 내부 코드)

 

코틀린은 자료형을 나타낼 때 ": (자료형)"와 같은 방식으로 나타낸다.

변수 선언 시에도 "var a: Int" 이런 식으로 선언해주는데, 이후에 변수 부분에서 더 자세히 언급하겠다.

함수의 반환형을 나타낼 때도 똑같이 파라미터 담는 () 괄호 뒤에 ": (자료형)"을 넣은 후 중괄호에 함수 내용을 추가하면 된다.

 

 

4. 변수

 

1) 상수 val

fun main(){
    val a: Int = 1
    a = 2
}

val은 상수로서 처음 선언부에서만 값이 들어갈 수 있다. 읽기 전용 지역 변수라고도 한다.

다음과 같이 선언 이후 값을 대입하면 오류가 발생하게 된다.

 

2) var

fun main(){
    var a: Int = 1
    a = 2
}

var은 재할당이 가능한 변수로, 주로 자주 쓰인다.

 

이 둘은 모두 변수 이름 뒤에 자료형을 명시해주어야 한다.

 

하지만

fun main(){
    var a = 2
    var s = "hello"
    println(a)
}

이런 식으로 자료형을 굳이 언급하지 않아도 뻔히 무슨 자료형인지 아는 것들은 명시하지 않아도 된다.

프로그램이 자동으로 자료형을 구분해 대입한다.

 

 

5. 주석

// 한 줄 주석


/*
여러 줄 주석
 */

주석은 다음과 같이 한 줄로 처리하려면 "//"을 여러 줄을 쓰고 싶다면 "/* ~ */"을 붙여 쓰면 된다.

 

 

6. 문자열 템플릿

var who = "바보"
var s = "suhwan is $who"
    
who = "천재"

val s2 = "${s.replace("is", "was")}, but now is $who"

println(s2)

코틀린은 문자열 내부에 템플릿 표현형을 포함할 수 있게 되어있다.

예컨대, 이 기능은 문자열 안에서 외부 변수를 가져온다고 생각하면 된다.

 

이 부분은 "나 코틀린 좀 해봤어!"의 기준이 되는 영역인데, 코틀린을 정확히 이해하고 있다면

자바처럼 println("suhwan is" + "바보")와 같이 바보처럼 짜지 않고 위에 방식처럼 달러를 사용해 깔끔하게 처리한다는 것이다. 

 

 

7. 조건문

fun maxOf(a:Int, b:Int): Int{
    if(a > b) return a
    else return b
}

fun main(){
    println(maxOf(1, 3))
}

두 값을 받아 더 큰 값을 리턴하는 함수이다.

여러 언어처럼 if, else if, else 구조를 따르며 이 부분은 스킵하겠다.

 

 

8. Nullable 변수

fun main(){
    var x:Int? = 5
    x = null
    println(x)
}

코틀린은 null 문자를 담을 수 있는 변수가 있고, 담지 못하는 변수가 있다.

자바 코드를 짜면서 null 포인터 에러에 엉엉 울던 시절은 지나갔다.. 우리가 담을지 안 담을 지 미리 정할 수 있는데

담으려면 물음표를 자료형 뒤에 붙이면 되고, 안 담으려면 그대로 두면 된다.

보통은 담지 않으므로 ?가 없는 버전이 기본형이 되겠다.

 

 

9. Type checks and automatic casts

fun getStrlen(str: Any):Int?{
    //인자로 받은 str이 문자열이 아니라면
    if(str is String) return str.length
    else return null
}

코틀린은 "is" 또는 "as"를 통해 해당 변수가 어떤 자료형인지 미리 체크할 수 있게 한다.

위 코드를 해석하자면, 인자로 어떤 자료형이든 일단 받은 후 "is String" 문구를 if 문에 넣어서 

함수가 받은 인자가 문자열인지 아닌지 확인해주는 기능을 한다.

 

이러한 방법을 타입 캐스팅이라 한다.

 

 

10. for 반복문

var animals = listOf("koala", "tiger", "fox")
for(animal in animals){
    println(animal)
}

다음과 같이 특정 배열의 원소들을 하나씩 순회하며 꺼내거나, 출력할 수 있다.

 

fun main(){
    for(x in 0..10){
        println(x)
    }
}

또는 범위를 지정해 출력할 수도 있는데 이 부분도 참 신기하다.

0.. 10처럼 한눈에 봐도 0부터 10까지라는 구문을 쓸 수 있다는 점인데 .. 표시는 코틀린에서 범위를 의미한다.

정확히 말하면 .. 표시를 기준으로 앞~뒤 범위라는 것이다.

 

11. while 반복문

var animals = listOf("koala", "tiger", "fox")
var idx = 0;
while(idx < animals.size){
    println(animals[idx])
    idx++
}

while 반복문은 for 반복문과 다르게 정확히 끝낼 지점을 파악하지 못할 때, 또는 끝낼 지점은 컴퓨터가 계산해야하는 상황에 자주 쓰인다.

위 코드에서도 배열의 크기보다 작으면 계속 인덱스를 늘려가며 배열 안의 원소들을 출력하고,

배열의 크기와 같아지는 순간 while 반복문을 빠져나오게 된다.

 

 

12. When expression

fun describe(obj: Any): String =
    when(obj){
        1 -> "하나"
        "Hello" -> "안녕"
        is Int -> "정수"
        !is String -> "넌 문자열이 아니야"
        else -> "Unknown"
    }

fun main() {
    println(describe(1))
    println(describe("Hello"))
    println(describe(1000))
    println(describe(2L))
    println(describe("other"))
}

결과

 

이것도 신기하다.

공식 문서에서는 C언어의 switch 구문과 비슷하다고 한다. 그런데 좀 알기 쉽게 -> 모양을 사용한다는 점과 코드가 switch 구문보다 훨씬 간결해보인다는 장점이 있다.

주의할 점은 switch문의 default 처럼, 여기서도 반드시 else를 넣어줘야한다. 공식 문서에선 이부분을 mandatory(필수) 라고 한다. 영어 공부할겸 적어놨다.