[Kotlin]변수선언 val, var, const/val과 const val의 차이

dada·2021년 8월 23일
1

Kotlin

목록 보기
1/14
post-thumbnail

✅코틀린 변수 선언

  • val(value의 약자) :
    선언할 데이터의 값이 변경되지 않을 경우 사용
    java의 final특성, 선언 이후에 변수의 값을 바꿀 수 없다.

  • var(variable의 약자) :
    선언할 데이터의 값이 변경될 수 있을 경우 사용
    java의 일반 변수의 특성과 같음

  • const :상수,한 번 초기화하면 내부의 값을 사용할 수는 있지만, 바꿀 수는 없는 것(val과 같은 특성 하지만 불변성의 차이 존재)
    java의 static final특성
    읽기 전용 변수인 val앞에 const키워드를 붙여서 만듦
    val과 읽기 전용인 것은 동일, 하지만 컴파일 시 값이 결정되기 때문에 Int,Double같은 기본형과 문자열인 String만 입력가능

선언해보자

//변수 선언 동시에 초기화->타입생략O
var myName="홍길동"
val age=22

//초기화 없이 변수 선언만->타입생략X
var myName:String
val age:Int

//상수
const val PI=3.141592

✅val 과 const val의 차이?

  • val-불완전한 불변성: 값이 '런타임'시에 결정되는 상수
    • 독립적인 프로그램 수행 중에 프로그램 수행에 따라 값이 바뀔 수 있음
    • 두 숫자를 더한 값을 반환하는 함수를 사용해서 val의 값을 정한다고 했을 때, 이 값은 함수의 parameter로 들어가는 숫자에 따라 언제든지 달라질 수 있음
fun main() {
    val num = sumExam(40, 20)
    println(num)
}

fun sumExam(a: Int, b: Int) = a + b
  • const val-불변성:값이 '컴파일'시에 결정되는 상수
    • 클래스의 생성자에 할당될 수 없으며, String을 포함한 기본 자료형으로만 선언이 가능
    • 함수 내의 지역변수나, 클래스의 속성으로 사용할 수 없음
    • 때문에 const val을 함수나 클래스 내에서 사용하려면 companion object이하 중괄호 안에 선언해야함
    • 이렇게 선언된 const val은 함수나 클래스의 상태에 상관없이 언제나 동일한 값을 가짐
    • 이름을 결정할 때에는 일반적인 변수와 달리 '대문자'와 _ 사용
    • const val의 경우 컴파일 시에 데이터가 메모리에 존재하기 때문에, 사용 시 객체를 생성해서 이에 접근하는 것이 아니고, 클래스명.상수명의 형태를 사용해서 직접 접근
    • 클래스의 객체를 생성한 뒤 사용해야 하는 클래스 속성의 소요시간을 줄임으로 성능의 향상
fun main() {
    println(ExamClass.CONST_VAL)
}

class ExamClass(){
    companion object{
        const val CONST_VAL = 100
    }
}

✅val의 특성

  • val은 한번만 초기화할 수 있는데, 컴파일러가 문맥을 살펴봤을때 한번만 초기화 되는 것이 맞으면 상황에 따라 val을 여러값으로 초기화 가능(val의 초기화 값 후보들이 여러개 될 수 있음)
   val name:String
    if(isName()){
        name="홍길동"
    }else{
        name="전지현"
    }
  • val은 변경이 불가능하지만 val이 가르키는 객체의 내부값은 변경 가능
    fun main(args: Array<String>) {
        val myArray = arrayListOf("java")
        myArray.add("파이썬")
    }

✅var의 특성

  • var은 값 변경이 가능하지만 선언시 사용한 타입으로만 변경 가능
var name="홍길동"
//name=22 불가능

참고
https://hongku.tistory.com/342
https://angangmoddi.tistory.com/201

profile
'왜?'라는 물음을 해결하며 마지막 개념까지 공부합니다✍

0개의 댓글