신규 블로그를 만들었습니다!
코틀린에는 변수를 생성할 때 타입을 생략을 해도되고, 생략을 하지 않고 명시해서 생성 할 수 있다. 아래 예제를 살펴본다.
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)이란 무엇인가? 정적 타입 지정 언어
2019/02/04 - [Language/Kotlin] - 코틀린의 메소드 사용방법(Kotlin)
'Language > Kotlin' 카테고리의 다른 글
코틀린의 enum class 사용방법 (0) | 2019.02.10 |
---|---|
코틀린의 필드와 접근자(getter, setter) 사용방법 (0) | 2019.02.07 |
코틀린의 문자열 템플릿(Kotlin String Templates) (0) | 2019.02.06 |
코틀린의 메소드 사용방법(Kotlin) (0) | 2019.02.04 |
코틀린(Kotlin)이란 무엇인가? 정적 타입 지정 언어 (0) | 2019.02.03 |
최근댓글