원하는 결과를 못 만들어내는경우가 있다.예를들어- 서버로 부터 데이터를 읽어올려고 햇는데 인터넷 연결 문제로 실패한경우- 조건에 맞는 첫번째 요소를 찾으려 했는데 조건에 맞는 요소가 없는 경우- 텍스트를 파싱해서 객체를 만들려고 했는데 텍스트의 형식이 맞지 않는 경우 예외 상황을 처리하는 방법은 다음과 같이 두개가 있다.1. null 또는 실패를 나타내는 sealed 클래스 사용 (현재 내가 쓰고있는 방법이다)-> 아래 2번 방법보다 알아보기 쉽고 효율적2. 예외 throw-> 놓칠 가능성이 있고 전체 애플리케이션을 중지시킬수 있다. 여기서 예외는 어떤 정보를 전달하는 역할을 하면 안된다. 오직 잘못된 상황을 나타내고 처리하는 용도로만 사용해야 한다.이유1. 예외가 전파되는 과정을 추적하기 어려움2. 코..
이 아이템은 큰 내용이 없어서 간단히 요약- exception을 던질 일이 있다면 내가 오류를 정의하기 보단 표준 라이브러리 오류를 사용하자 아래와 같은 표준 오류들이 있다.- IllegalArgumentException- IllegalStateException- IndexOutOfBoundxException- ConcurrentModificationException- UnsupportedOperationException- NoSuchElementException등

특정한 동작을 해야하는 코드가 있다면 예외를 활용해 제한을 거는것이 좋다 제한을 걸었을때 장점1. 문서를 읽지 않은 개발자도 문제를 확인할 수 있다.- 코드의 최상단 부분에 제한을 걸어두면 문서를 읽지 않은 개발자도 코드의 윗줄만 보고 간단히 어떤 값이 오면 문제가 될수있나 확인 가능 2. 문제가 있는 경우 함수가 예상하지 못한 동작을 하지 않음. - 문제가 있는 값이 올때 처리를 해주기때문에 예상치못한 동작을 막는다 3. 코드가 어느정도 자체적으로 검사된다(?) 단위 테스트를 줄일 수 있다.- 아마 assert 얘기인듯.. 함수 중간중간 assert를 통해 확인을 해주면 테스트 코드를 하나하나 만들지 않아도 어느정도 테스팅이 된다는 말인듯 4. 스마트 캐스트를 활용할 수 있게되어 타입 변환을 적게할 수..

요약값을 리턴하는 함수를 만들때는 반드시 타입을 명시해야 한다 타입 추론- 코틀린에서는 타입을 명시하지 않아도 변수가 선언될때 어떤 타입의 변수인지 추론해서 변수 선언이 가능하다덕분에 코드량을 줄일 수 있다 추론된 타입 특징(inferred타입 = 추론된 타입 이라는뜻이다)1. 추론된 타입은 정확히 오른쪽에 있는 피연산자에 맞게 설정된다open class Animalclass Zebra: Animal()fun main() { var animal = Zebra() animal = Animal() // 오류 발생 타입 안맞음}위 코드를 보면 animal에 타입을 명시하지 않았다. 하지만 초기화할때 Zebra() 로 Zebra 타입을 넣어서 추론때문에 animal 의 타입은 Zebra 클래스이다Zebra는 A..
아이템2의 주제: 변수의 스코프를 최소화 하는것이 좋다 스코프란?어떤 요소의 스코프라고 한다면 그 요소를 볼 수 있는 컴퓨터 프로그램 영역이다.변수의 스코프라고 한다면 그 변수를 인식하고 사용할 수 있는 범위를 의미한다.코틀린에서는 기본적으로 {} 중괄호로 스코프를 만든다.상태를 정의할때는 변수와 프로퍼티의 스코프를 최소화 하는 것이 좋다.프로퍼티 보단 지역변수를 사용하는것이 좋다.최대한 좁은 스코프를 갖도록 변수를 사용한다.스코프 범위 좁히기의 예시// 가장 안좋은 방법var user: Userfor(i in users.indices) { user= users[i] print("user at $i is $user")}// 조금 더 좋은 방법for(i in users.indices) { val us..
1장의 주제 : 오류를 덜 일으키는 코드 작성법아이템 1의 주제: 가변성을 제한한 immutable이 좋은 이유, 최대한 변경되는 부분을 제한하자 가변성의 단점- 코틀린은 모듈로 프로그램을 설계한다- 모듈을 이루는 요소: 클래스, 객체, 함수, 타입 별칭 등 - 상태: var, mutableList 처럼 변경 가능한 변수를 사용하게 되면 가지게 됨상태를 가진 요소는 그 상태가 변경되는 이력에 따라 동작이 영향받게된다. (변경된 값을 사용할때와 아닐때의 동작이 달라지기 때문임) - 상태를 가진 요소에서 일어날수있는 리스크들1. 프로그램 이해, 디버그 어려워짐: 상태들의 관계를 이해해야 함, 상태 변경을 추적해야 함, 이해하기 어려운 클래스가된다, 수정하기도 여려워짐, 예상못한 에러를 일으킬 가능성이 높다2..