세상을 바꾸는 개발자

[이펙티브 코틀린] 코틀린의 안정성 - 가변성을 제한하라 본문

안드로이드/Kotlin

[이펙티브 코틀린] 코틀린의 안정성 - 가변성을 제한하라

헬창코딩 2023. 7. 9. 13:00

안드로이드는 자바와 코틀린 2가지 언어로 개발을 할 수 있지만 요즘 자바를 사용해서 개발하는 경우는 찾아보기 힘듬니다

저또한 코틀린을 사용합니다 하지만 사용하면서 잘 몰랐던 부분도 있고 한번도 써보지않는 편리고 좋은 기능들이 많이 존재합니다 그래서 이번에 복습할겸 이펙티브 코틀린의 내용으로 정리를 하려고 합니다.

 

안정성 - 가변성을 제한하라

사람들이 많이 사용하는 앱이더라도 가끔 생각대로 동작하지 않거나 크래시가 발생하는 경우가 있습니다

이때 사용자들은 앱에 대한 신뢰도가 크게 떨어지게 됩니다

그래서 프로그래밍에 있어서 안정성은 정말 중요한 요소입니다

안정성으로 인해서 좋은 서비스, 나쁜 서비스로 나뉠 수 도 있다고 생각합니다

코틀린은 다양한 개발자들의 경험을 토대로 만들어진 언어이기때문에 사용자들의 신뢰도를 하락시키지 않도록 안정성을 개선한 언어라고 합니다. 하지만 정말로 안전하게 사용하려면 개발자가 뒷받침을 해야합니다

 

코틀린은 모듈로 프로그램을 설계한다

모듈은 클래스, 객체, 함수, 타입 별칭, 톱레벨 프로퍼티 등 다양한 요소로 구성

이러한 요소중 일부는 상태를 가질 수 있다 이러한 상태를 이용해서 요소를 표현할 수 있다는 것은 유용하지만, 상태를 적절하게 관리하는게 생각보다 어렵다

상태를 관리하기 힘든 이유

  1. 프로그램을 이해하기 힘들고 디버그가 힘듬
  2. 가변성이 있다면 코드의 추론이 힘들다
  3. 멀티스레드를 사용할때 각별한 주의가 필요하다
  4. 테스트하기가 어렵다
  5. 상태변경이 일어날때 다른 부분에 알려야하는 경우가 있다

→ 이러한 변화하는 상태를 제어하는 방법은 바로 가변성을 제한하는 방법이다

 

 

코틀린 가변성을 제한하는 방법

  1. 읽기 전용 프로퍼티 사용(val)
  2. 가변 컬렉션과 읽기 전용 컬렉션 구분하기(mutable, immutable)
  3. 데이터 클래스의 copy

val 은 읽기 전용 프로퍼티 지만, 불변을 의미하는 것은 아님

코틀린에서 읽기전용 컬렉션을 mutable 컬렉션으로 다운캐스팅하면 안된다 만약 변경을 해야한다면 copy를 이

용해서 새로운 컬렉션을 만드는 list.toMutableList를 활용해야한다

 

 

immutable 객체를 사용하면 얻어지는 장점

  • 한번 정의된 상태가 유지되므로, 코드를 이해하기 쉬움
  • immutable 객체를 공유했을 때도 충돌이 따로 이루어지지 않으므로, 병렬 처리를 안전하게 할 수 있음
  • immutable 객체에 대한 참조는 변경되지 않으므로, 쉽게 캐시할 수 있음
  • 방어적 복사본(defensive copy)을 만들 필요가 없음
  • 다른 객체를 만들때 활용하기 좋다
  • set, map 의 키로 사용 될 수 있다

가변 컬렉션과 읽기 전용 컬렉션 구분하기(mutable, immutable) 을 사용할때 주의 할점

  • 변경가능 지점을 잘 파악하기
  • 변경가능 지점 노출하기 말기 (copy() 를 사용하거나 슈퍼타입으로 업캐스트 하여 가변성을 제한해라)

 

결론

  • var 보다는 val을 사용하는 것이 좋다
  • mutable 프로퍼티 보다는 immutable 프로퍼티를 사용하는 것이 좋다
  • mutable 객체와 클래스 보다는 immutable 객체와 클래스를 사용하는 것이 좋다
  • 변경이 필요한 대상을 만들어야 한다면 immutable 데이터 클래스로 만들고 copy를 활용하는 것이 좋다
  • 컬렉션의 상태를 저장해야 한다면, mutable 컬렉션 보다는 읽기 전용 컬렉션을 사용하는 것이 좋다
  • 변이 지점을 적절하기 설계하고 불필요한 변이 지점은 만들지 않는 것이 좋다
  • mutable 객체를 외부에 노출하지 않는 것이 좋다

 

 

참고
이펙티브 코틀린 - 마르친 모스칼라

https://www.yes24.com/Product/Goods/106225986?pid=123487&cosemkid=go16425707805513414&gclid=Cj0KCQjwkqSlBhDaARIsAFJANkh22-JTxdPc8T_EVm_zFCdyFe_T0Sck0-eaezdQY6KogkHeMnE5rMYaAphlEALw_wcB

Comments