본문 바로가기

코틀린

(34)
코틀린(Kotlin) - 컬렉션과 배열 코틀린 컬렉션은 자바 라이브러리를 바탕으로 만들어졌고 코틀린의 확장 함수를 통해서 다양한 기능이 제공되며, 추가할 수 있다는 사실을 알고 있습니다. 이 외에도 코틀린의 컬렉션 지원과 자바와 코틀린 컬렉션 간의 관계에 대해 더 상세히 살펴보도록 하겠습니다. null 가능성과 컬렉션 컬렉션 안에 null 값을 넣을 수 있는지 여부는 어떤 변수의 null 여부를 정하는 것만큼이나 마찬가지로 중요합니다. 컬렉션 타입 인자에도 ? 를 붙이면 null이 될 수 있는 값으로 이뤄진 컬렉션을 만들 수 있습니다. /* null이 될 수 있는 값으로 이뤄진 컬렉션 만들기 */ fun readNumbers(reader: BufferedReader) : List { val result = ArrayList() //null이 ..
코틀린(Kotlin) - 원시 타입(primitive type) 원시 타입(Primitive Type) : Int, Boolean 등... 코틀린은 원시 타입(primitive type)과 래퍼 타입(wrapper type)을 따로 구분하지 않습니다. 즉, 자바처럼 Integer와 int로 구분하지 않고 Int 하나만 존재하는 형태입니다. /* 정수 표현 예제 */ val i: Int = 1 val list: List = listOf(1, 2, 3) 위 예제와 같이 Integer 또는 int 구분 없이 Int 하나로 사용하면 됩니다. primitive와 wrapper 타입이 같다면 코틀린은 항상 객체로 표현하는 걸까요? 그렇다면 너무나 비효율적이지 않을까요? 라는 의문이 생기는데요, 다행히 코틀린은 그러지 않습니다. 코틀린의 타입은 컴파일 시 자바의 primitive..
코틀린(Kotlin) - 타입 파라미터의 null 가능성 코틀린에서는 함수나 클래스의 모든 파라미터는 null이 될 수 있습니다. 따라서 타입 파라미터 T를 클래스나 함수 안에서 사용하면 변수명 끝에 물음표가 없더라도 T가 null이 될 수 있는 타입입니다. /* null이 될 수 있는 타입 파라미터 예제 */ fun printHashCode(t: T) { println(t?.hashCode()) //"t"가 null이 될 수 있으므로 안전한 호출을 사용 } >>> printHashCode(null) //"T"의 타입은 "Any?"로 추론된다. null 위의 예제 printHashCode 함수 호출에서 타입 파라미터 T에 대해 추론한 타입은 null이 될 수 있는 Any? 타입으로 추론이 되었습니다. t 파라미터의 타입 T에는 분명히 물음표가 붙어있지 않지만 ..
코틀린(Kotlin) - 타입 시스템 as?, !!, let, lateinit 안전한 캐스트 "as?" 기본적으로 "as" 연산자는 대상 값을 as로 지정한 타입으로 캐스트 하며, 해당 타입으로 바꿀 수 없으면 ClassCastException이 발생하게 됩니다. 이럴 경우 is 연산자를 통해 대상 값이 해당 타입으로 변환 가능한 타입인지 체크해야 하지만 코틀린에서는 훨씬 더 간결한 기능으로 "as?" 연산자를 제공합니다. "as?" 연산자는 어떤 값을 지정한 타입으로 캐스트를 하고, 만약 대상 타입으로 캐스트 할 수 없으면 null을 반환하게 됩니다. /* 안전한 캐스트를 사용해 equals 구현하는 예제 */ class User(val id: String) { override fun equals(o: Any?): Boolean { val otherUser = o as? User..
코틀린(Kotlin) - 타입 시스템 null 가능성 safe call(?.) elvis(?:) 코틀린에서 가장 중요한 부분인 타입 시스템(type system)을 살펴보도록 하겠습니다. 자바와 비교했을 때 코틀린의 타입 시스템은 코드의 가독성을 향상시키는 데 도움이 되는 몇 가지 특성이 있습니다. 그런 특성으로, null이 될 수 있는 타입(nullable type) 과 읽기 전용 컬렉션이 있습니다. null 가능성 null 가능성은 NullPointerException(NPE) 을 피할 수 있는 코틀린 타입 시스템의 특성입니다. NullPointerException 은 앱을 중지 시킬 정도로 굉장히 크리티컬 해서 사용자와 개발자 모두를 당황시키는 존재죠...😨😱 코틀린을 비롯한 최신 언어에서는 이런 null에 대한 이슈를 해결하기 위해, null이 될 수 있는 여부를 타입 시스템에 추가함으로써 ..
코틀린(Kotlin) - lambda with receiver(수신 객체 지정 람다) : with, apply lambda with receiver (수신 객체 지정 람다) 개발을 하다 보면 객체를 반복 사용하면서 그 객체에 대한 연산을 명시하는 경우가 많습니다. 수신 객체 지정 람다는 이러한 수신 객체를 반복적으로 명시하지 않고도 람다의 본문 안에서 다른 객체의 메소드를 호출할 수 있게 합니다. 이런 람다를 수신 객체 지정 람다(lambda with receiver) 라고 합니다. with 함수 /* with 없이 반복 사용하는 경우 */ val settings = webView.settings settings.javaScriptEnabled = true settings.javaScriptCanOpenWindowsAutomatically = true settings.useWideViewPort = true se..
안드로이드 코루틴 기본 개념과 활용까지의 모든 것! 코루틴 코루틴(Coroutines) 은 쓰레드(Thread)와 기능적으로는 비슷하지만, 하나의 쓰레드 내에서 여러 개의 코루틴이 실행되는 개념으로 비동기 프로그래밍에 권장되는 동시 실행 설계 패턴입니다. 코루틴은 단일 쓰레드 내에서 여러 개의 코루틴을 실행할 수 있기 때문에, 많은 양의 동시 작업을 처리할 수 있으면서 메모리 절약의 장점이 있습니다. 이유는, 기존 쓰레드는 Context-Switching(CPU가 쓰레드를 점유하면서 실행, 종료를 반복하며 메모리 소모)이 발생하기 때문에 많은 양의 쓰레드를 갖기가 어렵지만 반면에 코루틴은 쓰레드가 아닌 루틴을 일시 중단(suspend) 하는 방식이라 Context-Switching에 비용이 들지 않기 때문입니다. 또한, 지정된 작업 범위 내에서 실행이 되..
코틀린(Kotlin) - 함수형 인터페이스 활용 코틀린의 람다식을 기존 자바 API에도 사용할 수 있으며, 호환이 가능하기 때문에 이러한 코틀린 람다를 자바 API에 활용하는 방법에 대해서 살펴보겠습니다. 우리는 자바 8 이전까지는 클릭 이벤트 처리를 위해서 아래와 같이 setOnClickListener 메소드에 파라미터로 무명 클래스 인스턴스를 넘겨야만 했습니다. button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { } }); 코틀린에서는 무명 클래스 인스턴스 대신 람다를 넘길 수 있습니다. 물론, 자바에서 처럼 무명 클래스를 사용해도 됩니다. (코틀린의 object 를 사용하면 되겠죠?) /* 코틀린 람다 사용 */ button..