자료형

thsamajiki·2022년 10월 25일
0

Kotlin

목록 보기
2/12

숫자형 자료

Java와의 차이점

Java에서는 Primitive type 은 직접 숫자 리터럴을 가지고 있는 변수가 되었다. 하지만 kotlin 에서는 숫자조차도 Object 이다. 따라서 Int, Long 의 변수조차도 참조값을 갖는 형태이다.

코틀린에서는 var와 val 을 이용해서 변수를 선언할 수 있다. var 는 값을 변화시킬 수 있는, val 는 값을 변화시킬 수 없는 변수라고 쓰여있다. 하지만 더 정확하게 말하자면 val 는 변수가 참조하고 있는 참조값(주소값)을 바꿀 수 없는 변수를 말하는 것이다.여기서 주의할 점은 만약 참조값 자체를 바꾸는게 아니라 참조하고 있는 객체를 업데이트 하는 메서드를 이용하면, 당연히 참조하고 있는 객체가 담고 있는 객체의 속성을 바꿀 수 있다는 점이다.

기본 숫자형 자료

https://velog.velcdn.com/images%2Ftjeong%2Fpost%2F59b9533a-9300-4c18-8cd6-201b3a236ddd%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-21%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.00.59.png

모든 숫자형 자료는 초기화할 때 자료형을 지정하지 않으면, Int로 인식되며, Int 형의 자료범위를 벗어나거나 뒤에 L을 붙이면 Long 으로 인식된다.

https://velog.velcdn.com/images%2Ftjeong%2Fpost%2F6ff33aa5-1f14-4183-91ab-64d82e7cabbe%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-21%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.01.07.png

실수형 자료

IEEE 754 standard 표준에 맞춰 Floating Point 방식으로 실수를 표현한다.

https://velog.velcdn.com/images%2Ftjeong%2Fpost%2F540c44ac-f9b0-443f-b4cf-b7fb4b2d420b%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-21%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.01.03.png

실수형 자료는 초기화 시 Double 로 인식되며, Float 형으로 하기 위해서는 뒤에 F 를 붙여줘야한다. 다른 언어와는 다르게 실수형 자료는 암묵적인 형변환을 지원하지 않다. Double 형이 필요한 곳에는 무조건 Double 형이 들어가야 한다.

https://velog.velcdn.com/images%2Ftjeong%2Fpost%2Fad16b696-9779-417e-9810-6edfa6799dd5%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-21%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.01.36.png

리터럴 상수형

16진수, 2진수 등을 표현할때는 아래와 같이 표현한다.

https://velog.velcdn.com/images%2Ftjeong%2Fpost%2F1079b58a-3633-46e2-844a-2b39b0aebc05%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-21%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.06.37.png

JVM의 숫자 표현

JVM 플랫폼에서 숫자는 int, double 과 같은 primitive type 에 저장된다. 하지만 nullable number 참조자, 제네릭 같은 경우는 Java Integer, Double Class에 감싸져서 저장이 된다.

명시적 형변환(암묵적 형변환 금지)

Kotlin 은 암묵적인 형변환을 지원하지 않는다. 즉, 더 작은 자료형은 큰 자료형에 서브 자료형이 아니라는 것이다. 이는 위에서 설명한 JVM의 숫자표현 때문인데,

val a: Int? = 1 // Integer Class 로 저장.
val b: Long? = a // 암묵적인 형변환, Long Class 로 저장.
print (b == a) // equality 검사 : false

nullable과 제네릭은 java class 로 저장되므로, 암묵적 형변환이 있으면 객체 자체가 변화하는 일이 발생하고, equality 와 identity 검사가 의미를 잃게 된다.

이러한 문제로 kotlin 에서는 암묵적 형변환은 지원되지 않는다. 명시적 형변환을 무조건 해줘야한다.

https://velog.velcdn.com/images%2Ftjeong%2Fpost%2Fded399b1-88e5-4b5d-a514-a91d26179924%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-21%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.24.50.png

연산자

산술 연산자

기본적인 산술 연산자는 일반적인 언어와 동일하다.

Bitwise 연산자

비트 연산자는 c 의 >>, << 와는 많이 다르다.

https://velog.velcdn.com/images%2Ftjeong%2Fpost%2F818b83c3-1efe-4d2a-8560-4474400c1ab1%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-21%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.26.21.png

실수 비교 연산

https://velog.velcdn.com/images%2Ftjeong%2Fpost%2Fcaac2f60-ab84-4f80-81b5-76e1c060094e%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-21%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.29.46.png

Unsigned Integers

https://velog.velcdn.com/images%2Ftjeong%2Fpost%2F71d573c5-b7fa-4437-a835-d5d9bc5a4e74%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-21%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.30.31.png

https://velog.velcdn.com/images%2Ftjeong%2Fpost%2F6e3ee003-04ef-4329-be94-9c77bdbcf0ad%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-21%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.31.42.png

Boolean

||, &&, ! 연산은 똑같다. Boolean? 이 nullable 인것이 다르다.

Characters

Char 자료형으로 표현된다. `` 를 이용해서 표현된다.

String

String 자료형으로 표현되고, "" 를 이용해서 표현된다. String Template 라고 해서 C 의 printf 와 같이 사용되는 용법이 있는데,

https://velog.velcdn.com/images%2Ftjeong%2Fpost%2F359e9403-652a-4a92-b129-d246882a7416%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-21%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.36.14.png

$ 표시를 이용해서 변수를 참조하고, $ 를 String 에서 표현하기 위해서는 맨 마지막과 같이 이용한다.

Array

Array 클래스는 get, set 함수를 가지고 있다. 가령 이런 식이다.

class Array<T> private constructor() {
    val size: Int
    operator fun get(index: Int): T
    operator fun set(index: Int, value: T): Unit

    operator fun iterator(): Iterator<T>
    // ...
}

Array 를 만들기 위해서는 arrayOf() 함수나 arrayOfNulls() 함수를 이용할 수 있다.

https://velog.velcdn.com/images%2Ftjeong%2Fpost%2Fb4c06acb-71bc-483e-a1f4-fac1f6f75f90%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-21%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.35.07.png

is 와 !is

https://velog.velcdn.com/images%2Ftjeong%2Fpost%2F107b5e80-7a47-4859-8cf7-95b364c35074%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-10-21%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.36.49.png

Smart casts

kotlin 자료형에서 암묵적인 형변환을 지원하지 않으므로 명시적 형변환을 써야한다고 말했다. 하지만 is 체크가 있는 경우 컴파일러가 형변환자를 삽입하므로 굳이 개발자가 형변환자를 삽입할 필요가 없다.

fun demo(x: Any) {
    if (x is String) {
    	// val str = x as String
        // print(str.length)
        print(x.length) // Smart cast 로 위의 형변환 작업이 필요없음
    }
}

위 코드에서 x 는 Any 타입으로 어떤 자료형도 올 수 있다. 따라서 if 이하의 x.length 를 실행하려면 val str = x as String 이런 명시적 형변환이 있어야 할 것 같지만, 컴파일러는 이미 if (x is String) 구문에서 x 가 String 형이라는 것을 확인 했으므로 굳이 개바랒가 명시적으로 형변환을 해줄 필요없다는 것이다.

profile
안드로이드 개발자

0개의 댓글