Effective Kotiln 6

[이펙티브 코틀린] 7. 결과 부족이 발생할 경우 null과 Failure를 사용하라

우리는 함수를 작성하다보면 결과를 만들어 낼 수 없을 때가(예외) 있다. 대표적으로 아래와 같은 상황이 생길 수 있다. 서버로부터 데이터를 받을때 인터넷 문제로 받아오지 못한 경우 조건에 맞는 요소들중 첫번쨰 요소를 가져오려고 했는데 조건에 맞는 요소가 하나도 없는 경우 ex) index 에러 json 파싱을 하려고 했는데 형식이 맞지 않아서 발생하는 오류 이런 상황을 처리할때 두 가지 매커니즘을 활용 할 수 있다. 제목처럼 null이나 Failure(라는 이름의 sealed 클래스)를 사용해서 처리 예외를 throw 두가지에는 중요한 차이가 있다. 예외를 throw 하는거부터 보자. 일단 예외는 정보를 전달하는 방법으로 사용해서는 안된다. 예외는 잘못된 특별한 상황을 나타낼때 사용해야한다. 그 이유는 ..

Effective Kotiln 2023.03.01

[이펙티브 코틀린] 5. 예외를 활용해 코드에 제한을 걸어라

확실히 어떻게 동작해야하는 코드가 있으면 예외를 활용해서 제약을 걸어주는게 좋을때가 있다. 코틀린에는 대표적으로 1. require : 아규먼트와 관련된 예측을 정의할때 상용하는 방법 숫자를 아규먼트로 받아서 팩토리얼을 계산하면 양의 정수만 받아야할때 좌표를 아규먼트로 받아서 클러스터를 찾을 때 비엉 있지 않은 좌표 목록을 사용할때 사용자로부터 이메일 주소를 입력받을 때 값이 입력됐는지, 이메일 형식이 바른지 확인할때 2. check : 상태와 관련된 예측을 정의할때 사용하는 방법 어떤 객체가 미리 초기화되어 있으어만 처리가 되게 하고 싶은 함수에 사용 사용자가 로그인 했을 때만 처리를 하게 하고 싶은 함수에 사용 객체를 사용할 수 있는 시점에 사용하고 싶은 함수인지 체크할때 사용 일반적으로 requir..

Effective Kotiln 2023.01.18

[이펙티브 코틀린] 4. inferred 타입으로 리턴하지 말라

코틀린은 타입추론(type inference) 를 제공한다. 자바 10부터는 코틀린처럼 타입추론을 제공하지만 코틀린에 비해서는 제약이 많다. 아무튼 타입 추론을 사용할때 주의할 점들이 있는데 할당 할때 inferred 타입은 정확하게 오른쪽에 있는 피연산자에 맞게 설정된다는 것을 기억해야 한다. 일반적으로는 아래와 같이 open class Drink class Water: Drink() fun main() { var drink = Water() drink = Drink() // 타입에러 } 하지만 이건 open class Drink class Water: Drink() fun main() { var drink : Drink = Water() // 타입 명시 drink = Drink() } 타입 명시를 해..

Effective Kotiln 2023.01.15

[이펙티브 코틀린] 3. 최대한 플랫폼 타입을 사용하지 마라

플랫폼 타입? 다른 프로그래밍 언어에서 와서 null 가능 여부를 알 수 없는 타입을 플랫폼 타입이라고 한다. 플랫폼 타입을 사용하면 해당 부분도 null 에러가 발생할 위험이 있으며 해당 코드를 사용하는 곳까지 영향을 줄 수 있다. 예를 들면 아래와 같은 상황이 있다. 안드로이드 개발자가 자바 코드로 코드를 작성하다가 코틀린으로 변경해서 코드를 이어서 작성한다고 가정해보자. // 자바 public String getValue() { return null; } // 코틀린 fun statedType() { val value: String = JavaClass().value // NPE // ... println(value.length) } fun platformType() { val value = Jav..

Effective Kotiln 2023.01.13

[이펙티브 코틀린] 2. 변수의 스코프를 최소화하라.

상태를 정의할 때는 변수와 프로퍼티 스코프를 최소화 하는것이 좋음 최소화하지 않으면 아래와 같은 단점이 있다. - 프로그램을 추적하고 관리하기 쉬워짐. - 스코프 범위가 너무 넓으면 다른 개발자에 의해서 변수가 잘못 사용될 수 있음. - 프로그램을 읽고 이해하기에 어려워짐 변수는 읽기 전용 또는 읽고 쓰기 전용 여부와 상관없이 변수를 정의할때 초기화되는 것이 좋다. 여러 프로퍼티를 한번에 설정할 경우에는 구조분해 선언을 활용하자 프로퍼티보다는 지역 변수를 사용하는 것이 좋다 캡처링에 유의하자. val primes : Sequence = sequence { var numbers = generateSequence(2) { it + 1 } while(true){ val prime = numbers.first(..

Effective Kotiln 2023.01.13

[이펙티브 코틀린] 1. 가변성을 제한하라

코틀린의 요소 중 일부는 상태를 가진다. 상태라는건 상황에 따라 값이 변화할 수 있는 것을 의미한다. 대표적으로 var 프로퍼티와 mutable 객체가 있다. 시간 변화에 따라 변하는 요소를 표현할 수 있는것은 유용하지만 여러가지 고려할 점이 생긴다. 1. 프로그램을 이해하고 상태 추척하는것이 어려워진다. 2. 가변성을 가지고 있으면 코드의 진행을 추론하기 어려워진다. 3. 멀티스레드 일때 동기화의 문제를 만날 수 있다. 4. 테스트하기가 어려워진다. 변경되는 값이 많을수록 여러 케이스를 테스트 해야한다. 5. 상태 변경이 일어나면 이 상태를 사용하고 있는 곳에 지속적으로 알려주는 번거로움이 생긴다. 예를 들면 이런 상황이다. suspend fun main() { val lock = Any() var n..

Effective Kotiln 2023.01.08