미션 관련 링크 블랙잭 레포지토리 https://github.com/kimhm0728/kotlin-blackjack 블랙잭 1단계 PR https://github.com/woowacourse/kotlin-blackjack/pull/72 블랙잭(베팅) 2단계 PR https://github.com/woowacourse/kotlin-blackjack/pull/97 코드 리뷰 받은 코멘트들 테스트를 위한 부생성자 테스트를 위해 작성된 생성자는 결국 실제 코드에서도 쓰이게 되는 경우가 대부분이다. 그래서 이는 클라이언트에게 객체의 생성 방법을 여러개 열어둔 것이라고 생각한다. Lazy Evaluation 기존에는 카드를 받을 때마다 카드의 점수를 계산해서, 멤버 프로퍼티를 갱신하는 로직이었다. 그런데 리뷰어님이..
자바처럼 코틀린에서도 클래스 안에 다른 클래스를 선언할 수 있다. 도우미 클래스(?)를 캡슐화하거나 코드를 사용하는 곳에 가까이 두고 싶을 때 유용하다. 코틀린에서는 클래스 내부에 다른 클래스를 정의할 수 있는 두 가지 방법이 있다. nested class와 inner class인데, 먼저 nested class에 대해 알아보자. nested class sealed class Error(val message: String) { class NetworkError : Error("Network failure") class DatabaseError : Error("Database cannot be reached") class UnknownError : Error("An unknown error has occu..
data class Cash(val dollars: Int) { fun mul(factor: Int): Cash { return Cash(dollars * factor) } } 우아한테크코스에서 수업을 들으며, "불변 객체"에 대해 학습했다. 불변 객체의 특징과 장점은 아래와 같다. 생성자를 통해서만 초기화한다. 변경할 수 없기 때문에 동시에 접근해도 항상 같은 값을 보장한다. 실패 원자성을 보장한다. (메서드를 수행하다가 예외가 발생하는 경우에도 메서드 수행 전 상태와 동일함을 보장) 도메인의 불변 객체를 값 객체(VO)라고도 한다. 이러한 불변 객체에도 단점이 있다. 값을 변경할 때마다 인스턴스를 생성하기 때문에 메모리 측면에서 비효율적일 수 있다는 점이다. (하지만 불변 객체는 메모리를 걱정하는 것..
미션 관련 링크 로또 레포지토리 https://github.com/kimhm0728/kotlin-lotto 로또(자동) 1단계 PR https://github.com/woowacourse/kotlin-lotto/pull/74 로또 (수동) 2단계PR https://github.com/woowacourse/kotlin-lotto/pull/94 코드 리뷰 받은 코멘트들 상수를 관련 클래스에 포함시키자 기존에는 상수만을 갖는 클래스를 생성했다. (LottoConstants) 여러번 사용되는 상수는, 해당 상수를 사용하는 클래스에 각각 선언하는 것은 중복 코드라고 생각했기 때문이다. 또한 하나의 클래스에 상수를 선언하고, 다른 클래스에서는 그 클래스의 상수를 참조한다면, "상수를 선언하는 클래스를 어떻게 정할지..
companion object class WithCompanion { ... companion object { val i = 3 fun f() = i * 3 } } fun main() { println(WithCompanion.i) println(WithCompanion.Companion.i) WithCompanion.f() WithCompanion.Companion.f() } 클래스의 일부만 싱글톤으로 구현하고 싶을 때 사용한다. 클래스명.Companion 로 companion object에 접근할 수 있고 Companion은 생략 가능하다. 클래스명으로 접근할 수 있기 때문에 클래스 내에 companion object는 단 하나만 생성 가능하다. (일반 object는 클래스 내에 여러개 구현 가능) ..
우테코에 들어와서 첫 미션을 마쳤다! 첫 미션은 프리코스 2주차 미션과 동일한, 자동차 경주였다. 조금 늦은 감이 있지만.. 이번 미션에 대한 회고를 작성하려 한다. 미션 관련 링크 자동차 경주 레포지토리 https://github.com/kimhm0728/kotlin-racingcar 자동차 경주(구현) 1단계 PR https://github.com/woowacourse/kotlin-racingcar/pull/100 자동차 경주(리팩터링) 2단계 PR https://github.com/woowacourse/kotlin-racingcar/pull/116 코드 리뷰 받은 코멘트들 변경에 유연한 테스트 함수명을 사용하자. 기존에는 `자동차 이름이 다섯 글자가 넘는 경우 예외가 발생한다`라는 함수를 작성했다...
우아한테크코스에서 강의를 듣던 중, "유효성 검증이 필요한 불변 프로퍼티를 가변 프로퍼티로 변경하게 되었을 때, 그 프로퍼티에 대한 유효성 검증은 어떻게 할 것인가"에 대한 주제가 나왔었다. 이해를 위해 실제 코드를 보며 설명하겠다. class Car(name: String, position: Int) { var name: String = name private set var position: Int = position private set init { require(name.length
const val과 val의 차이점은? val private val result = sum(3, 5) fun sum(a: Int, b: Int) = a + b val 키워드를 사용했기 때문에 불변 프로퍼티가 되지만, 런타임 시 프로퍼티의 값이 결정된다. 즉, val 프로퍼티에 대입되는 값이 함수의 값이라면, 함수의 인자로 어떤 값을 넣느냐에 따라 달라질 수 있다. const val const val result = 8 컴파일 시 결정되는 상수이기 때문에 런타임 시에는 변하지 않는다. primitive type과 String만 const 키워드를 사용할 수 있다. 코틀린의 primitive type과 wrapper type 자바에는 int, double 등의 primitive type과 Integer, D..