Android/Kotlin
[Kotlin] Delegate Pattern 사용하기
Delegate Pattern delegate란 말 그대로 '위임'하는 것을 말합니다. 코틀린에서는 by를 통해 어떠한 기능에 대한 수행을 자신이 수행하지 않고 다른 클래스에 위임할 수 있습니다. 이를 Delegate Pattern이라고 합니다. 상속과 합성 상속은 Is-a 관계라고 많이 이야기합니다. 예를 들어 animal 클래스와 animal 클래스를 상속받는 dog 클래스가 있을 때 dog is a animal 이라는 관계가 성립됩니다. 상속은 부모 클래스-자식 클래스 간의 의존성이 높습니다 . 부모 클래스의 변화는 자식 클래스에게도 영향을 미치게 되죠. 부모 클래스-자식 클래스의 관계가 컴파일 시점에 결정되기 때문에 구현을 변경할 수도 없습니다. 이와 같은 높은 결합도는 유연성과 확장성을 떨어뜨립..
[코틀린 인 액션] 8장 정리: 고차 함수
8.1.1 함수 타입 fun main(args: Array) { val sum = { x: Int, y: Int -> x + y } val action = { println(42) } } 1. 람다 인자 타입 선언 - 각 변수에 구체적인 타입 선언을 추가하면 람다식 안에서 파라미터의 타입을 선언하지 않아도 됨 fun main(args: Array) { val sum: (Int, Int) -> Int = { x, y -> x + y } val action: () -> Unit = { println(42) } } 2. 함수 타입에서 파라미터 이름 지정 - 함수 타입의 람다를 정의할 때 파라미터 이름이 꼭 함수 타입 선언의 파라미터 이름과 일치하지 않아도 됨 fun performRequest( url: Str..
[코틀린 인 액션] 7장 정리: 연산자 오버로딩
7.1.1 이항 산술 연산자 오버로딩 1. 연산자를 오버로딩하는 함수 앞에는 꼭 operator가 있어야 함 식 함수 이름 a * b times a / b div a % b mod(1.1부터 rem) a + b plus a - b minus 2. operator 변경자를 추가해 plus 함수를 정의하면, + 기호로 덧셈이 가능 data class Point(val x: Int, val y: Int) fun main(args: Array) { val point = Point(1, 3) println(point.plus(point)) } operator fun Point.plus(other: Point): Point { return Point(x + other.x, y + other.y) } 7.1.3 단항..
[코틀린 인 액션] 6장 정리: null 다루는 방법
6.1.3 안전한 호출 연산자 1. 호출하려는 값이 null이 아니면 일반 메서드 호출처럼 작동 2. 호출하려는 값이 null이라면 호출이 무시되고 null이 결과 값 fun main(args: Array) { printAllCaps("abc") printAllCaps(null) } fun printAllCaps(s: String?) { val allCaps: String? = s?.uppercase() println(allCaps) } 2. ?. 연산자를 사용하여 안전한 호출 연쇄 class Address(val streetAddress: String, val city: String, val country: String) class Company(val name: String, val address: ..
[코틀린 인 액션] 5장 정리
5.1.2 람다와 컬렉션 1. 라이브러리 함수를 사용하여 프로퍼티를 비교해 값이 가장 큰 원소 찾기 // 루프 사용 class Person(val name: String, val age: Int) fun main(args: Array) { val people = listOf(Person("Alice", 29), Person("Bob", 31)) findTheOldest(people) } fun findTheOldest(people: List) { var maxAge = 0 var theOldest: Person? = null for (person in people) { if (person.age > maxAge) { maxAge = person.age theOldest = person } } printl..
[코틀린 인 액션] 4장 정리
4.1.4 내부 클래스와 중첩된 클래스 1. 클래스 A 안에 정의된 클래스 A는 중첩 클래스 - 내부 클래스 선언을 위해서는 inner 키워드 사용 class Outer { private val bar: Int = 1 class Nested { fun foo() = 3 } inner class Inner() { fun foo() = bar } } val demo = Outer.Nested().foo() val demo2 = Outer().Inner().foo() 2. Nested 클래스는 Outer 클래스의 내부 클래스가 아니므로 프로퍼티에 접근 불가능 class Outer { private val bar: Int = 1 class Nested { fun foo() = bar // ERROR } inne..
[코틀린 인 액션] 3장 정리
3.4.2 가변 인자 함수 1. 인자의 개수가 정해지지 않은 인자(vararg)로 메서드 호출 시 원하는 개수만큼 값을 인자로 넘겨 사용 가능 fun main(args: Array) { val ls = arrayOf(1,2,3) val ls2 = arrayOf(*ls,4,5,6) printNumbers(*ls2.toIntArray()) } fun printNumbers(vararg numbers: Int) { for (n in numbers) { println(n) } } 2. 스프레드 연산자(*)를 통해 배열을 풀어 각 원소가 인자로 전달되도록 함 fun main(args: Array) { val ls = intArrayOf(1,2,3) printNumbers(*ls) } fun printNumbers..