일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- DataBinding
- Coroutine
- 안드로이드
- BOJ
- CustomView
- Behavior
- 알림
- HTTP
- Android
- 백준
- View
- ViewModel
- recyclerview
- sqlite
- activity
- onLayout
- Algorithm
- LiveData
- hilt
- lifecycle
- 코틀린
- Navigation
- kotlin
- notification
- onMeasure
- room
- AppBarLayout
- CollapsingToolbarLayout
- 알고리즘
- CoordinatorLayout
- Today
- Total
목록코틀린 (38)
개발일지
Gradle 설정 dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7") } Thread vs Coroutine Thread와 Coroutine은 동시성을 보장하기 위한 기술이다. Thread Preempting Scheduling 자원을 서로 차지하려고 노력하고 OS가 Context Switching을 통해 Thread에게 자원을 할당한다 -> Overhead발생 Thread자체 Stack메모리를 가지고 JVM Stack을 차지한다. Coroutine Cooperatively 처리 단위가 Thread가 아닌 Coroutine에서 제공하는 Job Object단위로 하나에 Thread에서 진행된다. Thread..
also 해당 객체를 사용하기 전에 데이터의 유효성을 검사할 때 매우 유용하다. 선언 fun T.also(block: (T) -> Unit): T { block(this) return this } 코드 class Animal { var name: String = "Animal" var age: Int = 0 override fun toString(): String { return "Name : $name, Age : $age" } } fun isDog(animal: Animal) { assert(animal.name == "Dog") } fun main() { val dog = Animal().also { isDog(it) } } apply 특정 객체를 생성하면서 동시에 초기화를 할 때 사용한다. 객체가..
Array 선언방법 // arrayOf를 이용한 생성 // 여러가지 자료형을 가질 수 있다. val arr1 = arrayOf(1, 2, 3, "str") // 생성자를 이용한 생성 // 첫번째 인자 : Size, 두번째 인자 : Lambda #각 인덱스별로 어떻게 처리할지 val arr2 = Array (10) { it } // 형식을 지정하는 arrayOf val arr3 = intArrayOf(1, 2, 3, 4) // null로 채우고 시작하는 배열 // 첫번째 인자 : Size val arr4 = arrayOfNulls(10) Array 접근 Array는 인덱스가 0부터 시작한다. 코드 val arr = Array (5) { it*it } println(arr[3]) arr[3] = 1 prin..
reified의 필요성 코드 fun genericFunction() { // Error Kotlin: Cannot use 'T' as reified type parameter. Use a class instead. println(T::class.java) } 위 함수는 일반적인 제네릭 함수이다. 위 함수 같은 경우는 Java처럼 T 형식 매개변수가 런타임에 삭제되기 때문에 T에 접근할 수 없다. 자바에서 접근하던 방법 매개변수를 받아서 실행시간에 사라지지 않게 했다. 코드 void genericFunction(T arg) { arg.getClass(); } reified inline 함수에만 사용할 수 있다. inline처리 될 때 코드가 복사되면서 실제 자료형을 알 수 있기 때문에 런타임에서도 사용할 ..
가변성 가변성이란 매개변수가 클래스에 영향을 주는 것을 말한다. 예를 들어 Int클래스는 Number클래스를 상속받았고, Number클래스 변수에 Int의 인스턴스를 대입할 수 있다. 이때 Int는 Number의 하위 형식이 된다. 가변성의 3가지 유형 용어 의미 공변성(Covariance) A가 B의 하위 형식이면 C는 C의 하위 형식이다. 생산자 입장의 out 성질 반공변성(Contravariance) A가 B의 하위 형식이면 C는 C의 하위 형식이다. 소비자 입장의 in성질 무변성 C와 C는 아무 관계가 없다. 생산자 + 소비자 무변성 기본 값이다. Any -> Number -> Int의 관계가 있지만 무변성이 적용되면 아무 관계가 없기 때문에 Type mismatce가 발생한다. class Box..
제네릭 개념 제네릭은 인스턴스를 생성할 때 자료형을 결정한다. 컴파일 시간에 자료형을 검사하여 코드의 안정성을 높인다. 제네릭의 본질은 런타임에 ClassCastException을 막아주어 안정성을 높이는데 있다. 제네릭 사용법 자료형을 결정할 수 없는 경우를 조심해야한다. 엥글 브래킷() 사이에 형식 매개변수를 넣어 선언한다. 코드 // 제네릭 클래스 class Box(vararg val elements: T) { fun printElements() { for(i in elements) { print("$i ") } println() } } // 제네릭 함수 fun printGeneric(element: T) { println(element) } fun main() { // 자료형을 유추할 수 있으면 ..
연산자 오버라이딩 operator 키워드를 통해 구현한다. 코드 class Base(var x: Int = 0) { operator fun plus(other: Base): Base { return Base(this.x + other.x) } override fun toString(): String { return "Base(x = $x)" } } fun main() { val x = Base(1) val y = Base(2) println(x + y) } 결과 Base(x = 3) 연산자 종류 표현식 의미 a + b a.plus(b) a - b a.minus(b) a * b a.times(b) a / b a.div(b) a % b a.rem(b) a..b a.rangeTo(b) a(b) a.invoke..
- 열거형 클래스 (Enum Class) Java의 Enum Class와 매우 유사하다 코드 enum class Direction { NORTH, SOUTH, WEST, EAST } - 멤버를 가지는 열거형 클래스 프로퍼티와 메서드를 가질 수 있다. 코드 enum class Direction(private val value: Int = 0) { NONE { val str: String = "None" }, NORTH(1), SOUTH(2), WEST(3), EAST(4); fun getValue() { println(value) } } - 인터세이스를 상속받는 열거형 클래스 인터페이스를 상속받고 개별적, 통합적으로 재정의할 수 있다. 코드 enum class Direction(private val val..