Rooted In Develop

Kotlin - 타입 시스템 본문

Back End/Kotlin

Kotlin - 타입 시스템

RootedIn 2023. 5. 6. 19:48

널 가능성

fun strLen(s: String) = s.length // null 전달 불가
fun strLen(s: String?) : Int = if (s != null) s.length else 0 // null 전달 가능

- 널이 될 수 있는 값을 널이 될 수 없는 타입의 변수에 대입 불가
- 널이 될 수 있는 타입의 값을 널이 될 수 없는 타입의 파라미터를 받는 함수에 전달 불가

안전한 호출 연산자 : ?.

fun managerName(employee: Employee): String? = employee.manager?.name

엘비스 연산자 : ?:

fun foo(s: String) {
    val t: String = s ?: ""
}

- null 대신 디폴트 값을 지정할 때 사용

안전한 캐스트 : as?

- as : 대상 타입으로 캐스팅하는 연산자
- as? : 대상 타입으로 캐스팅 불가시 null 반환

널 아님 단언 : !!

- 어떤 값이든 널이 될 수 없는 값으로 변경
- null 인경우 NullPointException 발생

let 함수

email?.let { email -> sendEmailTo(email) }

- null 이 아닌 경우만 람다식 호출하도록 활용

지연 초기화 (late-initialized)

class MyService {
    fun preformAction(): String = "foo"
}
class MyTest {
    private lateinit var myService: MyService // lateinit 선언
    @Before fun setUp() {
        myService = MyService() // 메서드에서 프로퍼티 초기화
    }
    @Test fun testAction() {
        Assert.assertEquals("foo", myService.performAction()) // null 검사 없이 수행
    }
}

nullable 객체의 확장 함수

- String? 타입에는 isNullOrEmpty, isNullOrBlank 메서드 존재, 안전한 호출하지 않아도 가능

fun String?.isNullOrBlank(): Boolean = this == null || this.isBlank()

타입 파라미터의 널 가능성

fun <T> printHashCode(t: T) {
    println(t?.hashCode()) // 안전한 호출
}
fun <T: Any> printhashCode(t: T) { // null이 될 수 없는 타입
    println(t.hashCode())
}

원시 타입

- 정수 타입 : Byte, Short, Int, Long
- 부동소수점 수 타입 : Float, Double
- 문자 타입 : Char
- 불리언 타입 : Boolean

숫자 변환

- 자동 변환 불가
- toByte(), toShort(), toChar() 등의 메소드로 변환 함수가 제공

최상위 타입

- Java의 최상위 타입 : Object
- Kotlin의 최상위 타입 : Any

Unit 타입

- 아무것도 반환하지 않는 타입
- Java의 Void 타입은 null도 포함하기 때문에 항상 return null이 필요함

Nothinig 타입

- 테스트 코드 등에서 예외를 던지는 케이스처럼 정상적으로 종료되지 않을 경우에 명시적으로 선언

컬렉션

- 표준 라이브러리에서 null인 값을 필터링하는 filterNotNull 함수 제공
- kotlin.collections.Collection : 읽기 전용 / size, iterator(), contains()
- kotlin.collections.MutableCollection : 변경 가능 / add(), remove(), clear()
- 컬렉션 생성 함수

컬렉션 타입 읽기 전용 타입 변경 가능 타입
List listOf mutableListOf, arrayListOf
Set setOf mutableSetOf, hashSetOf, linkedSetOf, sortedSetOf
Map mapOf mutableMapOf, hashMapOf, linkedMapOf, sortedMapOf
// Java
interface DataParser<T> {
    void parseDate(String input, List<T> output, List<String> errors);
}
// Kotlin
class PersonParser : DataParser<Person> {
    override fun parseDate(input: String, output: MutableList<Person>, errors: MutableList<String?>) {}
}

배열

- arrayOf : 입력한 원소를 기준으로 배열 생성
- arrayOfNulls : 입력한 정수 값 기준으로 모든 원소가 null이고 입력한 값의 크기로 배열 생성
- Array 생성자 : 각 원소가 null이 아닌 배열을 만들어야 하는 경우 사용

val letters = Array<String>(26) { i -> ('a'+i).toString() }
val zeros = IntArray(5) // 기본값 0
val zeros = intArrayOf(0,0,0,0,0)
val squares = IntArray(5) { i -> (i+1) * (i+1) }
>>> println(squares.joinToString()) // 1, 4, 9, 16, 25

- 컬렉션을 배열로 변경 : toTypedArray()

val strings = listOf("a", "b", "c")
println("%s/%s/%s".format(*strings.toTypedArray())) // 스프레드 연산자(*)

 

'Back End > Kotlin' 카테고리의 다른 글

Kotlin - 고차 함수  (0) 2023.06.03
Kotlin - 연산자 오버로딩  (0) 2023.05.27
Kotlin - 클래스, 객체, 인터페이스  (0) 2023.05.01
Kotlin - 람다 프로그래밍  (0) 2023.05.01
Kotlin - 함수 정의와 호출  (0) 2023.04.15
Comments