본문 바로가기
Language/Kotlin

[Kotlin IN ACTION] - Kotlin 함수와 변수

by Jman 2022. 7. 4.

2.2.1 Hello, World!

코틀린에서는 함수 하나로 Hello, World 를 찍는 프로그램을 만들 수 있다.

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

 

 

  • 함수를 선언할 때, fun 키워드를 사용한다
  • 파라미터 이름 뒤에 그 파라미터의 타입을 쓴다.
  • 함수를 최상위 수준에 정의할 수 있다. (굳이 클래스 안에 함수를 넣어야 할 필요가 없다.)
  • 배열도 일반적인 클래스와 마찬가지다. 코틀린에는 자바와 달리 배열 처리를 위한 문법이 따로 존재하지 않는다.
  • System.out.println() 대신에, println() 이라고 쓴다.
  • 최신 프로그래밍 언어 경향과 마찬가지로 줄 끝에 세미콜론(;) 을 붙이지 않아도 된다.

 

 

2.1.2  함수

fun max(a : Int, b : Int) : Int {
    return if(a > b) a else b
}
fun main() {
    println(max(1, 2))
}
  • 함수의 반환 타입은 파라미터 목록의 닫는 괄호 다음에 온다.
  • 또한, 함수 인자를 받는 매개변수 위치와 반환 타입 사이에는 콜론(:) 으로 구분해주어야 한다.
  • return 시, 코틀린 if 는 문장이 아니고, 결과를 만드는 식이라는 점도 흥미롭다. (표현식 작성)
문(statement) 과 식(expression)의 구분
자바에서는 모든 제어 구조가 문인 반면 코틀린에서는 루프를 제외한 대부분의 제어구조가 식이다.
제어구조를 다른 식으로 엮어낼 수 있으면 일반적인 패턴을 아주 간결하게 표현할 수 있다.
반면 대입문은 자바에서는 식이었으나 코틀린에서는 문이 됐다.
그로 인해 자바와 달리 대입식과 비교식을 잘못 바꿔 써서 버그가 생기는 경우가 없다.

또한, 위에서 반환 타입을 생략이 가능하다.

그 이유는 코틀린은 컴파일러가 타입을 분석해 프로그래머 대신 프로그램 구성 요소의 타입을 정해주는 기능을 한다.

타입 추론이라 한다.

 

 

2.1.3  변수

    // 타입 생략
    val question = "키워드를 사용하되, 타입을 생략 함"
    val answer = 44

    // 타입 명시
    val answer2 : Int = 77

자바에서는 변수를 선언할 때, 타입이 맨 앞에 온다. 하지만? 코틀린에서는 타입 지정을 생략하는 경우가 흔하다.

타입으로 변수 선언을 시작하면 타입을 생략할 경우, 식과 변수 선언을 구별할 수 없다.

그런 이유로 코틀린에서는 키워드로 변수 선언을 시작하는 대신 변수 이름 뒤에 타입을 명시하거나 생략하게 허용한다.

 

val answer : Int // 선언
answer = 42 // 초기화

하지만, 초기화식을 사용하지 않고 변수를 선언하려면 변수 타입을 반드시 명시 해야한다.

 

변경 가능한 변수와 변경 불가능한 변수

  • val - 변경 불가능한 참조를 저장하는 변수 : val 로 선언된 변수는 일단 초기화하고 나면 재대입이 불가능 (자바의 final 변수)
  • var - 변경 가능한 참조 : 변수의 값은 바뀔 수 있다 (자바의 일반 변수)

> 기본적으로는 모든 변수를 val 키워드를 사용해 불변 변수로 선언하고, 나중에 꼭 필요할 때에만 var 로 변경하라.

 

 

val message : String = if(canPerformOperation()) "Success" else "Failed"

val message : String = 
    if(canPerformOperation()) {
        "Success"
        // .. 연산을 수행한다.
    }
    else {
        "Failed"
    }

 

val 변수는 블록을 실행할 때, 정확히 한 번만 초기화되어야 한다. 하지만, 어떤 블록이 실행될 때 오직 한 초기화 문장만 실행됨을 컴파일러가 확인할 수 있다면 조건에 따라 val 값을 다른 여러 값으로 초기화 할 수 있다.

 

    val languages = arrayListOf("JAVA")
    languages.add("KOTLIN")
    
    // 위와 같은 방식도 올바른 코드이다.

 

val 참조 자체는 불변일지라도 그 참조가 가리키는 객체의 내부 값은 변경될 수 있다는 사실을 기억하라.

 

var answer = 42
answer = "no answer"

// Error : type mismatch (컴파일 오류 발생)

 

var 키워드를 사용하면 변수의 값을 변경할 수 있지만, 변수의 타입은 고정돼 바뀌지 않는다.

 

 

2.1.4   더 쉽게 문자열 형식 지정 : 문자열 템플릿

fun main(args : Array<String>) {
    var name = if (args.isNotEmpty()) args[0] else "Kotlin"
    println("Hello, $name!")
}

 

> 여기서 문제는 변수명 바로 뒤에 한글을 붙여서 사용하면? 코틀린 컴파일러는 영문자와 한글을 한꺼번에 식별자로 인식해서 unresovled reference 오류를 발생 시킨다 (아래코드 참고)

 

 

해결 방법은 {}로 감싸면 된다.