[Kotlin] 새차원의 코틀린 강좌(3)

새차원의 코틀린 강좌 - Basic Type


기본 타입
  • 코틀린에서 모든 것은 객체임 (자바의 경우는 primitive type과 구분)
  • 모든 것에 멤버함수나 프로퍼티를 호출 가능하다는 의미에서…



숫자
  • 자바의 숫자형과 거의 비슷하게 처리
  • 코틀린에서 Number는 클래스임, java의 privitive type에 직접 접근할 수 없음
  • 자바에서 숫자형이던 char가 코틀린에서는 숫자 형이 아님
img



리터럴(Literal)
  • 10진수 : 123 (Int, Short)
  • Long : 123L
  • Double : 123.5, 123.5e10
  • Float : 123.5f
  • 2진수 : 0b00001011
  • 8진수 : 미지원 (Java는 지원 : int i = 017;)
  • 16진수 : 0X0F



Underscores in numeric literals (since 1.1)
1
2
3
4
5
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010



Representation
  • 자바 플랫폼에서 숫자형은 JVM primitive type으로 저장됨
  • Nullable이나 제네릭의 경우에는 박싱(Integer 클래스로 변환)됨
  • 박싱된 경우 identitiy를 유지 하지 않음
  • 코틀린 코드를 바이트 코드로 변환한 후 디컴파일하면 자바 코드를 확인할 수 있다.
  • === 연산 : 같은 객체인가 판별 (instanceof 메서드인가?)
1
2
3
4
5
6
7
8
9
val a: Int = 10000
val b: Int = 10000
println("a === b ${a === b}") // true
println("a == b ${a == b}") // true

val c: Int? = 10000
val d: Int = 10000
println("c === d ${c === d}") // false
println("c == d ${c == d}") // true



Explicit Conversions
  • 작은 타입은 큰 타입의 하위 타입이 아님, 즉 작은 타입에서 큰 타입으로의 대입이 안됨
1
2
3
4
val a: Int = 1      // A boxed Int
val b: Long = a // 오류
val b: Long = a.toLong()
println(a == b) // 오류
  • 명시적으로 변환을 해 주어야 함
1
val i: Int = b.toInt() // OK

+ 직접 테스트해본 결과 작은 변수를 큰 변수로 캐스팅하려고 하면 오버플로우가 발생한다.



문자 (Characters)
  • Char는 숫자로 취급 되지 않음
  • 자바는 아스키코드 값(unsigned int)으로 처리 됨
1
2
3
4
5
6
7
8
9
10
11
fun check1(c: Char) {
if (c == 1) { } // error
}

fun check2(c: Char) {
if (c == 'a') { } // OK
}

fun main(args: Array<String>) {
print('0'.toInt()) // print 48
}



배열
  • 배열은 Array 클래스로 표현됨
  • get, set ([] 연산자 오버로딩 가능)
  • size 등 유용한 멤버 함수 포함
1
2
3
4
var array: Array<String> = arrayOf("코틀린", "강좌")
println(array.get(0))
println(array[1])
println(array.size)



배열 생성
  1. Array의 팩토리 함수 이용
1
val a = Array(5, { i -> i.toString() }) // i : 0 ~ 4
  1. arrayOf() 등의 라이브러리 함수 이용
1
val b = arrayOf("0", "1", "2", "3", "4")



특별한 Array 클래스
  • Primitive 타입의 박싱 오버헤드(제너릭이나 레퍼런스 타입으로 변환되는 것)를 없애기 위한 배열
  • IntArray, ShortArray, LongArray, CharArray
  • Array를 상속한 클래스들은 아니지만, Array와 같은 메소드와 프로퍼티를 가짐
  • size 등 유용한 멤버 함수 포함
1
2
3
4
5
val x: IntArray = intArrayOf(1, 2, 3)
x[0] = 6
println(x.get(0))
println(x[0])
println(x.size)



문자열
  • 문자열은 String 클래스로 표현
  • String은 characters로 구성됨
  • s[i] 와 같은 방식으로 접근 가능 (immutable 이므로 변경 불가)
1
2
3
4
5
var x: String = "Kotlin"
println(x.get(0))
println(x[0])
println(x.length)
for (c in x) { println(c) }



문자열 리터럴
  • escaped string (“Kotlin”)
    • 전통적인 방식으로 Java String과 거의 비슷
    • Backslash를 사용하여 escaping 처리
  • raw string (“””Kotlin”””)
    • escaping 처리 필요 없음
    • 개행 이나 어떠한 문자 포함 가능
1
2
3
4
5
6
7
8
9
10
val s1 = "Hello, world!\n"

val s2 = """
"'이것은 코틀린의
raw String
입니다.'"
"""

print(s1)
print(s2)

“”” “”” 사이에 탭도 인식됨. 그래서 에디터 제일 왼쪽에 붙여야 원하는대로 나옴 (기존에 \사용했던 모든 것들 그냥 그대로 쓸 수 있다는 것!)


출처 : 새차원의 코틀린 강좌 https://www.inflearn.com/course/%EC%BD%94%ED%8B%80%EB%A6%B0-%EA%B0%95%EC%A2%8C-%EC%83%88%EC%B0%A8%EC%9B%90/

Share