Kotlin

[Kotlin] Types

kahnco 2024. 8. 1. 17:22
반응형

개요

이번 시간에는 코틀린의 타입에 대해서 알아보겠습니다.


Basic Types

코틀린은 기본 타입을 객체로 취급합니다. Java 와는 다르게 모든 것이 객체입니다.


Numbers

 

Integer Types

코틀린은 다양한 크기의 정수 타입을 제공합니다. 각 타입은 고정된 크기와 범위를 가지고 있습니다.

  • Byte
    • 크기: 8비트
    • 범위: -128 ~ 127
val byteValue: Byte = 1
  • Short
    • 크기: 16비트
    • 범위: -32,768 ~ 32,767
val shortValue: Short = 10
  • Int
    • 크기: 32비트
    • 범위: -2^31 ~ 2^31-1
val intValue: Int = 100
  • Long
    • 크기: 64비트
    • 범위: -2^63 ~ 2^63-1
    • 정수 리터럴은 기본적으로 Int 타입입니다. 더 큰 숫자를 표현하기 위해 Long 타입을 사용하려면 리터럴 끝에 L 을 붙입니다.
val longValue: Long = 1000L

Floating-point Types

  • Float
    • 크기: 32비트
    • 유효 숫자: 약 6~7 자리
    • 부동 소수점 실수 리터럴은 기본적으로 Double 타입이기 때문에 Float 타입으로 사용하려면 리터럴 끝에 f 를 붙입니다.
val floatValue: Float = 10.0f
  • Double
    • 크기: 64비트
    • 유효 숫자: 약 15~16자리
val doubleValue: Double = 10.0

Number Literals

코틀린은 다양한 형식의 숫자 리터럴을 지원합니다.

  • 10진수 (Decimal)
val decimalValue = 123
  • 16진수 (Hexadecimal)
val hexValue = 0x0F
  • 2진수 (Binary)
val binaryValue = 0b00001011

숫자 타입 간 변환

코틀린에서는 명시적 변환 함수 (toByte(), toShort(), toInt(), toLong(), toFloat(), toDouble())를 사용하여 숫자 타입 간 변환을 수행합니다.

val intValue: Int = 1
val longValue: Long = intValue.toLong()

연산자 오버로딩

연산자 오버로딩이란 코틀린에서 연산자를 특정 클래스의 메서드로 처리할 수 있게 해주는 기능입니다. 이를 통해 클래스 인스턴스 간의 연산을 더 자연스럽게 표현할 수 있습니다. 

  • 산술 연산자 (Arithmetic Operators)
    산술 연산자는 수학적 연산을 수행하는 데 사용됩니다. 예를 들어, + - * / 등이 있습니다.
data class Point(val x: Int, val y: Int) {
    operator fun plus(other: Point): Point {
        return Point(x + other.x, y + other.y)
    }
}

fun main() {
    val p1 = Point(1, 2)
    val p2 = Point(3, 4)
    val result = p1 + p2
    println(result) // Point(x=4, y=6)
}
  • 비교 연산자 (Comparison Operators)
    비교 연산자는 두 값을 비교하는 데 사용됩니다. 예를 들어, ==, !=, <, >, <=, >= 등이 있습니다.
data class Point(val x: Int, val y: Int)

fun main() {
    val p1 = Point(1, 2)
    val p2 = Point(1, 2)
    println(p1 == p2) // true
    println(p1 != p2) // false
}

data class Point(val x: Int, val y: Int) : Comparable<Point> {
    override operator fun compareTo(other: Point): Int {
        return (x * x + y * y) - (other.x * other.x + other.y * other.y)
    }
}

fun main() {
    val p1 = Point(1, 2)
    val p2 = Point(3, 4)
    println(p1 < p2) // true
}
  • 할당 연산자 (Assignment Operators)
    할당 연산자는 값을 변수에 할당하는 데 사용됩니다. 예를 들어, +=, -=, *=, /= 등이 있습니다.
data class Point(var x: Int, var y: Int) {
    operator fun plusAssign(other: Point) {
        x += other.x
        y += other.y
    }
}

fun main() {
    var p1 = Point(1, 2)
    val p2 = Point(3, 4)
    p1 += p2
    println(p1) // Point(x=4, y=6)
}
  • 인덱스 연산자 (Indexing Operators)
    인덱스 연산자는 배열이나 리스트처럼 인덱스로 접근하는 데 사용됩니다. get과 set 함수를 오버로딩할 수 있습니다.
class Matrix(private val rows: Int, private val cols: Int) {
    private val data = Array(rows) { IntArray(cols) }

