본문 바로가기

Kotlin

(13)
코루틴 4장 : 코루틴의 실제 구현 Continuation 객체는 중단이 되었을 때의 상태와 함수의 지역변수와 파라미터, 그리고 중단 함수를 호출한 함수가 재개될 위치 정보를 가지고 있다. 하나의 컨티뉴에이션 객체가 다른 하나를 참조하고, 참조된 객체가 또 다른 컨티뉴에이션 객체를 참조한다. 중단함수는 실행도중 중단될 경우 COROUTINE_SUSPENDED 라는 마커를 반환한다 상태는 컨티뉴에이션 객체에 저장되며, 중단을 처리하기 위한 과정이 있어야 한다. 중단된 함수가 재개했을 때 컨티뉴에이션 객체로부터 상태를 복원하고, 얻을 결과를 사용하거나 예외를 던진다. Continutation 의 구성 예시 suspend fun myFunction() { println("Before") var counter = 0 delay(1000) coun..
3장 재사용성 : 23 ~ 25 Item 23. 타입 파라미터의 섀도잉을 피하라 섀도잉이란 // 섀도잉 예시 class Person(val name: String) { fun addName(name: String) { // something } } 코틀린에서는 동일한 이름을 여러번 사용하는 것이 가능하다 addName에서 name은 생성자로 받은 name이 아닌 파라미터로 받은 name을 가리킨다 addName() 내부에서 생성자에 선언된 name을 사용하기 위해서는 this.name으로 명시하여 어느 범위의 name인지 알려줘야 한다 이처럼 같은 이름을 가진 요소에 의해 값이 가려지는 것을 섀도잉이라고 한다 섀도잉은 읽는 사람을 혼란스럽게 하기 때문에 피하는게 좋을 것 같다 혼란스러워지는 예시😱 interface Tree class ..
2장 가독성 : Item 14 - 16 Item 14 : 변수 타입이 명확하지 않은 경우 확실하게 지정하라 코틀린에는 타입 추론 시스템이 있지만, 타입이 명확하지 않은 경우 남용하면 좋지 않다 예시 val data = getSomeData() 코드 정의로 쉽게 이동할 수 없는 깃허브 등의 환경에서 코드를 읽는 사람도 고려해야 한다 이는 가독성을 위함도 있지만, 안전을 위해서도 타입을 지정하는 것이 좋다 Item 15 : 리시버를 명시적으로 참조하라 스코프 내부에 둘 이상의 리시버가 있는 경우 리시버를 명시적으로 나타내면 좋다 apply, with, run 등의 스코프함수를 사용할 때가 대표적인 예시이다. 잘못 사용한 예시 class Node(val name: String) { fun makeChild(childName: String) = cr..
item 6~10 안정성에 관련된 내용 이어서 Item 6 : 사용자 정의 오류보다는 표준 오류를 사용하라 직접 오류를 정의하기 보다는 표준 라이브러리 오류를 사용하는 것이 좋다 당연한 이야기지만 문제가 발생했을 때, 그게 잘 알려진 문제라면 해결한 사람도 많을 것이기 때문에 도움받기 쉽다 Item 7 : exception의 대체, null과 failure를 사용하라 exception을 남발해선 안된다 단순히 정보 전달의 목적으로 사용해선 안되고 정말 예외적인 상황이 발생했을 때 사용하여 적절한 처리가 이루어지도록 해야 한다 예외를 던지지 않고 예측할 수 있는 범위의 오류를 표현하는 방법 1. null 리턴 getOrNull : 리스트에서 값이 있으면 값을 반환하고 없으면 null을 반환하는 함수. IndexOutOfBo..
1장 : item 1 1장은 안정성을 주제로 10가지 아이템을 다루고 있다. Item 1 : 가변성을 제한하라 가변성을 제한하는 이유 많은 부분에서 변화가 생기면 디버깅이 어려워진다 테스트하기 어렵다 멀티스레드 환경일 경우 동기화가 필요한데, 변경이 많을수록 충돌 지점도 많아진다 가변성 제한 방법 kotlin에서 가변성을 제한하기 위해서 보통 immutable(읽기전용) 객체, 컬렉션을 사용한다. val : immutable 프로퍼티 사용 immutable 컬렉션 mutable 컬렉션과 구분하여 사용 data class의 copy 활용하기 val : 읽기 전용 프로퍼티 사용하기 val 가 붙은 프로퍼티는 읽기 전용이지만 가변성 존재한다. 예를 들면 mutable 객체를 담고 있을 경우가 그렇다. 그럼에도 var 대신 val를..
== 과 ===의 차이 값을 비교할 때 두 가지 연산자를 사용할 수 있다. 자바에서는 ==을 원시타입 값 비교, 참조타입의 주소값 비교에 사용한다. 참조타입의 값 비교를 위해선 equals()를 사용한다. 코틀린은 편의를 위해 기본적으로 == 사용 시 내부에서 equals()를 호출하여 값을 비교하도록 만들고 참조 타입의 주소값 비교를 위해선 ===을 사용할 수 있다. 코틀린에서의 동등성과 동일성 비교 연산 1. == (동등성) 호출 시 내부적으로 equals()를 호출하여 값 비교를 수행할 수 있다. 2. === (동일성) 참조 타입의 주소값을 비교하기 위해 사용할 수 있다.
Inner class 와 Nested Class 차이 작성 계기 두 class의 차이점에 대해 아느냐는 질문을 받은 적이 있는데, 사실 잘 몰라서 대답을 제대로 못했다 분명 썼을텐데 정확한 개념을 알고 쓰지는 않았던 것 같다 이제부터 알아보도록😄 inner class 와 nested class 모두 클래스 내부에 정의된 클래스를 말한다. kotlin 에서는 별다른 키워드를 붙이지 않으면 클래스 내부에 정의된 클래스는 nested class로 만들어지며, inner 키워드를 붙여야 inner class로 만들어진다. 여기서 몇가지 질문이 생기는데 1. 왜 클래스 내부에 클래스를 쓰는가? 2. 왜 코틀린에서는 기본적으로 nested class를 사용하는가? 이에 대해 알아보자 Q1. 클래스 내부에 클래스를 왜 쓰는 걸까? 1 ) 외부 클래스에 대한 쉬운 접근을..
Flow 결합 연산자 : zip, combine Coroutine Flow는 Flow를 결합할 수 있는 연산자 zip과 combine을 제공하고 있다. 두 연산자 동작에 어떤 차이가 있는지 알아보자 zip 결합된 모든 flow의 결과값이 올 때까지 기다렸다 방출한다. flow 결과값들이 1:1로 결합하는 방식 모든 flow의 방출이 완료될 때까지 작동한다. 그림으로 보면 이해가 쉽다 flow1 - Blue Circle이 방출되고 1초 후 Red Circle이 방출된다. flow2 - Blue Square가 방출되고 2초 후 Red Square가 방출된다. flow1.zip(flow2) 의 결과값은? 1. Blue Circle과 Blue Square가 결합된다. 2. 1초 후 방출된 Red Circle은 대응되는 값이 없기 때문에 기다린다. 3.다시 1..