코틀린
-
[코틀린] also, apply, let, run코틀린 2022. 3. 20. 21:16
코틀린의 Any 객체에는 다양한 메소드가 정의되어있다. 그 중 also, apply, let, run에 대해서 살펴본다. 1. also also는 block을 받아 실행시키고 block의 argument는 실행 컨텍스트가 된다. also 내부의 this 값은 람다가 정의된 곳의 this 다. block 실행 결과는 원래 context가 반환된다. fun toString() = "lexical" val doAlso = "context".also { arg -> print("this: ${this.toString()}, arg: $arg, ") } println("result $doAlso") // 출력 this: lexical, arg: context, result context 2. apply apply..
-
[코틀린] 확장함수와 확장속성코틀린 2022. 3. 20. 15:42
1. 확장 함수 코틀린은 클래스에 함수나 속성을 인젝팅 할 수 있다. 확장 함수와 확장 속성은 인젝팅 되는 클래스의 바이트코드는 변경하지 않으면서 메소드와 속성을 추가한다. data class Book( val title: String, val author: String, val price: Int ) fun Book.isWrittenBy(author: String): Boolean { return this.author == author } val b = Book("Kotlin book", "Park", 100) b.isWrittenBy("Park") // true 위의 코드에서 isWrittenBy는 Book 클래스 밖에서 정의되었다. 하지만 마치 Book의 클래스 메소드처럼 동작한다. 확장함수의 실제..
-
[코틀린] 연산자 오버로딩코틀린 2022. 3. 20. 00:05
1. 연산자 오버로딩 코틀린에서는 개발자가 정의한 클래스에도 +, * 연산자를 정의해 줄 수 있다. 클래스 내에 RationalNumber를 인자로 받는 operator fun plus라는 키워드로 함수를 정의하면 이 클래스들 간의 + 연산이 정의된다. 아래는 RationalNumber 클래스 간의 + 와 RationalNumber 클래스와 정수 간의 + 를 정의한 것이다. class RationalNumber( val numerator: Int, val denominator: Int ) { operator fun plus(other: RationalNumber): RationalNumber { return RationalNumber( this.numerator * other.denominator + o..
-
[코틀린] 내부 반복(map, filter, groupBy, reduce)코틀린 2022. 3. 19. 17:17
1. 내부 반복 코틀린에서는 여러가지 내부 반복자를 제공한다. 반복이 필요한 경우에 명령형 스타일의 외부 반복자를 사용할 수도 있지만 내부반복자와 람다를 이용하면 간단하게 구현할 수도 있다. 아래는 외부 반복자를 이용하여 3의 배수만을 구한 것이다. val multipleOfThree = mutableListOf() for(x in l) { if(x % 3 == 0) { multipleOfThree.add(x) } } println(multipleOfThree) [3, 6, 9] 아래는 내부 반복자인 filter를 이용해 구한 것이다. val multipleOfThreeWithMap = l.filter { it % 3 == 0 } println(multipleOfThreeWithMap) //[3, 6, ..
-
[코틀린] 람다코틀린 2022. 3. 19. 01:20
1. 람다 람다 표현식은 파라미터 리스트와 바디만으로 정의된 함수이다. // { parameter -> body } { e: String -> e + 1 } 람다는 함수형 프로그래밍과 궁합이 잘 맞는다. fun isPrime(n: Int) = n > 1 && (2 until n).none { k -> n % k == 0} 위의 코드는 소수인지 아닌지를 알려주는 로직을 함수형으로 구현한 것이다. 2 이상이면서 2와 n - 1 까지의 숫자중 어떤 숫자로도 나누어 떨어지지 않으면 소수이다. 2 until n 이 리턴한 IntRange의 none 은 함수를 하나 받아 정수 범위의 원소 하나하나에 함수를 적용시킨다. 모든 결과가 false 라면 none은 true 를 리턴한다. 람다가 한 개의 파라미터를 받는다면..
-
[코틀린] 델리게이션코틀린 2022. 3. 16. 23:50
델리게이션은 객체 자신이 처리해야 할 작업을 다른 객체에게 넘겨버리는 개념이다. 1. 델리게이션 아래 예시는 TrainBookAgent가 실제로 해야할 작업을 각각의 TicketBooker로 위임하는 것을 보여준다. interface TicketBooker { fun book() fun isAvailable() } class TrainTicketBooker: TicketBooker { override fun book() { println("Book Train ticket") } override fun isAvailable() { println("Train ticket available") } } class AirplaneTicketBooker: TicketBooker { override fun book(..
-
[코틀린] 클래스와 상속코틀린 2022. 3. 13. 22:51
1. 인터페이스와 추상클래스 인터페이스 코틀린 인터페이스는 아래처럼 작성한다. interface Remote { fun up() fun down() fun doubleUp() { up() up() } } up, down은 추상 메소드로 상속받는 클래스에서 반드시 구현을 해야한다. doubleUp은 상속받는 클래스에서 추가적인 작업을 하지 않아도 된다. 클래스에서 인터페이스를 상속받아서 추상메소드를 구현해서 사용할 수 있다. class TV { var volume = 0 } class TVRemote(val tv: TV): Remote { // :을 이용하여 상속받음 override fun up() { // 추상메소드를 override해야함 tv.volume++; } override fun down() {..
-
[코틀린] 객체와 클래스코틀린 2022. 3. 13. 00:49
1. 객체와 싱글톤 객체 표현식으로 사용하는 익명 객체 객체 표현식: object {} 형태로 구현하고 익명의 객체를 생성한다. fun drawCircle() { val circle = object { val x = 10 val y = 20 val radius = 5 } println("Circle x: ${circle.x} y: ${circle.y} radius: ${circle.radius}")) } drawCircle() // Circle x: 10 y: 20 radius: 5 익명 객체는 인터페이스를 구현할 수도 있다. object: 으로 인터페이스를 구현하는 익명 객체를 만들 수 있다. fun createRunnable(): Runnable { val runnable = object: Runna..