Kotlin #2 : field & variable

ByWindow·2022년 5월 12일
0

Kotlin

목록 보기
2/6
post-thumbnail
💡 < 코틀린을 다루는 기술 >의 내용을 참고했습니다.

안전한 프로그래밍


안전한 프로그래밍은,

  • 값을 리턴하는 메서드(함수)가 외부 상태를 변경하지 않는 것 (single responsibility)
  • 참조 투명성(referentially transparent)으로 외부의 영향을 받지 않고, 예외를 던지지 않는다

안전한 프로그래밍의 장점

  • 입력이 같으면 출력도 항상 같으므로, 그 프로그램을 추론하기 쉽다
  • 테스트 시 프로그램 컴포넌트를 외부와 일부러 격리시키 위해 mock을 따로 사용할 필요가 없다
  • 입력과 출력만 있는 함수로 프로그램을 구성하기 때문에 모듈화할 수 있다
  • 프로그램을 완성시키기 위해 여러 함수를 만들고 합성하여 재조합할 수 있다
  • 공유하려는 데이터가 모두 불변이므로, 프로그램이 태생적으로 쓰레드 측면에서 안전하다

field & variable

필드 선언 구문

val name: String = "Frank"
  • 키워드 val을 사용한다 : 뒤에 오는 name이 불변임(참조가 불변임)을 의미한다(Java에서는 final)
  • 타입(String)이 필드 이름 뒤에 오고, 이름(name)과 타입(String)을 콜론(:)으로 구분한다
  • 코드 한 줄의 끝에 세미클론(;)을 쓰지 않아도 된다
  • 타입 추론으로 타입을 생략 가능
    • val name = "Frank"

가변 필드

  • Kotlin은 Java와 달리 초기화하지 않은 참조를 자동으로 null로 설정하고 자유롭게 쓰는 것을 막는다
  • 가변 참조를 사용하기 위해서는 var 키워드를 사용한다
    • var name: String = "Frank"
      ...
      name = "Phillip"
  • 참조가 가리키는 대상이 바뀌지 않으면 프로그램을 추론하기가 쉽기 때문에 var사용을 최대한 피해라

지연 초기화

초기화에 비용이 많이 들어서 참조를 실제로 사용하기 전까지 초기화하고 싶지 않을 때 사용한다

var을 사용하는 경우

var name: String? = null
...
name = getName()
  • kotlin에는 nullable-typenon-nullable-type이 있는데, var을 쓴다면 String? 같은 nullable-type을 써서 초기화해야 한다
lateinit var name: String
...
name = getName()
  • 가변참조를 꼭 지연 초기화 해야 한다면 lateinit 키워드를 사용한다
  • by lazy 와 비교하면 DI(Dependency Injection) 프레임워크 등으로 외부에서 필드 초기화를 진행하는 경우를 제외하고는 장점이 전혀 없다. 지양하자

val을 사용하는 경우

val name: String by lazy { getName() }
// 위와 같은 표현으로 람다를 사용한다면
val name: String by lazy(::getName)
  • 위와 같은 경우, name이라는 참조를 최초롤 사용하는 곳, 즉 최초로 name을 역참조하는 곳에서 getName 함수를 호출한다
profile
step by step...my devlog

0개의 댓글