본문 바로가기

안드로이드

(47)
코틀린(Kotlin) - 산술 연산자 오버로딩 코틀린에서는 특정 연산자의 역할을 함수로 정의할 수 있습니다. 이를 Convention(관례)이라고 합니다. 가장 기본적인 예로는 산술 연산자가 있습니다. 자바에서는 원시 타입(primitive)에 대해서만 산술 연산자를 사용할 수 있고, 추가로 String에 대해 "+" 연산자를 사용할 수 있습니다. 그러나 다른 클래스에서도 이러한 산술 연산자가 유용한 경우가 있기 마련입니다. 지금부터, 어떻게 클래스에 대한 일반 산술 연산자를 정의할 수 있는지에 대해 살펴보도록 하겠습니다. 이항 산술 연산 오버로딩 코틀린에서는 +, - 같은 산술 연산자를 오버로딩해서 사용할 수 있습니다. 객체끼리 더하거나 뺄 때, 원하는 동작을 함수 안에 구현하면 연산자를 통해 이를 표현할 수 있습니다. /* plus 연산자 구현하..
코틀린(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..
Dagger Hilt로 안드로이드 의존성 주입하기 Dependency Injection 의존성 주입(Dependency Injection)은 여러 컴포넌트간의 의존성이 강한 안드로이드에서 클래스 간 의존성을 낮춰줍니다. 객체 생성 시 클래스 간 의존성이 생기게 되는데 이때, 객체의 생성을 클래스 내부에서 하는 게 아니라 클래스 외부에서 객체를 생성하여 주입시켜주는 디자인 패턴을 말합니다. 그렇다면 의존성 주입이라는 용어는 어떤 의미일까요? 의존성? 클래스 간의 의존 관계를 가지는 상황으로 A클래스 내부에서 B클래스가 생성, 사용되는 경우라고 볼 수 있습니다. class B { val id = "newtopia" } class A { val data = B() //의존관계 생성 } >>> println(A().data.id) //A클래스는 B클래스에 의존..
코틀린(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) - 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..
프로답게 UI 디자인 가이드 요청하기! 우리가 안드로이드 앱 개발을 할 때, 개발 협업에 있어 가장 중요한 부분 중 하나가 바로 "디자이너와의 협업" 입니다. 우리의 앱을 아주 멋지게 디자인해주시는 디자이너분들과 개발 협업을 하기 위해서 기본적인 개념을 알아둔다면, 더욱 효과적이고 서로 해피(Happy)한 협업을 할 수가 있겠죠? 디자이너 : 해상도 몇으로 작업해서 디자인 가이드 넘겨드리면 될까요? 개발자 : (몇으로 달라고 하지...?;;;; 고민...난감...) 위와 같은 경우를 겪어본 적이 있으신가요? 어떤 해상도 기준으로 달라고 해야 하는지 난 잘 모르겠고, 그냥 혼자 있고 싶고, 멍해졌던 적이 있으신가요? 이럴 때, 더 이상 고민하지 않고 프로답게! 디자인 가이드 요청을 하기 위해서 모바일 앱 UI 디자인 요청 시에 가장 중요한 요소..