[코틀린(Kotlin) - 2일차 2/?] 코틀린의 특징 - 변수
프로그래밍/코틀린(Kotlin)

[코틀린(Kotlin) - 2일차 2/?] 코틀린의 특징 - 변수

2장에서는 코틀린의 특징에 대해 간략하게 살펴본다. 살펴보는 내용은 아래와 같다.

  • 함수, 변수, 클래스, enum, 프로퍼티
  • 제어 구조
  • 스마트 캐스트
  • 예외 던지기와 예외 잡기

 

변수

코틀린에서 변수는 아래 형태로 정의된다.

코틀린에는 두 가지 형태의 변수 키워드가 존재한다.

  • val: 값을 변경할 수 없는 변수(value)
  • var: 값을 변경할 수 있는 변수(variable)

 

값을 변경할 수 없는 val은 변수 초기화 후엔 값을 변경할 수 없다.

val value : Int = 3
value = 3

val을 선언하는 첫 번째 줄은 문제가 없지만, val의 값을 변경하는 두 번째 줄에서 문제가 발생한다. (IntellJ IDE에서는 Val cannot be ressigned 라는 오류 메세지 띄운다.)

 

반면 var은 자유롭게 값 변경이 가능하다.

var value : Int = 3
value = 3

 

두 형태 모두 변수 선언시 변수 타입은 생략 할 수 있다.

val value = 3

변수 타입을 정의하지 않으면 변수에 대입하는 값에 따라 변수 타입이 자동으로 정해집니다.

 

 

 

왜 번거롭게 val과 var 두 가지 변수 키워드를 만들어 두었을까?

이는 프로그램의 오류를 줄이기 위해서이다. 예를 들어 아래의 코드를 보자.

fun main() {
    val list = ArrayList<Int>()
    list.add(5)

    // side effect가 일어나기 전
    println(list)

    sideEffect(list)

    // side effect가 일어난 후
    println(list)
}

// side effect를 일으키는 함수
fun sideEffect(list: ArrayList<Int>) {
    list[0] += 3
}

아래는 위 코드를 실행한 결과이다. 값 5을 갖고 있는 리스트를 sideEffect 함수에 집어넣었을 때, 리스트의 값이 바뀌는 것을 확인할 수 있다.

[5]
[8]

함수 내부에서 리스트의 값을 변경하였는데, 함수 실행이 끝나도 리스트 값은 여전히 변경된 형태인 것을 확인할 수 있다. 이를 부수 효과(side effect)라고 한다. 부수 효과를 남용하면 함수에 넣었던 값이 어떻게 변하게 되는지 모르기 때문에 코드가 읽기 어려워지고 실수로 인한 오류가 발생할 확률이 높아진다.

 

코틀린은 이를 피하기 위해 val을 이용한 변수 선언을 권장하고 있다. val로 변수를 선언한 경우 변경이 불가능 하기 때문에 sideEffect 함수에서 인자로 받은 리스트의 값을 변경할 때, 오류 메시지를 띄워준다.

 

여기서 이상함을 느낄 수 있을텐데, 위 코드에서는 list를 val로 선언했는데 내부의 값을 변경한 것을 확인할 수 있다. 이는 list가 가리키는 객체는 수정할 수 없지만, list 내부의 값은 수정할 수 있다.

 

val 참조 자체는 불변일지라도 그 참조가 가리키는 객체의 내부 값은 변경될 수 있다

 

 

 

요약

  • 변수는 val 과 var 형태로 선언할 수 있음
  • val은 최초 선언 후 값 변경이 불가능하고, var은 최초 선언 후에도 값 변경이 가능함
  • 코틀린에서는 부수 효과 방지를 위해 val 사용을 권장하고 있음

 

이 글은 Kotilin in action을 참고하여 작성하였습니다.

Kotlin in Action
국내도서
저자 : 드미트리 제메로프(Dmitry Jemerov),스베트라나 이사코바(Svetlana Isakova) / 오현석역
출판 : 에이콘출판사 2017.10.31
상세보기