반응형
코틀린 원시타입
- 원시 타입(Primitive type) : 값이 들어감
- 참조 타입(Reference type) : 객체 위치 값
정수의 Collection을 정의하고 싶다
- 자바 : Collection<Integer> // 원시 타입 값을 감쌀 래퍼 타입을 사용해서 참조 타입을 만듬
- 코틀린 Collection<Int> // 원시 타입과 래퍼 타입 구분 없음
원시 타입과 참조 타입이 같다면 코틀린은 항상 객체로 표현하나?
- 놉 효율적인 방식으로 표현됨.
- 코틀린 Int → 자바 int로 컴파일
- 자바 원시 타입은 null이 안됨. 따라서 코틀린 int? 경우 자바 Integer로 됨.
- int aa = null x
- Integer aa = null o
- 제네릭 클래스에서 사용하는 경우에는 자바 Integer로 됨.
- JVM은 제네릭의 타입 인자로 원시 타입을 허용하지 않음.
- 원시 타입으로 하고 싶으면, 서드파티 lib 쓰거나, 배열 사용
코틀린은 모든 원시 타입에 대한 변환 함수를 제공(Boolean 제외)
- ex. toInt(), toLong() 등등
원시 타입 리터럴
- Long : 123L
- Double : 2.0, 1.2e10
- Float : 123.4f, .456F
- 16진수 : 0xbdcd
- 2진수 : 0b0010
- 리터럴 중간에 밑줄(_)을 넣을 수 있음 (ex. 1_000_000_000)
- 컴파일러가 자동 변환도 해줌. 산술 연산자도 값을 받을수 있게 오버라이드하고 있음
Any
- 자바 Object가 최상위 타입이듯, 코틀린은 Any가 조상 타입
- 자바 Object는 참조 타입만 최상위이지만, 코틀린 Any는 원시 타입을 포함한 조상 타입
- Any를 사용하면 자바 바이트코드의 Object로 컴파일 됨
- toString, equals, hashCode 메소드가 있음
Unit
- 자바 void와 같은 기능
- Unit과 void의 다른점은?
- Unit은 타입 인자로 쓸 수 있음.
- 제네릭 파라미터를 반환하는 함수를 오버라이드 하면서 반환 타입으로 사용할때 유용
interface Processor<T> {
fun Process(): T
}
class NoResultProcessor : Processor<**Unit**> {
override fun process() {
// 컴파일러가 묵시적으로 return Unit 을 넣어 줌
}
}
Nothing
- 이 함수는 결코 정상적으로 끝나지 않는다.
- 정상 종료되지 않음을 알고 그 함수를 호출하는 코드를 분석할때 사용
- 함수의 반환 타입이나 반환 타입으로 쓰일 타입 파라미터만 쓸 수 있음
fun fail(msg: String): Nothing {
throw IllegalStateException(msg)
}
컬렉션과 배열
- 코틀린 컬렉션이 자바 라이브러리를 바탕으로 만들어졌고 확장 함수를 통해 기능을 추가함
Null과 컬렉션
- List<Int?> : 리스트 안의 값이 널이 될 수 있다.
- List<Int>? : 전체 리스트가 널이 될 수 있다.
- List<Int?>? : 전체 리스트와 각 값이 널이 될 수 있다.
- 널 값을 걸러낸 컬렉션을 만들고 싶다.
- → filterNotNull 함수 제공
읽기 전용과 변경 가능한 컬렉션
- 코틀린 컬렉션과 자바 컬렉션을 나누는 중요 특성 하나는 코틀린에서는 컬렉션의 데이터에 접근하는 인터페이스와 데이터를 변경하는 인터페이스를 분리
- kotlin.collections.Collection
- 크기, 어떤 값이 있는지 확인 등 수행
- 원소를 추가하거나 제거 메소드 없음
- 데이터 수정하려면 MutableCollection 사용
- 컬렉션을 변경할 필요가 있을 때만 변경 가능한 버전을 사용하라
- 그림 6.12 처럼, 읽기 전용과 변경 가능 리스트가 같은 컬렉션 객체를 가리키고, 병렬 실행한다면 사용 도중 값이 바뀔수 있다.
- 따라서, 읽기 전용 컬렉션이 항상 thread safe 하진 않음
- https://m.blog.naver.com/tmondev/220393974518 (modCount)
- → ConcurrentModificationException
코틀린 컬렉션과 자바
- 코틀린은 모든 자바 컬렉션 인터페이스마다 읽기 전용 인터페이스, 변경 가능 인터페이스 제공
- 변경 가능 인터페이스는 읽기 전용 인터페이스를 확장(상속)
- 표 6.1
- 자바는 읽기 전용, 변경 가능 컬렉션 구분 안함.
- 코틀린에서 읽기 전용 컬렉션을 선언하여도 자바에서는 그 컬렉션의 내용을 변경할 수 있다. (ex. p292)
- 책임은 여러분에게 있다.
컬렉션을 플랫폼 타입으로 다루기
- 자바 코드에서 정의한 타입을 코틀린에서는 플랫폼 타입으로 본다고 했었다
- 플랫폼 타입의 경우 코틀린 쪽에는 널 관련 정보가 없다는 것
- 따라서 널이 될 수 있는 타입 또는 될 수 없는 타입 어느 쪽으로든 사용할 수 있게 허용 (ex. p294~296)
객체의 배열과 원시 타입의 배열
val room = arrayOf("A", "B", "C")
val ****room2 = arrayOfNulls<String>(100) // 100 크기의 모든 원소가 Null인 배열
val room3 = Array<String>(26) { i -> ('a' + i).toString() }
// 크기가 26이고 람다를 인자로 받아서 원소를 초기화
- 컬렉션을 배열로 변환하고 싶다
- → toTypedArray
- Array<Int> 박싱된 정수의 배열 (제네릭 타입이니까)
- 원시 타입의 배열이 필요하다면? IntArray, ByteArray, BooleanArray 등 제공
- 자바 원시 타입 배열인 int[], byte[] 등으로 컴파일 됨
- 박싱된 컬렉션이나 배열이 있다면 toIntArray 메소드를 사용해 박싱하지 않은 배열로 변환할 수 있다.
반응형
'코틀린 & Java > 코틀린인액션' 카테고리의 다른 글
Kotlin == 비교연산자 오버로딩 (0) | 2023.05.09 |
---|---|
Kotlin Plus 산술연산자 오버로딩 (0) | 2023.05.09 |
코틀린 타입 종류 Null가능성 (0) | 2023.03.27 |
[Kotlin] 스코프 펑션(Scoepe Function) (0) | 2023.03.23 |
[Kotlin] 람다에 대해 알아보자(2) (0) | 2023.03.23 |