신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

코틀린에는 변수를 생성할 때 타입을 생략을 해도되고, 생략을 하지 않고 명시해서 생성 할 수 있다. 아래 예제를 살펴본다.

 

fun main(args: Array<String>){
    // 타입을 생략해도 되고...
    val question = "삶, 우주, 그리고 모든 것에 대한 궁극적인 질문"
    val answer = 42
    println("question : $question")
    println("answer : $answer")

    // 타입을 명시해도 됨
    val answer2: Int = 45
    println("answer2 : $answer2")

    val yearsToCompute = 7.5e6
    println("yearsToCompute : $yearsToCompute")

    // 초기화를 하지 않고, 변수를 생성하고 싶다면 타입을 명시해줘야 한다.
    val answer3: Int
    answer3 = 50
    println("answer3 : $answer3")
}
​

타입을 생략을 하면, 코틀린 컴파일러의 타입 추론(Type inference)를 통해, 알아서 타입을 지정해준다. 프로그래머가 직접 타입을 명시해줘도 상관없다.

 

4번째줄처럼 타입을 생략하거나, 9번째줄처럼 Int라고 직접 타입을 선언해도 된다. 12번째 줄을 살펴보면, 컴파일러는 7.5e6의 e를 보고 해당 변수(yearsToCompute)를 Double 타입으로 지정한다.

 

만약, 16번째 줄처럼 초기화를 하지않고, 변수를 생성하고 싶다면, 그 뒤에 반드시 타입을 명시해줘야 한다. 그리고 밑에서 해당 변수를 초기화해준다. 

 

실행 결과

question : 삶, 우주, 그리고 모든 것에 대한 궁극적인 질문

answer : 42

answer2 : 45

yearsToCompute : 7500000.0

answer3 : 50

 

 

 

 

val과 var의 차이점

val과 var를 사용하여 생성할 수 있다. 이 둘의 차이점은 변경이 가능(mutable)하냐? 변경이 불가능(immutable)하냐?로 나눌 수 있다. 무슨말인지 모르겠다면, 아래 예제를 살펴본다.

 

fun main(args: Array<String>){
    // val : value의 약어, 변경 불가능(immutable)한 변수 (자바로 치면 final에 해당한다.)
    val message = "Hello"
    //message = "world" // 문법 오류
    println("meaasge : $message")

    // var : variable의 약어, 변경이 가능(mutable)한 변수 (자바로 치면 일반 변수와 같다.)
    var myNum = 40
    myNum = 30
    println("myNum : $myNum")
}​

val은 value의 약어로 변경이 불가능한 변수를 말한다. 영어로는 immutable이라고 한다. 반대로

var는 variable의 약어로 변경이 가능한 변수를 말한다. 영어로는 mutable이라고 한다.

 

4번째 줄과 같이 val로 선언한 message라는 변수를 다시 재정의 하려하면 에러가 발생한다.

 

참고. 모든 변수를 val로 선언하고, 나중에 꼭 필요할 때만 var를 사용하는 것을 추천한다.

 

val의 특징 1

val은 한번만 초기화 되는 것이 맞다. 컴파일러가 문맥을 살펴봤을때 한번만 초기화 되는것이 맞다면 상황에 따라 val를 여러 값으로 초기화 할 수 있다. 글로만 봐서는 무슨소린지 이해하기 힘들기 때문에 아래 예제를 살펴본다.

fun main(args: Array<String>){
    val msg:String
    if (isSuccess()){
        msg = "Success"
    }else{
        msg = "Fail"
    }
    println("msg : $msg")
}​

 

실행결과

msg : Success

 

val의 특징 2

val은 변경이 불가능한 것이 맞다. 하지만, 참조가 가리키는 객체의 내부값은 변경이 가능하다. 예를들어,

fun main(args: Array<String>){
    val myArray = arrayListOf("Java") // val로 초기화하여 immutable한 변수를 생성
    myArray.add("Python") // 참조가 가르키는 객체 내부를 변경 가능
    println("myArray : $myArray")
}
​

3번째줄을 살펴보자. 리스트의 경우, 참조가 가리키는 객체의 내부값을 변경이 가능하다는 것을 확인 할 수 있다.

 

실행결과

myArray : [Java, Python]

 

var의 특징 1

var는 값을 변경할 수 있다. 하지만, 다른 타입의 값을 넣을 수는 없다. 처음에 Int 타입으로 초기화를 했다면, 그 뒤에 Int타입으로만 변경이 가능하다. 만약 String으로 재정의하면 Type mismatch라는 Error를 확인 할 수 있을 것이다. 예제를 살펴보자.

fun main(args: Array<String>){
    var answer = 45
    //answer= "no answer" // Error : Type mismatch
    println("answer : $answer")
}​

굳이 타입을 바꾸고 싶다면, 강제 형변환(coerce)을 통해 가능하다.

 

실행 결과

answer : 45

 

본 글은 Dmitry Jemerov, Svetlana Isakova의 "Kotlin in action" 책을 참고하여 작성한 글입니다.

 

다른 글

2019/02/03 - [Language/Kotlin] - 코틀린(Kotlin)이란 무엇인가? 정적 타입 지정 언어

 

코틀린(Kotlin)이란 무엇인가? 정적 타입 지정 언어

코틀린은 자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어입니다. 간결하고, 실용적이며 자바와의 상호운용성(interoperability)을 중시하는 언어입니다. 현재 자바가 사용되는 곳이라면 거의 대부분 코틀린을..

hongku.tistory.com

2019/02/04 - [Language/Kotlin] - 코틀린의 메소드 사용방법(Kotlin)

 

코틀린의 메소드 사용방법(Kotlin)

코틀린에서 메소드를 만드는 방법을 알아보고, 반환값이 있는 메소드 생성하는 법과 반환값이 없는 메소드 생성하는 법을 살펴본다. 그리고, 자바와 달리 코틀린에서만 사용가능한 메소드 정의 법(식이 문장인 메..

hongku.tistory.com

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기