이번 글은 저번 글 문맥이 살짝 섞여있는데, 간단히 말해 저번 글에서는 코루틴을 메인 스레드에서만 실행했다. 그래서 이번 글에서는 코루틴을 다른 스레드에서 실행해보려고 한다. 다른 스레드에서 코루틴 실행하기 바로 예제를 통해 알아보자. fun main() = runBlocking { println("main starts") joinAll( async { threadSwitchingCoroutine(1, 500) }, async { threadSwitchingCoroutine(2, 300) } ) println("main ends") } suspend fun threadSwitchingCoroutine(number: Int, delay: Long) { println("Coroutine $number sta..
코루틴 개념에 관한 글을 보면 다들 코루틴은 경량 스레드(light-weight threads)라고 소개하고 있다. 그런데 사실 코루틴을 처음 공부하는 사람이라면 이 문장은 잘 와닿지 않는다. 그냥 그렇구나.. 하고 넘어가긴 했지만 제대로 이해한 적은 없다. 개념적으로도 그렇지만 실제로 코루틴이 스레드보다 가벼운지도 궁금했다. 그래서 이번 글에서는 코루틴이 실제로 스레드보다 가볍다는 사실을 코드와 실행 결과로 기록해보려 한다. 코루틴 100만개 실행하기 fun main() = runBlocking { repeat(1_000_000) { launch { delay(5000) println(".") } } } 이 코드를 실행하면 정말 "."이 백만개 찍힌다. 그럼 이제 같은 코드를 스레드로 실행시켜보자. 스..
suspend function은 다른 suspend function이나 Coroutine에서만 호출될 수 있다. 일반적인 코드에서 suspend function을 호출하려면 새 코루틴을 시작해야한다. 이렇게 만들어진 코루틴에서는 suspend function과 일반 함수를 모두 호출할 수 있다. suspend fun someMethod(delay: Long) { println("starts method") delay(delay) println("ends method") } 위 함수에서 suspend function이 실제로 suspend될 수 있는 지점은 어디일까? 바로 delay() 부분인데 더 길고 복잡한 suspend function이 있다면 그 함수가 포함하고 있는 모든 suspend funct..
1. 클래스란 무엇일까? 클래스는 참조(reference) 타입이다. 이름은 파스칼 케이스로 작성한다. 클래스는 다중 상속이 불가능하다. 2. 클래스 관련 문법 클래스를 선언할 때는 class 키워드를 사용한다. class Sample { // 가변 프로퍼티 var mutableProperty: Int = 100 // 불변 프로퍼티 let immutableProperty: Int = 100 // 타입 프로퍼티 static var typeProperty: Int = 100 // 인스턴스 메서드 func instanceMethod() { print("instance method") } // 타입 메서드 static func typeMethod() { print("type method - static") } ..
1. 구조체란 무엇일까? 구조체는 값(value) 타입이다. 스위프트에서 대부분 타입은 구조체라고 한다. 타입이름은 파스칼 케이스를 사용한다. 2. 구조체 관련 문법 구조체를 선언할 때는 C언어처럼 struct 키워드를 사용한다. struct Test { // 가변 프로퍼티 var mutableProperty: Int = 100 // 불변 프로퍼티 let immutableProperty: Int = 100 // 타입 프로퍼티 static var typeProperty: Int = 100 // 인스턴스 메서드 func instanceMethod() { print("instance method") } // 타입 메서드 static func typeMethod() { print("type method") } ..
1. 옵셔널의 개념 값이 있을수도, 없을수도 있음을 표현한다. nil이 할당될 수 있는지 없는지 여부의 표현이다. 2. 옵셔널을 쓰는 이유 - nil의 가능성을 코드만으로 표현할 수 있다. - 문서/ 주석 작성 시간을 절약할 수 있다. - 전달받은 값이 옵셔널이 아니라면 nil 체크를 하지 않고 사용할 수 있다. - 예외 상황을 최소화하는 안전한 코딩 기법이다. 3. 옵셔널 문법과 선언 옵셔널 문법은 enum + generics 라고 한다. enum Optional: ExpressibleByNiliteral { case none case some(Wrapped) } let optionalValue: Optional = nil let optionalValue: Int? = nil 나는 지금까지 자바나 코틀..
1. for-in 기존 언어의 for each문과 유사하다. Dictionary의 경우, iteration 아이템으로 튜플이 들어온다. var integers = [1, 2, 3] for (integer in integers) { print(integer) } let people = ["kim": 20, "lee": 35, "park": 50] for (name, age) in people { print("\(name), \(age)") } 2. while, repeat-while 먼저 while문은 사용형태가 이전 조건문에서의 차이점 정도만 다르고 방법은 같다. repeat-while문은 do-while과 형태와 동작이 비슷하다. while integers.count > 2 { //실행문 } repea..
1. if-else 먼저 if-else문은 다른 언어와 차이점이 거의 없었다. 내 관점(Kotlin을 주로 하던)에서 보면 차이점이 있었다. 먼저, if나 else if문을 사용 시 Kotlin에서는 조건문에 무조건 괄호를 사용해야 했는데 Swift에서는 선택 사항이었다. 또, Kotlin에서는 실행문이 1줄이라면 중괄호 "{}"를 생략할 수 있었는데 Swift에서는 불가능했다. 2. switch 기본적으로 사용하던 정수 값만 비교하는 것이 아니라 대부분의 Swift 기본 타입을 지원한다. 각각의 case 내부에는 실행 가능한 코드가 반드시 위치해야 한다. 대부분의 상황에서 default문도 작성해주어야 한다. 명시적 break가 필요없이 자동으로 case 내부의 실행문이 종료되면 break가 실행된다...
1. 파라미터 기본값 파라미터에 기본으로 전달될 값을 미리 지정해둘 수 있다. 여기서 기본값을 지정할 파라미터는 파라미터 목록 중 뒤쪽에 위치하는 것이 좋다고 한다. func 함수 이름(파라미터 이름: 파라미터 타입, 파라미터 이름: 파라미터 타입 = 파라미터 기본값) -> 리턴 타입 { //함수 구현 return 리턴값 } //게다가 함수 호출 시 기본값이 있는 파라미터는 생략이 가능하다 2. 전달인자 레이블(Argument Label) 사용자 입장에서 함수 호출 시 파라미터 역할을 더 명확히 알 수 있도록 할 때 사용한다. 전달인자 레이블을 변경해 동일한 이름의 함수를 중복으로 생성 가능하다. 이 부분이 제대로 이해가 안됐는데 밑에 코드로 다시 적어보겠다. func 함수 이름(전달인자 레이블 파라미터..