Kotlin 불변성

불변성이란

  • 책들을 읽다보면 쓰레드 세이프하기 위해선 어떻게 해야하나요?
    • 전역변수를 사용하지 않고 변수 선언을 지역변수로만 선언한다 등등

함수형 프로그래밍은 thread safe하다고 한다. 왜?
https://beanbroker.github.io/2018/11/17/Kotlin/concept_functional/
위를 한번 읽고 오자

1
2
3
class MutableObjet{
val mutableValue : Int = 1
}

위의 클래스를 동시에 여러 스레드에서 호출하는 상황을 생각해보자! mutableValue의 무결한가에 대한 보장은 없다. 해당 값을 변경할수 없게 한다고 가정해본다면 문제는 부분적으로 해결이 가능하다. 하지만 불변한 클래스를 생성하고 모든 변수를 읽기 전용으로 만드는 것은….. 말이 되지 않는다

키포인트 : 불변성은 변경 금지에 대한 것이 아니라 변경 처리에 대한 것이다.

코틀린에서 불변성을 구현해보자

var과 val

var는 단순 변수라 생각된다. 그럼 val의 역할은?

  • 읽기 전용을 강제하며!
  • 초기화 이후에 val 변수에 write할수 없다.
  • 즉 커스텀한 getter 없이는 val 변수를 사용하면 참조 불변성을 얻을수 있다.

example

1
2
val temp:String ="beanbroker"
temp+= "개발자"

위의 코드는 컴파일 되지 않는다. 당연한 결과이다… 패스

val과 const val

  1. val은 읽기 전용, const val은 컴파일 상수
  2. val는 custom getter를 가질수 있으나 const val는 그러하지 않다.
  3. 함수 내부, 클래스 멤버 등 어디서나 vaㅣ 속성을 가질수 있지만, const val는 클래스/Object의 최상위 멤버야만 한다.
  4. 모든 타입에 대한 val 속성을 가질수 있다,(직접 정의한 클래스 또는 모든 종류의 기본 데이터 타입이) const val는 기본 데이터 타입과 문자열만을 사용할수 있다.
  5. const val은 null이 가능한 데이터 타입을 가질수 없다.

4번 sample

1
const val temp = "pair" to "pair"

너무나도 편한 Pair 위와 같이 선언시 Only primitives and String are allowed라는 에러문구가 친절하게 ide에서 말해준다.

불변성의 장점

  1. thread safe
  2. 낮은 커플링
  3. 참조 투명성
  4. 실패 원자성
  5. 컴파일러 최적화
  6. 순수 함수