본문 바로가기
Kotlin Spring/Kotlin Spring 강의 내용

1. Kotlin 이란? & (1) 주요 자료구조

by Bill Lab 2025. 8. 24.
728x90

1. Kotlin 이란?

     : Kotlin은 JetBrains에서 개발한 정적 타입 프로그래밍 언어로, JVM 위에서 실행되며

     Java와 100% 상호 운용이 가능. 간결하고 안전하며 현대적인 프로그래밍 패러다임을 지원하도록 설계

 

  1.주요 특징 

  • 간결성
    Kotlin은 불필요한 코드를 줄이고, 표현력을 높여 개발자의 생산성을 향상시킴
  • 안전성
    Kotlin은 널(null) 안전성을 내장하여 런타임 오류를 방지
  • 함수형 프로그래밍 지원
    람다 식, 고차 함수, 불변 컬렉션 등 함수형 프로그래밍 개념을 포함
  • 상호 운용성
    Kotlin은 기존 Java 코드, 라이브러리, 프레임워크와 원활하게 통합 가능

 

  2. 활용분야

  • Android 애플리케이션 개발
  • 서버 사이드 애플리케이션
  • 데스크톱 및 웹 애플리케이션

  자세한 내용은 Kotlin 공식 문서(https://kotlinlang.org/docs/home.html)를 참고하세요.

 

 

2. Kotlin자료구조

  1. Array

    : 고정 크기의 동일 타입 데이터를 연속적으로 저장하는 자료구조

val strings: Array<String> = arrayOf("Apple", "Banana", "Cherry")
val booleans: Array<Boolean> = arrayOf(true, false, true)

 

  2. List  (ArrayList 기반)

    1) Immutable List (읽기 전용)
         : 변경할 수 없는 리스트입니다. 요소를 추가하거나 제거할 수 없음

val list = listOf("Apple", "Banana", "Cherry")
println(list[0])  // Apple

 

    2) Mutable List (수정 가능)
        : 요소를 추가하거나 제거할 수 있는 리스트

val mutableList = mutableListOf("Apple", "Banana")
mutableList.add("Cherry")
println(mutableList)  // [Apple, Banana, Cherry]

 

  • ArrayList: 자바의 ArrayList를 사용 가능 (일반적으로 mutableListOf와 거의 동일하게 사용)
  • List<Int>, List<String> 등 제네릭 타입으로 사용 가능
  • emptyList(), listOfNotNull() 같은 유틸 함수도 제공

 

 

  3. Map

    : Map은 키(key) - 값(value) 쌍으로 데이터를 저장하는 자료구조
     (각 키는 유일해야 하며, 키를 통해 빠르게 값을 찾을 수 있음)

fun main() {
    val map = mapOf("apple" to 1, "banana" to 2)  // 읽기 전용 Map
    val mutableMap = mutableMapOf("apple" to 1)

    mutableMap["banana"] = 2  // 요소 추가
    mutableMap["apple"] = 3   // 값 변경

    println(mutableMap["apple"])     // 3
    println("키 목록: ${mutableMap.keys}")   // [apple, banana]
    println("값 목록: ${mutableMap.values}") // [3, 2]
}

 

  4. Set

    : Set은 중복을 허용하지 않는 컬렉션
     (요소의 순서 보장이 없으며, (LinkedHashSet 제외) 빠르게 포함 여부를 확인할 수 있음.)

fun main() {
    val set = setOf("A", "B", "A")  // 읽기 전용, 중복 제거됨 → ["A", "B"]
    val mutableSet = mutableSetOf("X", "Y")

    mutableSet.add("Z")
    mutableSet.add("X")  // 이미 있으므로 추가 안 됨

    println(mutableSet)  // [X, Y, Z]
    println("Y 포함됨? ${mutableSet.contains("Y")}")  // true
}

 

  5. Stack

    : Stack은 후입선출(LIFO) 방식의 자료구조 (나중에 넣은 데이터가 먼저 나옴)

     (Kotlin에는 Stack이 기본적으로 없으므로, ArrayDeque를 스택처럼 사용)

import java.util.ArrayDeque

fun main() {
    val stack = ArrayDeque<String>()

    stack.addLast("A")  // push
    stack.addLast("B")
    stack.addLast("C")

    println(stack.removeLast())  // pop → C
    println(stack.removeLast())  // B
    println("stack: $stack")  // [A]
}

 

  6. Queue

    : Queue는 선입선출(FIFO) 구조(먼저 들어온 요소가 먼저 나가는 구조)

     (Kotlin에서는 Java의 ArrayDeque를 사용)

import java.util.ArrayDeque

fun main() {
    val queue = ArrayDeque<String>()

    queue.addLast("A")  
    queue.addLast("B")
    queue.addLast("C")

    println(queue.removeFirst())  // queue → A
    println("queue: $queue")     // [B, C]
}

 

  7. Tree

    : Tree는 계층적인 구조를 가진 비선형 자료구조
     (최상위 노드를 루트(root) 라고 하며, 각 노드는 0개 이상의 자식 노드를 가질 수 있으며,

      Kotlin 표준 라이브러리에는 트리가 없기 때문에, 직접 구현해야 함)

class TreeNode(val value: Int) {
    var left: TreeNode? = null
    var right: TreeNode? = null

    fun insert(newValue: Int) {
        if (newValue < value) {
            if (left == null) left = TreeNode(newValue)
            else left?.insert(newValue)
        } else {
            if (right == null) right = TreeNode(newValue)
            else right?.insert(newValue)
        }
    }

    fun inOrderTraversal() {
        left?.inOrderTraversal()
        print("$value ")
        right?.inOrderTraversal()
    }
}

fun main() {
    val root = TreeNode(10)
    root.insert(5)
    root.insert(15)
    root.insert(3)
    root.insert(7)

    print("order 순회: ")
    root.inOrderTraversal()  // 출력: 3 5 7 10 15
}

 

 

 

 

728x90