    operator fun get(row: Int, col: Int): Int {
        return data[row][col]
    }

    operator fun set(row: Int, col: Int, value: Int) {
        data[row][col] = value
    }
}

fun main() {
    val matrix = Matrix(2, 2)
    matrix[0, 0] = 1
    println(matrix[0, 0]) // 1
}
  • 호출 연산자 (Invoke Operator)
    호출 연산자는 객체를 함수처럼 호출할 수 있게 합니다. invoke 함수를 오버로딩합니다.
class Greeter {
    operator fun invoke(name: String) {
        println("Hello, $name!")
    }
}

fun main() {
    val greeter = Greeter()
    greeter("Kotlin") // Hello, Kotlin!
}
  • 단항 연산자 (Unary Operator)
    • 단항 연산자는 하나의 피연산자에 대해 연산을 수행합니다. 예를 들어, +a, -a, !a, ++a, --a 등이 있습니다.
    • unaryPlus, unaryMinus, not 함수: +a, -a, !a 연산자를 오버로딩합니다.
    • inc, dec 함수: ++a, --a 연산자를 오버로딩합니다.
data class Point(val x: Int, val y: Int) {
    operator fun unaryMinus(): Point {
        return Point(-x, -y)
    }
}

fun main() {
    val p = Point(1, 2)
    val negativeP = -p
    println(negativeP) // Point(x=-1, y=-2)
}

Unsigned Integer Types

코틀린은 부호 없는 숫자 타입도 제공합니다. 부호 없는 타입은 모두 0 이상의 값을 가집니다.

  • UByte
    • 크기: 8비트
    • 범위: 0 ~ 255
  • UShort
    • 크기: 16비트
    • 범위: 0 ~ 65,535
  • UInt
    • 크기: 32비트
    • 범위: 0 ~ 2^32-1
  • ULong
    • 크기: 64비트
    • 범위: 0 ~ 2^64-1

숫자 리터럴 표기법

숫자 리터럴은 kotlin.text 패키지의 String.format 함수를 사용하여 형식을 지정할 수 있습니다.

val number = 1_000_000 // 읽기 쉽게 언더스코어 사용 가능
val formatted = String.format("%,d", number) // 1,000,000

특별한 값

  • NaN: 숫자가 아닌 값
  • POSITIVE_INFINITY: 양의 무한대
  • NAGATIVE_INFINITY: 음의 무한대

위 값들은 부동소수점 연산에서 발생할 수 있는 특별한 값입니다.

val positiveInfinity = Double.POSITIVE_INFINITY
val negativeInfinity = Double.NEGATIVE_INFINITY
val notANumber = Double.NaN

Boolean Types

코틀린에서 Boolean 타입은 true 또는 false 두 가지 값을 가질 수 있습니다. 이 타입은 논리적 조건을 나타내는 데 사용됩니다.

 

Boolean Literal

boolean Literal 은 truefalse 두 가지 값으로 표현됩니다.

val isTrue: Boolean = true
val isFalse: Boolean = false

 

Boolean Operator

코틀린에서는 Boolean 값을 조작하는 다양한 논리 연산자를 제공합니다.

  • 논리 AND (&&)
  • 논리 OR (||)
  • 논리 NOT (!)

Characters

코틀린에서 Char 타입은 단일 문자를 나타냅니다. Char 리터럴은 작은따옴표로 묶습니다.

val letter: Char = 'A'

 

 

문자 리터럴

문자 리터럴은 작은따옴표로 묶이며, 단일 유니코드 문자를 포함할 수 있습니다.

val charA: Char = 'A'
val char1: Char = '1'
val charNewLine: Char = '\n' // 이스케이프 시퀀스

 

이스케이프 시퀀스

문자 리터럴에는 특수 문자를 나타내기 위한 이스케이프 시퀀스를 사용할 수 있습니다. 몇 가지 주요 이스케이프 시퀀스는 다음과 같습니다.

  • \n: 새 줄
  • \t: 탭
  • \b: 백스페이스
  • \r: 캐리지 리턴
  • \': 작은따옴표
  • \": 큰따옴표
  • \\: 백슬래시
  • \uFFFF: 유니코드 문자

문자와 숫자 간 변환

Char 타입은 유니코드 값으로 나타내어지므로, 이를 숫자 타입으로 변환할 수 있습니다.

val charA: Char = 'A'
val intA: Int = charA.toInt()
println(intA) // 65

 

 

반대로, 숫자 값을 Char 타입으로 변환할 수도 있습니다.

val intA: Int = 65
val charA: Char = intA.toChar()
println(charA) // 'A'

 

