- 테스트 패키지에 실습을 위한 다양한 테스트 케이스들이 단계별로 존재합니다.
- 모두 Fail되고 있는 이 케이스들을 전부 성공하도록 만드는 것이 실습 목표입니다.
- 모든 실습은 저희가 매칭해드리는 파트너와 함께하시게 됩니다.
- 진행하시는 동안 어려움이 생긴다면 주변을 돌아다니고 있는 코치들을 마음껏 활용하시며 편하게 질문해주시면 됩니다. 🙂
- 최신 버전의 IntelliJ IDEA 설치가 필요합니다.
- 이곳에서 다운받으실 수 있습니다.
- 변경되지 않는 객체, 변경할 수 없는 객체다.
- String, Int, Long와 같은 원시 타입도 불변 객체의 일종이다.
- Employee의 이름을 변경하더라도 객체의 이름을 직접 접근하여 변경하기보다, 변경된 이름을 리턴하는 새로운 객체를 만들어보자.
- 기존 객체와 똑같은 객체를 만드는 것이다.
- 외부에서 객체를 변경해도 내부의 객체는 변경되지 않는다.
- 같은 객체끼리의 변경이 공유되는 것을 막을 수 있다.
- 외부 → 내부 (List로 공개되었더라도 구현체가 MutableList이면 공격 가능)
- 내부 → 외부 (내부에서 MutableList로 사용하기 때문에 외부에서 List로 사용하더라도 값이 변경될 수 있음)
- 불변 객체를 활용하지 않더라도 방어적 복사를 이용하면 대부분의 side effect와 관련된 이슈를 방지할 수 있다.
- 외부에서 복사된 컬렉션의 값을 임의로 조작하더라도 원본 데이터는 유지되어야 한다.
- 누군가가 나의 연봉 정보를 임의로 조작할 수 없도록 바꿔보자.
DefensiveCopyViewModelTest
는 실습용이 아니고 안드로이드 개발자를 위한 예시이니 참고만 해보자.
불변 객체를 사용할 수 있는 세 가지 방법을 익히고 각각을 가독성 측면에서 비교해보자.
- inline 상태로 사용
- 확장 함수로 분리
- 클래스로 분리
다음 요구사항을 만족하는 프로그램을 직접 작성해보며 불변 객체에 익숙해져보자.
- 새로운 사원을 추가할 수 있다.
- 사원의 이름과 남은 휴가일수를 제공해야 한다.
- 사원의 휴가 정보를 조회할 수 있다.
- 사원은 휴가를 소비할 수 있다.
명령어를 입력하세요: add 김태현 16
이름: 김태현
남은 휴가일수: 16
휴가일:
명령어를 입력하세요: show 김수현
이름: 김수현
남은 휴가일수: 7
휴가일:
명령어를 입력하세요: vacation 김태현 2022-01-03 2022-01-04 2022-01-05 2022-01-06 2022-01-07
이름: 김태현
남은 휴가일수: 11
휴가일: 2022-01-03, 2022-01-04, 2022-01-05, 2022-01-06, 2022-01-07
- Side Effect를 끊는걸 의식적으로 연습해보기
var
키워드 하나도 쓰지않기- 클래스 또는 함수 서명(Signature)에서 Mutable 없애기
- (Optional) 함수 본문에서 Mutable Collection 사용하지 않기
- (Optional) 비어있는 테스트 코드 완성하기
- 일급 컬렉션을 공부해보고 실습해서 활용해보기
- 유효성 검사를 할 때 다음처럼 작성하게 되면 생성자를 통한 초기화 이후로 값이 변경되지 않으므로 내부 프로퍼티가 중간에 바뀌지 않았다는 것을 믿고 사용할 수 있다.
data class User(val name: String, val email: String) {
init {
require(name.isNotBlank())
require(isValidEmail(email))
}
private fun isValidEmail(email: String): Boolean = TODO()
}