val은 상수 var은 변수 ? const는 ?

상수와 변수 강의를 들으며

val은 상수이고 var은 변수라고 들었다.

 

그럼 val은 JavaScript의 const랑 비슷한가 ?

Java에서 final 키워드를 붙여서 쓰는 것 같은건가 ?

 

싶어서 좀 더 검색을 해보니

Kotlin 내부에도 var, val, const 키워드가 모두 있었고

이들을 비교하는 글이 많이 있었다.

 

그 중 가장 깔끔했던 글을 토대로 내용을 정리해봤다.

 

Educative Answers - Trusted Answers to Developer Questions

Level up your coding skills. No more passive learning. Interactive in-browser environments keep you engaged and test your progress as you go.

www.educative.io

 

var

var는 가변변수.

var는 런타임 동안 값이 변화 될 수 있는 변수.

// var 초기화 둘 다 가능
// var name = "peter"
var name: String = "peter"

name = "James" // (O)
name = 1 // (X)

var age = 1
age = 5000000000 // (X) var age = 1L 으로 초기화 시 (O)

kotlin은 타입추론이 가능하기 때문에 Java와 달리 타입을 명시하지 않아도 된다.

 

단 한번 정의된 타입과 다른 타입의 값을 넣을 수는 없다.

+)  그냥 정수 값을 넣으면 Int형이 들어가고 Int 범위를 넘어가는 값을 넣을 수 없다.

 

val

val은 불변 변수이자 런타임 상수

val은 런타임에 단 한번만 할당이 이뤄진다.

 

그렇다보니 아래와 같이 런타임 도중 입력을 받아 초기화도 가능하다.

fun main() {
    val a = readln()
    print(a)
}

val은 Java의 final 키워드와 비슷.

 

const

const는 컴파일타임 상수

const의 값은 컴파일 단계에서만 할당이 가능하고,

그렇다 보니 함수나 생성자를 이용하여 할당이 불가능.

const val a = 1
fun main() {
    // const val a = 1 (x)
}

또 지역 함수로 활용이 불가능 했다. (메모리 구조 상 불가능하게 막았지 않았을까)

 

object 키워드와 함께 사용할 수 있다는데,

object Website {
     const val URL = "google"  
     }

 

 

object는 java의 static과 비슷한 개념이라고 한다.

 

 

불변? 상수?

불변과 상수의 개념을 좀 더 정확히 하려고 좀 더 찾아보다 찾은 글.

 

불변과 상수, 혼용되는 표현 깨부수기

맥락을 단순하게 관리하는 것은 복잡성을 줄이고, 잘 동작하는 코드를 만들기에 좋은 접근 방식입니다. 우리는 이를 위해 '불변'을 주로 활용하곤 합니다. 하지만 불변이 실제로 변하지 않을까

velog.io

이 글에서는 '불변 변수' 라는 단어 자체가 옳지 않음을 이야기 하고 있다.

 

불변이 이미 할당된 메모리 공간을 다른 값으로 채워넣지 않음을 뜻하기 때문에

변수에 다른 값을 넣지 못하는 것을 보고 불변 변수라는 것은 옳은 말이 아니다. 라는 것으로 이해했는데,

아직 100프로 이해하지는 못한 것 같다.

 

결과적으로 이 글에서 제안하는 정확한 용어는 아래와 같다.

여기서 말한 대로면

val은 재대입 금지 변수

const는 컴파일 시 평가

 

외국 컬럼을 가져와서 한글 표현이 이상한것도 같고 전혀 익숙치 않은 용어이기 때문에

이 용어를 쓰지는 않겠지만 관련 내용을 이해하고 있는 것은 좋을 것 같다.

 

참조

 

https://kotlinlang.org/docs/properties.html#declaring-properties

https://velog.io/@dabin/Kotlin%EB%B3%80%EC%88%98%EC%84%A0%EC%96%B8-val-var

https://velog.io/@asdhugh1/%EB%B6%88%EB%B3%80%EA%B3%BC-%EC%83%81%EC%88%98-%ED%98%BC%EC%9A%A9%EB%90%98%EB%8A%94-%ED%91%9C%ED%98%84-%EA%B9%A8%EB%B6%80%EC%88%98%EA%B8%B0

'CS > Kotlin' 카테고리의 다른 글

[Kotlin] Intellij에서 코틀린 코드 자바로 변환 하기  (1) 2023.12.06
[Kotlin] 생성자 종류  (3) 2023.12.05
[Kotlin] readLine vs readln  (1) 2023.12.04

+ Recent posts