728x90 공부158 아이템 8 - 적절하게 null 을 처리하라 null 을 리턴한다는 것은 함수에 따라서 여러 의미를 가질 수 있다 @Test fun `52_1`() { var name: String = "M" // String 을 Int 로 변환할 수 없을 경우 null 을 반환 val toIntOrNull = name.toIntOrNull() println("toIntOrNull: $toIntOrNull") val list = listOf(1, 2, 3) // 조건에 맞는 첫 번째 요소를 반환하거나 없으면 null 을 반환 val firstOrNull = list.firstOrNull { it % 4 == 0 } println("firstOrNull: $firstOrNull") // toIntOrNull: null // firstOrNull: null } 기본적.. 2024. 4. 4. 아이템 7 - 결과 부족이 발생할 경우 null 과 Failure 를 사용하라 함수가 원하는 결과를 만들어 낼 수 없을 때가 있는데 이러한 상황을 처리하는 매커니즘은 크게 다음과 같이 두 가지가 있다. null 또는 '실패를 나타내는 sealed 클래스(일반적으로는 Failure 라는 이름을 붙입니다)'를 리턴한다 예외를 throw 한다. 일단 예외는 정보를 전달하는 방법으로 사용해서는 안된다 예외는 잘못된 특별한 상황을 나타내야 하며, 처리되어야 한다 예외는 예외적인 상황이 발생했을 때 사용하는 것이 좋다. 많은 개발자가 예외가 전파되는 과정을 제대로 추적하지 못한다. 코틀린의 모든 예외는 unchecked 예외 입니다.따라서 사용자가 예외를 처리하지 않을 수도 있다. 예외는 예외적인 상황을 처리하기 위해서 만들어졌으므로 명시적인 테스트 만큼 빠르게 동작하지 않습니다. 일반적인 .. 2024. 3. 31. 아이템 6 - 사용자 정의 오류보다는 표준 오류를 사용하라 require, check, assert 함수를 사용하면 대부분의 코틀린 오류를 처리할 수 있다. 하지만 예측하지 못한 상황을 나타내야 하는 경우도 있는데, 가능하다면 이럴 때 코틀린이나 자바 표준 라이브러리에서 제공하는 표준 오류 클래스를 사용하면 좋다 표준오류코드: IllegalArgumentException, IllegalStateException, IndexOutOfBoundsException 등과 같이 일반적으로 널리 사용되는 예외 클래스 개인생각: 대부분 저렇게 사용하고 있고, 도메인마다 메인으로 처리하는 exception 클래스가 따로 있는 경우도 있어, 개발자 들끼리의 약속만 잘 정해져 있으면 크게 문제되지 않는다 라고 생각함. 고객에게 노출되는 코드 제외하고 표준오류 코드도 괜찮다고 생각함 2024. 3. 31. 아이템 5 - 예외를 활용해 코드에 제한을 걸어라 확실하게 어떤 형태로 동작해야 하는 코드가 있다면, 예외를 활용해 제한을 걸어주는 것이 좋다 아래에 몇가지 코드를 제시함 // require: 파라미터를 검증 fun acceptOnlyTwo(num: Int) { // 원하는것만 적는다 require(num == 2) { "2만 허용!" } // 원하는게 아닐경우를 적는다 if(num != 2) { throw IllegalArgumentException("2만 허용!") } } // check: 상태혹은 멤버 변수를 검증 class Person { val status: PersonStatus = PersonStatus.PLAYING fun sleep() { check(this.status == PersonStatus.PLAYING) { "에러 메시지!" .. 2024. 3. 31. 아이템 4 - inferred 타입으로 리턴하지 말라 타입 추론은 코틀린의 특징 중 하나 자바도 자바10부터는 코틀린을 따라 타입 추론을 도입함(물론 코틀린과 비교하면 몇가지 제약이 존재함) c# 은 3.0 부터 도입함 var 타입..2007년.. 타입 추론을 사용할 때는 몇 가지 위험한 부분들이 있다 할당 때 inferred 타입은 정확하게 오른쪽에 있는 피연산자에 맞게 설정된다 절대로 슈퍼클랫 또는 인터페이스로는 설정되지 않습니다. 코틀린의 타입 추론 과정에서 변수에 할당되는 구체적인 값의 타입을 기반으로 타입이 결졍되며, 이 과정에서 추상 타입(슈퍼클래스 또는 인처페이스) 은 타입으로 추론되지 않는 것을 의미. 즉 타입 추론은 가장 추제적인 타입을 선택 class Item4Test { @Test fun missMatchTest() { var anima.. 2024. 3. 31. 아이템 3 - 최대한 플래폼 타입을 사용하지 말라 코틀린에서는 null-safety 매커니즘으로 인해 NPE 를 거의 찾아보기 힘들다. null 관련 오류를 방지하기 위한 코틀린의 핵심 기능 중 하나 타입 시스템을 통해 null 참조를 엄격히 제어하여, 가능한 실행 시간 오류를 컴파일 시간에 잡아낼 수 있게 한다. 코틀린에서 변수를 선언할 때, 변수가 null 을 받을 수 있는지 아닌지를 명시적으로 선언해야 한다. 변수 타입 뒤에 ? 를 붙이면 그 변수는 null 값을 가질 수 있다고 선언하는 것 코틀린은 자바 등의 다른 프로그래밍 언어에서 넘어온 타입들을 특수하게 다룹니다. 이러한 타입을 플랫폼 타입 이라고 부른다. 자바와 코틀린 사이의 상호 운용성을 위헤 도입된 개념 코틀린은 자체적으로 nill 안정성을 엄격하게 관리하지만, 자바 코드는 코틀린처럼 .. 2024. 3. 31. 아이템 2 - 변수의 스코프를 최소화하라 상태를 정의할 때는 변수와 프로퍼티의 스코프를 최소화하는 것이 좋습니다. 프로퍼티: 클래스의 일부로 객체의 상태를 나타낸다. 인스턴스 변수, 스태틱 변수 프로퍼티보다는 지역 변수를 사용하는 것이 좋습니다. 최대한 좁은 스코프를 갖게 변수를 사용합니다. 프로그램을 추적하고 관리하기 쉽기 때문. 변수는 읽기 전용 또는 읽고 쓰기 전용 여부와 상관 없이, 변수를 정의할 때 초기화되는 것이 좋습니다. 여러 프로퍼티를 한꺼번에 설정해야 하는 경우에는 구조분해 선언(destructuring declarration)을 화용하는 것이 좋습니다. 구조분해: 객체가 가지고 있는 여러 값을 분해해서 여러 변수를 한꺼번에 초기화 할 수 있다. // 책에 있는 예시도 좋치만 좀 더 간단한 예시 // data class 는 구조.. 2024. 3. 25. 아이템 52 - mutable 컬렉션 사용을 고려하라 아이템 1 - 가변성을 제한하라 와의 연관된 아이템 2024.03.23 - [공부/이펙티브코틀린] - 아이템 1 - 가변성을 제한하라 immutable 컬렉션보다 mutable 컬렉션이 좋은 점은 성능적인 측면에서 더 빠르다는 것이다. immutable 컬렉션에 요소를 추가하려면, 새로운 컬렉션을 만들면서 여기에 요소를 추가해야 합니다. plus 함수는 새로운 객체를 반환합니다. 이처럼 컬렉션을 복제하는 처리는 비용이 굉장히 많이 드는 처리입니다. 이러한 복제 처리를 하지 않는 mutable 컬렉션이 성능적 괌점에서 좋습니다. 정리 가변 컬렉션은 일반적으로 추가 처리가 빠르다. item 1: 가변성을 제한하라 에서 언급한 immutable 컬렉션은 안전하다 측면에서는 좋다. 일반적인 지역 변수는 이때 언.. 2024. 3. 25. 아이템 1 - 가변성을 제한하라 아이템 1: 가변성을 제한하라. 가변 프로퍼티 var -> 프로그램 실행중에 변경될 수 있음을 의미 mutable 객체 -> 내부 상태를 변경할 수 있는 객체 변할 수 있는 지점은 줄일수록 좋다 코틀린에서 가변성 제한하기 읽기 전용 프로퍼티 - 읽기 전용 프로퍼티는 val 키워드 사용하여 정의 -> 한번 초기화되면 변경할 수 없다. - 프로퍼티가 가르키는 객체의 상태가 불변임을 가르키는 것은 아니다. val list = mutableListOf(1, 2, 3) list = mutableListOf(4, 5, 6) //에러 - list 는 mutableListOf 를 통해 생성된 가변 리스트를 가리키는 읽기 전용 프로퍼티 - list 가 val 로 선언되었기 때문에 list = mutableListOf(4.. 2024. 3. 23. 이전 1 ··· 3 4 5 6 7 8 9 ··· 18 다음 728x90