문자 연산

코틀린에서는 문자를 비교하거나 연산할 수 있습니다.

 

  • 비교 연산
val a: Char = 'A'
val b: Char = 'B'
println(a < b) // true
  • 산술 연산
val a: Char = 'A'
val b: Char = a + 1
println(b) // 'B'
fun main() {
    val charA: Char = 'A'
    val charNewLine: Char = '\n'
    val charUnicode: Char = '\u0041' // 'A'

    println("Character A: $charA")
    println("Character New Line: $charNewLine")
    println("Character Unicode A: $charUnicode")

    // Character to Int conversion
    val charB: Char = 'B'
    val intB: Int = charB.toInt()
    println("Int value of 'B': $intB")

    // Int to Character conversion
    val intC: Int = 67
    val charC: Char = intC.toChar()
    println("Character value of 67: $charC")

    // Character comparison
    val charX: Char = 'X'
    val charY: Char = 'Y'
    println("'X' < 'Y': ${charX < charY}") // true

    // Character arithmetic
    val charD: Char = 'D'
    val nextChar: Char = charD + 1
    println("Next character after 'D': $nextChar") // 'E'
}

 


Strings

코틀린에서 문자열은 불변 객체로, String 클래스로 표현됩니다. 문자열은 큰따옴표로 묶어 표현합니다.

val text: String = "Hello, Kotlin!"

 

문자열 리터럴

코틀린에서는 두 가지 유형의 문자열 리터럴을 지원합니다.

  • 이스케이프 문자열 (Escaped String)
    • 이스케이프 문자열은 기존의 프로그래밍 언어와 마찬가지로 이스케이프 문자를 사용할 수 있는 문자열입니다.
    • 이스케이프 시퀀스의 예제는 Characters 문서의 내용을 참고하시기 바랍니다.
  • 원시 문자열 (Raw String)
    • 원시 문자열은 삼중 따옴표로 묶으며, 여러 줄의 텍스트를 포함할 수 있습니다. 원시 문자열에서는 이스케이프 문자가 적용되지 않습니다.
val rawString = """
    fun main(args: Array<String>) {
        println("Hello, World!")
    }
"""

 

 

문자열 템플릿

코틀린은 문자열 템플릿을 지원하여 문자열 내에 변수와 표현식을 포함할 수 있습니다. 문자열 템플릿은 $ 기호를 사용하여 변수를 삽입하거나, ${} 안에 표현식을 삽입할 수 있습니다.

val name = "Kotlin"
val greeting = "Hello, $name!"
println(greeting) // Hello, Kotlin!

val a = 10
val b = 20
println("The sum of $a and $b is ${a + b}") // The sum of 10 and 20 is 30

 

문자열 연산

코틀린에서는 문자열에 대한 다양한 연산을 제공합니다. 

  • 문자열 연결: 문자열을 + 연산자로 연결할 수 있습니다.
val firstName = "John"
val lastName = "Doe"
val fullName = firstName + " " + lastName
println(fullName) // John Doe
  • 문자열 길이: length 속성을 사용하여 문자열의 길이를 얻을 수 있습니다.
val text = "Hello, Kotlin!"
println("Length of text is ${text.length}") // Length of text is 13
  • 접근 연산자: 문자열의 특정 문자에 인덱스를 사용하여 접근할 수 있습니다.
val text = "Hello, Kotlin!"
val firstChar = text[0]
println(firstChar) // H
  • 문자열 반복: repeat 함수를 사용하여 문자열을 반복할 수 있습니다.
val repeatedText = "Kotlin ".repeat(3)
println(repeatedText) // Kotlin Kotlin Kotlin

Arrays

코틀린에서 배열은 동일한 타입의 값을 저장할 수 있는 컨테이너입니다. 배열은 고정된 크기를 가지며, 인덱스를 사용하여 요소에 접근할 수 있습니다. 코틀린의 배열은 Array 클래스와 다양한 타입별 배열 클래스를 사용하여 생성됩니다.

 

배열 생성

코틀린에서 배열을 생성하는 방법에는 여러 가지가 있습니다.

  • arrayOf
val intArray = arrayOf(1, 2, 3, 4, 5)
val stringArray = arrayOf("a", "b", "c")
  • 특정 타입의 배열 생성 함수
val intArray = intArrayOf(1, 2, 3, 4, 5)
val doubleArray = doubleArrayOf(1.1, 2.2, 3.3)
val charArray = charArrayOf('a', 'b', 'c')
  • Array 클래스 생성자
