최근 코틀린을 다루는 기술 이란 책을 읽으면서 해당 책 내용들을 정리하고자 이렇게 간만에 포스팅을 합니다.


책에서 다룰 내용

  • 좀 더 추상화 하기 : 공통 패턴을 인식해 이런 패턴을 추상화함으로써 같은 패턴을 쓰고 또 쓰는 일을 피하는 것
  • 불변성(immutability) : 변경 불가능한 데이터만 사용하는 기법
  • 참조 투명성 : 같은 입력이 주어지면 항상 같은 결과를 내놓는 프로그램을 작성하는 기법
  • 상태 변이 공유 캡슐화 : 변경 불가능한 데이터를 사용하면 상태 변이를 실수로 공유하는 일을 막을 수 있지만 동시성 및 병렬 프로그램 때에는 상태 변이를 공유해야한다
  • 제어 흐름과 제어 구조 추상화 : 전통적 프로그램은 루프나 조건 테스트 같은 제어 구조로 구성되는데 이런 구조는 잘못 사용하기 쉬워서 추상화 하여 사용하는것이 좋다
  • 올바른 타입 사용하기 : 단위를 고려하여 값 타입을 사용
  • 지연 계산 활용하기 : 특정 요소가 실제로 쓰일때 계산을 하는 방식

프로그램을 더 안전하게 만들기

우리는 전체 개발 시간 중 20%를 버그가 있는 프로그램을 작성하는 데 소비하고, 40%를 버그가 있는지 없는지 확실치 않은 코드를 리팩터링하는 데 사용하며, 나머지 40%를 프로덕션에 이미 들어 있는 코드를 디버깅하는 데 사용한다.

프로그램을 더 안전하기 만들기 위해서는 아래와 같은 방식들이 있다

  • 부수효과(=side effect)를 여러분이 작성하는 프로그램의 일부 영역안에서만 일어나도록 제한해라
    • 값을 반환하는 메서드나 함수가 외부 상태를 변경하는 경우 이를 부수 효과(=side effect)라고 한다.
    • 일반적으로 부수 효과는 단일 책임 원칙(SRP)를 위배하는 좋지 못한 기법이다.
  • 참조 투명한 프로그램을 만들어라
    • 프로그램의 출력은 오직 그 인자에 의해서만 영향을 받아야 한다.
    • 외부 세계의 상태를 변경하지도 않고 외부 상태에 의존하지도 않는 코드를 일컬어 참조 투명하다고 한다.
    • 참조 투명한 코드의 특징
      • 자기 완결적 : 어떤 문맥에서나 그 코드를 사용할 수 있다
      • 결정적 : 인자가 같으면 항상 결과가 같기 때문에 놀랄 일이 없다
      • 절대 예외를 던지지 않는다 : 다만 Out Of Memory Error 나 Stack overflow Error 를 발생시킬 순 있다.
      • 예기치 않게 다른 코드가 실패하는 상황을 만들지 않는다 : 인자를 변경하거나 다른 외부데이터를 변경하지 않기에 그로 인해 오류가 발생하지 않는다
      • 동작을 위해 외부 장치에 의존하지 않는다 : 예를 들어 데이터 베이스나 네트워크같은 장치가 사용이 안될때도 동작을 한다
  • 제어 구조를 피하라
  • 예외를 던지지 마라 (=예외는 goto문의 현대적인 변형이라 할 수 있다)

안전한 프로그래밍의 이점

  • 프로그램이 결정적이기 때문에 프로그램을 추론하기 더 쉽다
  • 더 쉽게 테스트할 수 있다
  • 더 모듈화할 수 있다
  • 쉬벡 합성하고 재조합할 수 있다
  • 공유 상태 변이를 피하므로 태생적으로 스레드 안전적이다

요약

  • 결과값을 반환하는 함수를 외부와 상호 작용하는 효과와 명확히 분리함으로써 프로그램을 더 안전하게 만들 수 있다
  • 함수의 출력이 결정적이고 함수가 외부 상태에 의조하지 않는다면 함수를 더 쉽게 테스트하고 함수의 성질을 더 잘 추론할 수 있다.
  • 더 높은 수준까지 추상화를 추구한다면 안전성, 유지 보수 용이성, 테스트 용이성, 재사용성이 좋아진다.
  • 불변성이나 참조 투명성과 같은 안전성 원칙을 적용하면 프로그램이 상태 변이를 실수로 공유하는 경우를 방지할 수 있다. 다중 스레드 환경에서 발생하는 버그 중 많은 경우가 상태 변이 공유로 인해 발생한다.