언어/Kotlin

Kotlin 기초 : 자료형 (Data type)

해리누나 2022. 6. 15. 08:19
728x90
반응형

Int, Boolean, String 등의 모든 자료형은 허용되는 값과 해당 유형의 값으로 가능한 함수 및 연산을 정한다이는 컴파일러가 프로그래밍할 때 조기에 우리를 오류로부터 보호할 수 있는 유일한 방법이기에 중요하다. 컴파일러가 컴파일 중에 자료형을 인지하고 함수와 연산이 자료형에 맞게 쓰였는지 확인한다 (코틀린은 자료형이 정적으로 지정되기 때문에). 동적으로 지정된 언어같은 경우 자료형 검사가 프로그램 실행(런타임)에 일어난다.

 

자료형은 Typ에 대한 데이터가 인코딩(사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것 -위키백과)되는 방법도 서술한다. 이는 프로그램이 컴퓨터의 메모리에 값을 저장하기 때문에 중요하다. 메모리 내 모든 것이 비트(0과 1)로 구성되기 때문에 각 값은 0과 1로 이루어져 있어야 한다. 예로, 숫자의 경우 10진법에서 2진법으로의 변환.

 

1. 숫자 자료형

[ 정수형 ]

Typ Bits 최솟값 최댓값
Byte 8 -128 127
Short 16 -32768 32767
Int 32 -2^31 2^(31)-1
Long 64 -2^63 2^(63)-1

앞서 얘기했듯이, 자료형은 저장되는 값의 범위 외에도 인코딩을 표현하는데 이 인코딩은 필요한 메모리의 양을 표현한다. 따라서 가장 적합한 자료형을 선택하는게 중요하다. 물론 최근 하드웨어는 워낙 빵빵하니 리소스를 절약하기 위해서라기 보다는 우리가 나타내고자 하는 의도를 가능한 한 더 정확하게 표현하기 위해서 중요하다고 보면 된다.

 

예로 사람의 나이를 자료형으로 표현하고 싶다면 Byte, Short, Int, Long 4가지 정수 유형 중 어떤 자료형이 가장 적합할까?사람의 나이는 일단 음수일 수가 없고, 아마 127세 초과이기는 힘들 것이다. 그러면 4 유형 중 아마 Byte가 가장 적합할 것이다. 하지만 음수 전체가 여기서 필요하지는 않다. 이런 이유때문에도 코틀린에서는 Unsigned- Variante 가 존재한다.

 

Typ Bits 최솟값 최댓값
UByte 8 0 255
UShort 16 0 65535
UInt 32 0 2^(31)-1
ULong 64 0 2^(63)-1

UByte 와 UShort를 보면 불필요해진 음수의 범위 만큼 양수의 범위가 증가 한 걸 볼 수 있다. 이 중에서 사람의 나이에 가장 알맞은 자료형은 UByte 일 것이다. Int로 표현해도 물론 상관은 없지만, UByte를 사용한다면 발생 할 수 있는 오류/실수들( 뭐, 예로 음수값을 반환해버린 나이계산 함수)을 사전에 방지할 수가 있게 된다.

 

Unsigned 자료형임을 표현하기 위해 코틀린에선 float 때처럼 새오룬 접미사 U/u를 제공한다.

예시

 *****

   val byte1 = Byte.MIN_VALUE  //1번
   val byte2: Byte = Byte.MAX_VALUE //2번

MAX_VALUE와 MIN_VALUE를 이용해 각 자료형의 최댓값과 최솟값을 알아 볼 수 있다.

(변수 선언 시, 위의 2번처럼 굳이 자료형을 명시하지 않아도 된다. )

 

 

[ 실수형 ]

Typ Bits 최솟값 최댓값
Float 32 1.40129846432481707e-45 3.40282346638528860e+38
Double 64 4.94065645841246544e-324 1.79769313486231570e+308

 예시:

    val a = 1 // int
    val b = 1L // long
    val c = 1u // UInt
    val d = 1uL // ULong
    val e = 10_000_000_000 // 밑줄을 써서 큰 수를 보기 편하게 할 수 있음.
    val f = 1.1f // Float
    val g = 1.1 // Double

 

***** 연산자

    5 + 18 // Int + Int = Int
    30 + 2.5 // Int + Double = Double
    29 + 3L // Int + Long = Long
이름 연산자 예시 (int형) 결과
Addition + 30 + 65 95
Subtraktion - 78 - 40 38
Multiplikation * 6 * 8 48
Division / 9 / 3 3
Modulo
(나머지 반환)
% 18 / 4 2
콤비 +=, -=, *=, /= a += 5 a의 값이 5 증가

 

 

2. 문자 Char / 문자열 String

문자는 자료형 'Char (Character)' 로 표시한다. 단일 문자 리터럴은 작은 따음표로 묶는다. 예를 들어 'a' 나 'c'. 'Hello', 나 'hi'는 당연히 불가, 컴파일러 오류 뜬다. 둘 이상의 문자는 Char이 아닌 String 자료형, 즉 문자열이 제공된다. 문자열은 작은 따음표가 아니라 큰 따음표로 표시한다.

 

    val string1 = "오늘 밤에는" + " " + "비가 내릴 예정" // "오늘 밤에는 비가 내릴 예정"
    val string2 = "H" + "ello"  // "Hello"

+ 를 이용해 기존 문자열을 확장시킬 수 있다.

'h' + 'i'  //컴파일러 에러가 뜬다.

당연히 Char은 확장이 불가능 하다.

Char + Char은 불가능하지만 Char + Int 는 가능하다! 이는 Char이 내부적으로 Int로 표현되기 때문에 가능하다.

컴퓨터는 숫자만을 이해하기 때문에 문자가 숫자로 기억되고 표현되어야 한다. 이를 위해 예로 C는 67, 소문자 a는 97 로 정하자 라는 표준이 정해졌는데 이것이 아스키(ASCII: American Standard Code for Information Interchange)다.

ASCII 코드표

    'A' + 1 // 'B'
    'a' + 2 // 'c'
    'Z' + 1 // '[' 아스키코드표에서 대문자 알파벳 Z 다음에는 특수기호 [

    65.toChar() // 'A' , A는 아스키코드표에서 65로 표현하기 때문에
    (65 + 1).toChar() // 'B'
    (65 + 3).toChar() // 'D'

    35.toChar() // '#'
    48.toChar() // '0'
    (48 + 1).toChar() // '1'

 

 

3. 불리언 Boolean

Boolean은 true 아니면 false, 두 가지의 값을 가질 수 있다.

연산자 이름 예시 결과
|| OR 3 == 1 || 3 == 2 3은 1 또는 2인가? false
&& END 3 >= 1 && 3 <= 10 3은 1보다 크거나 같으며 10보다 작거나 같은가? true
! NOT !(3 == 1 || 3 == 2) 3은 1 또는 2가 아닌가? true

 

연산자 예시 결과
< 3 < 3 false
<= 3 <= 3 true
> 3 > 5 flase
>= 5 >= 3 true
== 3 == 5 false
!= 3 != 5 true

 

 

출처:

내용:

학교 교수님 (Christian Kohls) 강의,

https://kotlinlang.org/docs/basic-types.html#unsigned-integers

접미사 u/U 코드 예시:

https://twitter.com/kotlin/status/1059846511289397248?lang=fi 

아스키 코드표:

https://stepbystep1.tistory.com/10

 

 

728x90
반응형