Kotlin

    [Kotlin] Stack 다루는 방법 한 번에 정리하기 : Kotlin의 Stack의 한계와 ArrayDeque를 사용한 해결 방안

    Stack 이란 무엇인가? Stack은 마지막에 들어온 값이 제일 먼저 나가는(LIFO) 특징을 가진 자료구조로, 값을 추가하고 빼내는데 O(1)의 시간 복잡도로 가능해 다양한 곳에 활용될 수 있는 자료 구조이다. *예를 들어 안드로이드에서는 화면(Fragment) 변경 시 이전 화면의 목록을 관리하는데 Stack 자료 구조를 사용하고 있다. 한 번 Stack이 어떻게 동작하는지 그림으로 살펴보자. Stack은 값을 여러개 담을 수 있는 하나의 Container을 가지고 있으며, 값을 집어넣으면 아래와 같이 순서대로 Container에 쌓인다. 예를 들어 Element1, Element2를 Stack에 순서대로 쌓으면 아래와 같은 형태가 된다. 값을 빼낼 때는 무조건 위에 있는 값부터 빼내진다. 즉, S..

    [Kotlin] Char을 Int로 변환하는 세가지 방법 알아보기 : Char to Int

    Char을 Int로 변환할 때 많은 실수가 생기는 이유 Kotlin은 하나의 자료형을 다른 자료형을 변환할 때 to자료형 확장함수를 제공한다. 예를 들어 String을 Int로 변환할 때는 String.toInt()를 사용하면 된다. 하지만 Char은 기본적으로 UTF-16으로 인코딩 되고 숫자로 변환될 때 해당 코드에 해당하는 숫자로 디코딩된다. 8비트 이하의 값들에 대해서는 ASCII를 따른다. 이 때문에 Char.toInt() 를 사용해 Int를 Char로 변환을 하게 되면 예상치 못한 결과가 나온다. 한 번 '1'을 toInt()를 사용해 변환해 보도록 하자. fun main() { val char = '1' println(char.toInt()) // 49출력 } 위와 같이 '1'.toInt()..

    [Kotlin] Int를 String으로 변환하고 String을 다시 Int로 변환하는 방법 한 번에 정리하기 : Int to String, String to Int

    변수 타입간 변환의 중요성 하나의 변수 타입을 다른 변수 타입으로 제대로 변환하는 것은 프로그램을 만들면서 헷갈리는 방법 중 하나이다. 이번 글에서는나중에 헷갈릴 때 쉽게 찾을 수 있도록 다양한 변환 방법에 대해 정리해보려고 한다. 아래에서 다루는 변환 방법 중 하나만 알아도 변환이 가능하지만, 다양하게 변환 방법을 알아두지 않으면 막상 코드를 짤 때 헷갈릴 수 있으므로, 모두 알아두도록 하자. Int를 String으로 변환하기 Kotlin에서 Int를 String으로 변환하기 위해서는 세가지 방법이 존재한다. 각각에 대해 알아보자. 확장함수 Int.toString()을 사용하는 방법 템플릿 리터럴을 사용하는 방법 확장함수 Int.toString()을 사용하는 방법 Kotlin은 Primitive Typ..

    [Kotlin] Set, MutableSet 은 어떻게 원소에 빠르게 접근할 수 있을까? : Set이 평균적 O(1)의 속도로 원소에 접근하는 방법

    Set, MutableSet 은 어떻게 원소에 빠르게 접근할 수 있을까? Kotlin의 Set은 원소에 접근하는데 걸리는 시간이 평균적으로 O(1)이고 중복을 체크하는데 걸리는 시간도 O(1)이다. 이 때문에 많은 Set을 사용하면 매우 효율적으로 원소에 접근할 수 있다. 이번 글에서는 그 이유를 알아보고자 한다. Kotlin의 Set, MutableSet에서 사용하는 자료 구조 Kotlin의 Set, MutableSet은 모두 인스턴스를 만들기 위해 LinkedHashSet을 사용한다. Set의 내부 구현 살펴보기 Set의 모든 생성자를 보는데는 너무 시간이 많이 걸리므로 Set을 만드는 대표적인 함수인 setOf 함수만 보도록 하자. Kotlin에서 setOf를 사용해 Set 생성하는 부분을 보면 ..

    [Kotlin] Kotlin의 LinkedList 내부 구현 알아보고 사용법 한 번에 정리하기

    Kotlin의 LinkedList 알아보기 Kotlin은 Java의 LinkedList를 사용하며 다음의 특징을 가진다. 1. 첫 노드와 마지막 노드에 대한 포인터를 가지고 있다. /** * Pointer to first node. */ transient Node first; /** * Pointer to last node. */ transient Node last; 2. 크기에 대한 정보를 가지고 있어서 크기에 접근하기 위한 시간 복잡도가 O(1)이다. transient int size = 0; 3. Node는 이전 노드와 다음 노드에 대한 참조를 모두 가진다. private static class Node { E item; Node next; Node prev; Node(Node prev, E ele..