우테코 프리코스를 하다보니 테스트 코드를 작성할 일이 자주 생겼다. 오랜만에 작성해보니까 헷갈려서.. 자주 쓰이는 어노테이션과 함수들을 정리해보려고 한다. Junit 자바를 위한 단위 테스트 라이브러리. Junit 어노테이션 @Test 함수 위에 선언해 테스트 함수임을 지정 @Test(timeout=밀리초) 테스트 함수의 수행 시간을 제한 테스트할 함수가 수행되는 시간이 어노테이션 매개변수로 지정한 시간을 넘긴다면 fail @Test(expected=예외) 테스트할 함수의 예외를 지정 매개변수로 지정한 예외가 발생해야 테스트 pass @Ignore 해당 어노테이션이 선언된 테스트 함수는 무시하도록 지정 @BeforeEach 해당 어노테이션이 선언된 함수는 모든 @Test 함수가 실행되기 전에 실행된다. ..
자바와 코틀린을 둘다 사용하고 있어서, 코틀린에 대한 어려움은 없지만..코딩 테스트에서만 자주 쓰이는 컬렉션 다루는 함수들이나 입출력 관련 함수들은 아직 익숙치 않은 것 같다.안드로이드 직무는 코딩 테스트 언어를 코틀린으로만 제한하는 경우가 종종 있어서, 이번 기회에 코테 준비를 위한 코틀린 함수를 정리해보려 한다! 입력fun main() = with(System.'in'.bufferedReader()) { // Int 읽기 val integer = readLine().toInt() // 입력된 String을 공백 기준으로 나눈 후 Int로 변환 val nums = readLine().split(" ").map { it.toInt() }}자바처럼 속도를 개선하기 위해 Sc..
동시성 통신 채널 fun main() { runBlocking { val streamSize = 5 val channel = Channel(3) launch { for (n in 1..streamSize) { delay(Random.nextLong(100)) println("Sending: $n") channel.send(n) } } launch { for (i in 1..streamSize) { delay(Random.nextLong(100)) val n = channel.receive() println("Receiving: $n") } } } } Thread-safe하게 임의의 데이터 스트림을 코루틴 사이에 공유할 수 있게 해준다. 채널의 용량을 지정하는 정수값을 인자로 받는 Channel() 함수를..

코루틴 흐름 제어 Job 동시성 작업의 생명 주기를 표현하는 객체 작업 상태를 추적하고, 작업을 취소할 수 있다. 잡은 생성되자마자 시작되므로 Active 상태가 된다. isActive, isCompleted, isCancelled 프로퍼티를 통해 상태를 추적할 수 있다. Cancelled, Completed 상태일 때 isComplete의 프로퍼티 값이 모두 true다. isCancelled을 통해 두 상태를 구분한다. launch(), async()에서 잡의 초기 상태를 지정할 수 있다. CoroutineStart.DEFAULT: 잡을 즉시 시작한다. (default) CoroutineStart.LAZY: 잡을 자동으로 시작하지 않는다. New 상태에서 시작을 기다린다. start() fun main..

코루틴 suspend 함수 suspend fun sum(val1: Int, val2: Int): Int { delay(1000) return val1 + val2 } 함수 실행을 중단한 다음, 나중에 필요할 때 다시 실행을 계속 진행할 수 있는 함수 함수에 suspend라는 키워드를 붙인다. 스레드를 block 시키지 않고 일시 중단하며, 그동안 스레드가 다른 작업을 수행할 수 있다. sum(val1: Int, val2: Int, val3: Continuation) 컴파일 시 마지막 파라미터로 Continuation 객체를 추가한다. Continuation을 통해 중단(suspend) 시점의 실행 정보들을 저장하고, 실행이 다시 재개(resume)되면 저장한 정보를 기반으로 실행을 다시 이어나간다. su..
위임 프로퍼티 1. 표준 위임 lazy() LazyThreadSafeyMode 이넘 상수 값 SYNCHRONIZED: 항상 하나의 스레드에 의해서만 초기화되도록 보장한다. (default) PUBLICATION: 초기화 함수가 여러번 호출될 수 있지만 가장 처음 도착하는 결과가 프로퍼티 값이 된다. NONE: 프로퍼티 접근을 동기화하지 않는다. (가장 빠르며 한 스레드에서만 불린다고 확신할 수 있는 경우) val value1 by lazy { println("Initializing value") 123 } val value2 by lazy(LazyThreadSafeyMode.PUBLICATION) { println("Initializing value") 123 } value1은 default로 SYNCH..
연산자 오버로딩 - +, -, *, / 등 코틀린 내장 연산자에 대해 새로운 의미를 부여할 수 있게 해준다. operator fun String.times(n: Int) = repeat(n) fun main() { println("abc" * 3) // abcabcabc println("abc".times(3)) // abcabcabc } 연산자를 구현하기 위해 함수 앞에 operator 키워드를 붙인다. 1. 단항 연산 enum class Color { BLACK, WHITE, BLUE, YELLOW; operator fun not() = when(this) { BLACK -> WHITE WHITE -> BLACK BLUE -> YELLOW YELLOW -> BLUE } } fun main() { pr..
리플렉션 클래스, 함수, 프로퍼티의 런타임 표현에 접근할 수 있게 해준다. 1. KAnnotatedElement annotation class Component(val name: String = "Core") @Component("I/O") class IO fun main() { val component = IO::class.annotations.first() as Component println("Component name: ${component.name}") // Component name: Log } 가장 상위 리플렉션 타입으로, 모든 리플렉션 타입의 부모가 된다. 함수, 프로퍼티, 클래스 등 요소에 정의된 어노테이션에 접근하는 기능을 제공한다. 어노테이션 인스턴스의 리스트 프로퍼티(annotati..