val array = Array(5) { i -> i * 2 } // [0, 2, 4, 6, 8]

 

배열의 요소 접근

배열의 요소에 접근하고 수정하는 방법은 다음과 같습니다.

val array = arrayOf(1, 2, 3, 4, 5)
val firstElement = array[0] // 첫 번째 요소에 접근
array[1] = 10 // 두 번째 요소를 10으로 변경

 

배열의 크기

배열의 크기는 size 속성을 사용하여 얻을 수 있습니다.

val array = arrayOf(1, 2, 3, 4, 5)
println(array.size) // 5

 

배열의 반복

배열의 요소를 반복하는 방법은 여러 가지가 있습니다.

  • for loop
val array = arrayOf(1, 2, 3, 4, 5)
for (element in array) {
    println(element)
}
  • forEach 함수
val array = arrayOf(1, 2, 3, 4, 5)
array.forEach { element ->
    println(element)
}

 

배열의 기타 함수

코틀린의 배열은 다양한 유용한 함수를 제공합니다.

 

  • first, last: 배열의 첫 번째와 마지막 요소를 가져옵니다.
val array = arrayOf(1, 2, 3, 4, 5)
println(array.first()) // 1
println(array.last()) // 5
  • filter: 조건에 맞는 요소만을 포함하는 새로운 배열을 반환합니다.
val array = arrayOf(1, 2, 3, 4, 5)
val evenArray = array.filter { it % 2 == 0 }
println(evenArray) // [2, 4]
  • map: 각 요소에 주어진 변환 함수를 적용한 결과로 새로운 배열을 만듭니다.
val array = arrayOf(1, 2, 3, 4, 5)
val squaredArray = array.map { it * it }
println(squaredArray) // [1, 4, 9, 16, 25]

 

다차원 배열

코틀린은 다차원 배열을 지원합니다. 다차원 배열은 배열의 배열로 표현됩니다.

val matrix = arrayOf(
    intArrayOf(1, 2, 3),
    intArrayOf(4, 5, 6),
    intArrayOf(7, 8, 9)
)

println(matrix[1][1]) // 5

 

Work with Arrays

  • 변수 개수 인수 (vararg)를 함수에 전달
    • 코틀린에서는 vararg 매개변수를 사용하여 함수에 가변적인 수의 인수를 전달할 수 있습니다. 이는 인수의 개수를 사전에 알 수 없을 때 유용합니다. 배열을 vararg 매겨변수로 함수에 전달하려면, 스프레드 연산자를 사용하여 배열의 각 요소를 개별 인수로 전달할 수 있습니다.
fun main() {
    val lettersArray = arrayOf("c", "d")
    printAllStrings("a", "b", *lettersArray)
    // abcd
}

fun printAllStrings(vararg strings: String) {
    for (string in strings) {
        print(string)
    }
}
  • 배열 비교
    • 두 배열이 동일한 순서로 동일한 요소를 가지고 있는지 비교하려면 contentEqualscontentDeepEquals 함수를 사용합니다.
val simpleArray = arrayOf(1, 2, 3)
val anotherArray = arrayOf(1, 2, 3)

// 배열의 내용 비교
println(simpleArray.contentEquals(anotherArray)) // true

// 요소를 변경 후 비교
simpleArray[0] = 10
println(simpleArray.contentEquals(anotherArray)) // false
  • 배열 변환
    • 코틀린은 배열을 변환하는 다양한 유용한 함수를 제공합니다.
    • Sum
    • Shuffle
// sum 예제
val sumArray = arrayOf(1, 2, 3)
println(sumArray.sum()) // 6

// shuffle 예제
val simpleArray = arrayOf(1, 2, 3)
simpleArray.shuffle()
println(simpleArray.joinToString())
  • 배열을 컬렉션으로 변환
    • 배열을 리스트나 세트로 변환하려면 toList 와 toSet 함수를 사용합니다.
val simpleArray = arrayOf("a", "b", "c", "c")
println(simpleArray.toSet()) // [a, b, c]
println(simpleArray.toList()) // [a, b, c, c]

val pairArray = arrayOf("apple" to 120, "banana" to 150, "cherry" to 90, "apple" to 140)
println(pairArray.toMap()) // {apple=140, banana=150, cherry=90}

 

반응형

'Kotlin' 카테고리의 다른 글

[Kotlin] Asynchronous Programming Techniques - 2  (0) 2024.08.07
[Kotlin] Asynchronous Programming Techniques - 1  (0) 2024.08.05
[Kotlin] Basic Syntax  (0) 2024.07.31
[Kotlin] 언어 소개  (0) 2024.07.21