- null 은 명시적으로
- null 가능성을 타입 시스템으로 강제한다.
- 컴파일 타임에 null 관련 버그 잡기
val name: String = "Hope" // null 불가능
val name: String? = null // nullalbe
- Everything is an Expression
- 거의 모든 것이 값을 반환할 수 있다.
- Statement(문)과 Expression(식)의 구분이 흐릿하다.
- 더 간결한 코드 작성 가능
val value = if(condition) "A" else "B"
// 심지어 try-catch 도 expression
val result = try {
pareInt(input)
} catch (e:Exception){
0
}
// when 도 expression
val message = when (status){
"active" -> "활성"
"inactvie" -> "비활성"
else -> "알 수 없음"
}
- Immutability First (불변성 우선)
- val > var 우선 (자바스크립트 best practice 와 동일)
- 기본은 불면, 필요할 때만 가변.
val name = "Hope" //val 은 불변
var count = 0
count = 1 // 가능.
// 타입을 명시할 수 있으나,
val name: String = "Hope"
val age: Int = 3
// 대부분 생략 가능하고, 컴파일러에서 추론 가능
val name = "Hope"
val age = 3
val price = 10000L
val rate = 3.14
fun add(a:Int, b: Int) = a+ b // Int 반환
- Named Parameters & Default Values
- 함수 호출이 더 명확해짐.
- 오버로딩 대신, 기본 값 사용
// 파라미터에 이름 붙이기
fun createUser(
name:String,
email:String,
age: Int = 0,
isActive: Boolean = true // 기본값
){
println("$name, $email, $age, $isActive")
}
// 함수호출 시, 이름으로 전달 가능
createUser(name="Hope", email="hope@daangn.com")
- Extension Functions(확장함수)
- 유틸리티 함수를 더 자연스럽게 작성.
- 클래스를 수정없이 기능 추가
- 자바스크립트의 프로토타입과 비슷하지만, 더 안전함
// 기존 클래스에 함수 추가
fun String.isEmail(): Boolean {
return this.contains("@")
}
fun Int.toWon(): String {
return "${this}원"
}
// 사용
val email = "hope@daangn.com"
println(email.isEmail()) // true
- Smart Cast (스마트 캐스팅)
- 타입 체크하면서 자동 캐스팅
- type narrowing과 비슷.
fun printLengt(obj: Any){
// null 체크후 자동 캐스팅
if (obj is String){
println(obj.length)
}
}
fun process(value: String?){
// null 체크 후, non-null 로 자동변환
if(value != null){
println(value.length)
}
}
- Data class (간편한 DTO)
- typescript interface 와 비슷.
- DTO/Model 작성이 매우 간단
- 불변 객체 ㅍ ㅐ턴이 기본
data class User(
val id: Long,
val name: String,
val email: String
)
val user1 = User(1, "Hope", "hope@daangn.com")