코틀린

코틀린

    16. 코루틴 기본

    16. 코루틴 기본

    정의 코루틴(coroutine)은 co(cooperation) + routine의 합성어이다. 멜빈 콘웨이가 1958년에 만들어 냈으며 당시 어셈블리 프로그램에 적용했다. 코루틴은 협동루틴, 상호 연계 프로그램이라고 표현할 수 있다. 루틴과 서브 루틴은 서로 비대칭적인 관계이지만, 코루인은 완전히 대칭적인, 서로가 서로를 호출하는 관계이다. 코틀린 공식문서에선 다음과 같이 말한다. 코루틴은 일시 중단 가능한 계산 인스턴스입니다. 코드의 나머지 부분과 동시에 작동하는 코드 블록을 실행한다는 점에서 개념적으로 스레드와 유사합니다. 그러나 코루틴은 특정 스레드에 바인딩 되지 않습니다. 한 스레드에서 실행을 일시 중지하고 다른 스레드에서 다시 시작할 수 있습니다. 코루틴을 경량 스레드로 생각할 수 있지만 실제 ..

    15. 인라인 함수

    15. 인라인 함수

    정의 일반적으로 함수는 선언 -> 호출 -> 작동의 과정을 거친다. 인라인 함수는 일반 함수와 다르게 호출을 하면 선언된 위치로 가서 작동하지 않고 선언한 내용을 호출한 위치에 치환한다. 코드를 보면 이해하기 쉽다. fun main() { println(add(1, 2)) println(min(2, 1)) } fun add(i: Int , b: Int): Int { return i+b } inline fun min(i: Int, j: Int): Int{ return i-j } -result- 3 1 min()은 인라인, add()는 일반 함수로 생성했다. 결과를 보면 큰 차이가 없을 것이다. 하지만 자바로 디컴파일 하게 되면 컴파일러가 어떻게 처리하는지 알 수 있다. public final class M..

    14. 고차함수와 람다

    14. 고차함수와 람다

    고차 함수 고차 함수는 함수를 파라미터로 받거나 함수를 리턴하는 함수이다. fun lock(lock: Lock, body: () -> T): T{ lock.lock() try { return body() } finally { lock.unlock() } } 위 코드를 보면 body는 함수 타입인 () -> T이다. 이 함수 타입은 파라미터가 없고 T를 리턴하는 함수이다. lock()을 호출할 때 인자로 다른 함수를 전달할 수 있다. fun toBesynchronized() = sharedResource.operation() val result = lock(lock, ::totoBesynchronized) 보다 더 간편한 방법은 람다식을 전달하는 방법이다. val result = lock(lock, { s..

    13. 함수

    13. 함수

    함수 선언 코틀린에선 fun 키워드로 선언한다 fun double(x: Int): Int{ return 2 } 함수 사용 전통적인 방식으로 호출 및 멤버 함수는 점 부호로 호출 double(2) Simple().foo() 파라미터와 인자 파스칼 표기법(name: type)를 사용해서 파라미터를 정의한다. 또한 기본 값을 가질 수 있다. fun powerOf(number: Int, exponent: Int = 0){} 기본 값이 있는 경우 인자를 넣지 않을 경우 기본값을 사용한다. 이는 오버 로딩 함수의 개수를 줄여준다. 오버라이딩오버 라이딩 메서드는 항상 베이스 메서드와 같은 기본값을 가진다. 또한 기본 값을 갖는 메서드 오버 라이딩 시, 시그니처에서 기본 파라미터 값을 생략해야 한다. open clas..

    12. 위임

    12. 위임

    위임 패턴의 정의 어떤 객체의 조작 일부를 다른 객체에게 넘김 위탁자(delegator) → 수탁자(delegate) 책임을 다른 클래스, 메서드에 떠넘기는 것을 말한다. 클래스 위임 이러한 위임 패턴을 코틀린에선 보일러 플레이트 없이 제공한다. interface Base { //수탁자 delegate fun print() } class BaseImpl(val x: Int) : Base { override fun print() { print(x) } } class Derived(b: Base) : Base by b //위탁자 delegator fun main(args: Array){ val b = BaseImpl(10) Derived(b).print() } 출력결과 10 Derived의 상위 타입에 있는..

    11. 오브젝트 식과 선언

    11. 오브젝트 식과 선언

    하위 클래스를 만들지 않고 특정 클래스를 일부 수정해서 객체를 만들려면 자바에선 익명 클래스를 이용했다. 코틀린은 오브젝트 식과 오브젝트 선언으로 할 수 있다. 오브젝트 식 사용은 다음과 같다. open class A() { open fun printA() } val ab = object : A() { override fun printA() { ... } } 만약 상위 타입이 생성자를 가지면 알맞은 패러미터를 전달하면 된다. 여러개 상속할 경우 콤마로 구분 지을 수 있다. open class A(x: Int) { open val b = x } interface B {...} val ab = object : A(2), B { override val b = 15 } 단순 객체만 필요하면 상속받지 않으면 된다..