타입 시스템(Type System)이란?
널 가능성, 코틀린에서의 null에 대한 접근 방법은 가능한 한 실행 시점에서 컴파일 시점으로 옮기는 것이다. 널이 될 수 있는지 여부를 타입 시스템에 추가함으로써 컴파일러가 여러 가지 오류를 컴파일 시 미리 감지하여 실행 시점에 발생할 수 있는 예외 가능성을 줄일 수 있다.
따라서 타입 시스템이란 널이 될 수 있는 타입을 명시적으로 지원하는 것이다. 널이 될 수 있는 변수에 대해 메소드 호출을 하지 못하게 함으로써 많은 오류를 방지한다.
NULL이 될 수 있는 타입
- 코틀린의 모든 타입은 기본적으로 널이 될 수 없는 타입이다.
- 널이 될 수 있는 타입인 변수에 대해 메서드를 호출하면 NPE(NULL Point Exception)가 발생할 수 있어서 코틀린은 이러한 메서드 호출을 금지함으로써 NPE발생을 예방한다.
? - 널이 될 수 있는 타입을 명시적으로 지원
// var a:Int = null -> error
var a:Int? = null
!! - NULL이 될 수 있는 타입의 변수이지만, 현재 NULL이 아님을 주장
var b:Int? = 10
// var c:Int = b -> error
var c:Int = b!!
?. - 안전한 호출 연산자
- 널 검사와 메서드 호출을 한 번의 연산으로 수행한다.
method?.bar()
-> method가 널이면 bar함수의 호출이 무시되고 널이 결과 값이 된다.
-> method가 널이 아니면 bar함수의 실행 결과 값을 반환한다.
?: - 엘비스 연산자
- 널 대신에 사용할 default 값을 지정할 때 편리한 연산자
fun method(s: String?) {
val t: String = s ?: "대신할 문구입니다."
}
이런식으로 사용할 수도 있고 엘비스 연산자의 우항에 return, throw 등의 연산을 넣을 수도 있다.
as? - 안전한 캐스트
- 어떤 값을 지정한 타입으로 캐스트하고, 변환할 수 없다면 null을 반환하는 연산자
method as? Type
- method is Type이면 method는 Type으로 변환하고 아니라면 널을 반환한다.
let함수
- 안전한 호출 연산자와 함께 사용하면 원하는 식을 평가해서 결과가 널인지 아닌지 검사한 후 그 결과를 변수에 넣는 작업을 한줄로 처리할 수 있다.
- 람다식으로 중괄호를 채워 이용한다.
- 스스로의 객체를 인자로 받아 사용한다.
- 또한 중괄호 내부에서 해당 객체를 it키워드로 호출할 수 있다.
fun main() {
val a:String = "a"
a.plus("e").let { it. plus("1"); print(it) }
}
lateinit 변경자 - 프로퍼티를 나중에 초기화
- 나중에 초기화할 프로퍼티는 항상 var이여야 한다.
- val은 final필드이므로, 생성자 안에서 반드시 초기화해야 한다.
class MyTest {
private lateinit var myService: MyService
@Before
fun setUp() {
myService = MyService()
}
@Test
fun testAction() {
Assert.assertEquals("foo", myService.performAction())
}
}
reference - https://hororolol.tistory.com/572, https://kotlinlang.org/docs/basic-syntax.html, https://meoru-tech.tistory.com/36
'Back-end' 카테고리의 다른 글
| HTTP Method & Patch 등장에 따른 Dispatcher Servlet의 변화 (0) | 2022.08.02 |
|---|---|
| [Kotlin] Kotlin + Springboot 에서의 validation (0) | 2022.04.27 |
| 카카오 소셜 로그인 With Front (React) (2) | 2022.01.26 |
| [Spring boot] multipart, form-data, requestPart 테스트 코드 작성하기 (0) | 2022.01.01 |
| [Spring boot] 문자 SMS 인증 구현하기(2) (0) | 2021.12.22 |