개발/책

'이펙티브 코틀린' : 도구를 잘 쓰는 방법에 대하여

우리로 2022. 3. 11. 01:55

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=286907622 

 

이펙티브 코틀린

b실제 개발 사례를 통해 알려주는 코드 품질 향상 전략/bBR BR 이 책은 더 나은 코틀린 개발자가 될 수 있도록 도움을 주는 안내서입니다. 코틀린에 어떤 기능이 있는지, 어떤 표준 라이브러리가

www.aladin.co.kr

 

우리나라엔 2022년에 발간된 따끈따끈한 책이다. 원서는 2019년에 발간됐다는 게 ... 좀 충격적인 부분인데, 역시 영어를 잘해야 하나보다

이 책은 코틀린을 어떻게하면 잘 쓸 수 있을지에 대해 얘기한다.

 

아이템 1. 가변성을 제한하라

- 값이 변할 수 있다는 것과, 값을 읽거나 못읽는 건 다른 문제다. 전자는 가변성에 대한 얘기고 후자는 읽기 전용/쓰기에 대한 얘기다. 그리고 코틀린은 val 을 통해 읽기전용 변수를 만들 수 있다. 이를 통해 안전성을 확보한다. 보통 Mutable 객체보다 Immutable 객체가 장점이 많다.

 

- mutable 컬렉션보다는 mutable 프로퍼티가 낫다. 즉 

val list = mutableListOf<Int>()   // 이거보다
var list = listOf<Int>()   // 이게 낫다.
    private set

 

- 방어적 복제를 잘 활용하자

 

아이템 4. inferred 타입으로 리턴하지 말라

- 타입을 확실하게 지정해야 하는 경우에는 명시적으로 타입을 지정해야 한다. 타입은 굉장히 중요한 정보이므로 숨기지 않는 것이 좋다.

 

아이템 7. 결과 부족이 발생할 경우 null과 Failure 를 사용하라

- 예외는 정보를 전달하는 방식으로 사용되어서는 안된다. 심지어 try-catch 내부에 코드를 배치하면, 컴파일러가 할 수 있는 최적화가 제한된다. 따라서 충분히 예측할 수 있는 범위의 오류는 null과 Failure를 사용하고, 예측하기 어려운 예외적 범위의 오류만 throw 로 처리하는게 낫다. 

 

아이템 16. 프로퍼티는 동작이 아니라 상태를 나타내야 한다.

- 원칙적으로 프로퍼티는 상태를 나타내거나 설정하기 위한 목적으로만 사용하는 것이 좋고, 다른 로직은 포함하지 않아야 합니다. '이 프로퍼티를 함수로 만들 때 get 또는 set 을 붙일 것인가?' 라는 질문에 NO 라면 이를 프로퍼티로 만드는 것은 좋지 않습니다.

- 연산 비용이 높거나 복잡도가 O(1)보다 큰 경우, 비지니스 로직을 포함하는 경우, 결정적이지 않은 경우 등에선 프로퍼티가 아니라 함수로 만드는 게 낫습니다. 

 

아이템 30. 요소의 가시성을 최소화하라

- 데이터를 저장하도록 설계된 클래스는 숨길 이유가 없기 때문에 프로퍼티를 사용할 수 있게 눈에 띄게 만드는 것이 좋고, 필요하지 않은 프로퍼티는 제거하는 것이 좋습니다. 

 

아이템 34. 기본 생성자에 이름 있는 옵션 아규먼트를 사용하라

- 깃헙등으로 단순하게 코드를 읽는 사람은 IDE 의 지원을 받을 수 없습니다. 만약 이름 있는 Argument 를 활용해서 명시적으로 이름을 붙여 주면, 의미가 훨씬 명확할 것입니다. 

 

아이템 39. 태그 클래스보다는 클래스 계층을 사용하라.

- sealed 한정자는 외부 파일에서 서브클래스를 만들 수 없습니다. 

 

아이템 40. equals 의 규약을 지켜라.

- equals 는 제공되는 대로 쓰는게 제일 낫지만 직접 구현해야 한다면, 반사적, 대칭적, 연속적, 일관적 동작을 하는 지 꼭 확인해야 합니다. 그리고 이러한 클래스는 final 로 만드는 것이 좋습니다. 만약 상속을 한다면 서브클래스에서 equals 가 작동하는 방식을 변경하면 안됩니다. 

 

아이템 41. hashCode 의 규약을 지켜라

- 객체를 변경하지 않았다면 hashCode의 결과는 항상 같아야 합니다.

- equals 가 같다면 hashCode 도 같아야 합니다.

 

아이템 43. API 의 필수적이지 않은 부분을 확장 함수로 추출하라

- API 의 필수적인 부분은 멤버로 두는 것이 좋지만, 필수적이지 않은 부분은 확장 함수로 만드는 것이 여러모로 좋습니다. 

 

아이템 45. 불필요한 객체 생성을 피하라

- nullable 타입을 연산하거나 Generic 타입을 사용할 때 기본자료형을 wrap 한 자료형이 사용됩니다. 

 

아이템 47. 인라인 클래스의 사용을 고려하라

- 인라인 클래스는 다른 자료형을 래핑해서 새로운 자료형을 만들 때 많이 사용됩니다. 

- 측정 단위를 표현하거나, 타입 오용으로 발생하는 문제를 막을 때 많이 사용됩니다.