Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- kotlin
- 코루틴 빌더
- 겨울 부산
- JanusWebRTCServer
- Spring Batch
- 개성국밥
- 깡돼후
- VARCHAR (1)
- vfr video
- PytestPluginManager
- k8s #kubernetes #쿠버네티스
- 달인막창
- 코루틴 컨텍스트
- Value too long for column
- 티스토리챌린지
- python
- JanusWebRTCGateway
- preemption #
- mp4fpsmod
- taint
- 자원부족
- tolerated
- pytest
- table not found
- JanusGateway
- 오블완
- PersistenceContext
- terminal
- JanusWebRTC
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
Archives
너와 나의 스토리
[Kotlin] 코틀린의 원시 타입 본문
반응형
코틀린의 원시 타입
코틀린은 원시 타입과 래퍼 타입을 구분하지 않는다.
원시 타입: Int, Boolean 등
- 자바는 원시 타입(primitive type)과 참조 타입(reference type)을 구분한다.
- 원시 타입
- 예: Int, Boolean 등
- 원시 타입의 변수에는 그 값이 직접 들어간다.
- 참조 타입
- 예: String 등
- 참조 타입의 변수에는 메모리상의 객체 위치가 들어간다.
- 원시 타입의 값에 대해 메서드를 호출하거나 컬렉션에 원시 타입 값을 담을 수 없다.
- 자바는 참조 타입이 필요한 경우 특별한 래퍼 타입으로 원시 타입 값을 감싸서 사용한다.
- 예: Int를 java.lang.Integer로 래핑
- 원시 타입
[Java]
// ArrayList<int> lists = new ArrayList<int>(); -> error
ArrayList<Integer> lists = new ArrayList<>();
- 코틀린은 원시 타입과 래퍼 타입을 구분하지 않으므로 항상 같은 타입을 사용한다.
val list: List<Int> = listOf(1, 2, 3)
- 그렇다면 코틀린은 항상 객체로만 표현하는 건가? 그렇다면 너무 비효율적이지 않을까?
- 대부분의 경우 코틀린의 Int 타입은 자바의 int 타입으로 컴파일된다.
- 이런 컴파일이 불가능한 경우는 컬렉션과 같은 제네릭 클래스를 사용하는 경우뿐이다.
- 예를 들어 Int 타입을 컬렉션의 타입 파라미터로 넘기면 그 컬렉션에는 Int의 래퍼 타입에 해당하는 java.lang.Integer 객체가 들어간다.
숫자 변환
- 코틀린과 자바의 가장 큰 차이점 중 하나는 숫자를 변환하는 방식이다.
- 코틀린은 한 타입의 숫자를 다른 타입의 숫자로 변환하지 않는다.
val i = 1
// val l: Long = i <- error
- 대신 직접 변환 메서드를 호출해야 한다.
val i = 1
val l: Long = i.toLong()
- 코틀린은 모든 원시 타입(boolean 제외)에 대한 변환 함수를 제공한다.
- 표현 범위가 넓은 타입으로도, 좁은 타입으로도 변환할 모든 함수 제공
val x =1
val list = listOf(1L, 2L, 3L)
//println(x in list) -> error
println(x.toLong() in list) // output: true
- 숫자 리터럴을 타입이 알려진 변수에 대입하거나 함수에게 인자로 넘기면 컴파일러가 필요한 변환을 자동으로 넣어준다.
fun foo(l: Long) = println(l)
fun main(args: Array<String>) {
val b: Byte = 1
val l = b +3L
println(l) // output: 4
foo(43) // output: 43
}
Any: 최상위 타입
- 자바에서 Obejct가 참조 타입에 대한 클래스 계층의 최상위 타입이듯 코틀린에서는 Any 타입이 모든 널이 될 수 없는 타입의 조상이다.
- 코틀린에서는 Any가 Int 등의 원시 타입을 포함한 모든 타입의 조상이다.
- Any는 null이 될 수 없는 타입이다.
Unit 타입: 코틀린의 void
- 코틀린의 Unit 타입은 자바 void와 같은 기능을 한다.
- 코틀린의 Unit과 자바 void의 차이점
- Unit은 모든 기능을 갖는 일반적인 타입이며, void와 달리 Unit을 타입 인자로 쓸 수 있다.
- Unit 타입의 함수는 Unit 값을 묵시적으로 반환한다.
- 이러한 특성은 제네릭 파라미터를 반환하는 함수를 오버라이드하면서 반환 타입으로 Unit을 쓸 때 유용하다.
- Unit은 모든 기능을 갖는 일반적인 타입이며, void와 달리 Unit을 타입 인자로 쓸 수 있다.
interface Processor<T> {
fun process(): T
}
class NoResultProcessor : Processor<Unit> {
override fun process() {
// return할 필요 없다.
}
}
Nothing 타입
- 코틀린에는 결코 성공적으로 값을 돌려주는 일이 없으므로 '리턴 값'이라는 개념 자체가 의미 없는 함수가 일부 존재한다.
- 예: 테스트 라이브러리에서 fail 함수 제공, 무한 루프 도는 함수
- 이렇게 정상적으로 끝나지 않는 함수의 경우를 표현하기 위해 코틀린에는 Nothing이라는 특별한 반환 타입이 있다.
fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}
- Nothing을 반환하는 함수를 엘비스 연산자(?:)의 우항에 사용해서 전제 조건(precondition)을 검사할 수 있다.
val address = company.address ?: fail("No address")
출처:
- [Kotlin IN ACTION]
반응형
'Programming Language > Kotlin' 카테고리의 다른 글
[Kotlin] 연산자 오버로딩 (0) | 2021.06.22 |
---|---|
[Kotlin] 컬렉션과 배열 (0) | 2021.06.18 |
[Kotlin] 코틀린 타입 시스템 - ? / !! /.? / as? / let 함수 / lateinit (0) | 2021.06.17 |
[Kotlin] 람다 식(lambda expression)과 멤버 참조 (0) | 2021.06.16 |
[Kotlin] 클래스와 인터페이스2 - 데이터 클래스/클래스 위임/object 키워드 사용 (0) | 2021.06.15 |
Comments