미션 관련 링크영화 티켓 예메 레포지토리https://github.com/kimhm0728/android-movie-ticket영화 티켓 예매 1, 2단계 PRhttps://github.com/woowacourse/android-movie-ticket/pull/72영화 티켓 예매 3, 4단계 PRhttps://github.com/woowacourse/android-movie-ticket/pull/83 코드 리뷰 받은 코멘트들 액티비티 테스트에서 다른 액티비티로의 이동, 앱 종료 등은 테스트하지 않는다도메인 테스트에서도, 해당하는 객체에 대해서만 테스트했고 다른 객체는 테스트하지 않았듯이액티비티 테스트에서는 한 액티비티에서의 시나리오만을 검증한다.Ui 테스트에서는 하나의 시나리오에 관점을 두고 진행한..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/D9H2E/btsGCY0xahO/qKSqTlP8LgKqSkTiJoD5bk/img.png)
미션 관련 링크 오목 레포지토리 https://github.com/kimhm0728/kotlin-omok 오목(렌주룰) 1단계 PR https://github.com/woowacourse/kotlin-omok/pull/62 오목(안드로이드, 데이터베이스) 2단계 PR https://github.com/woowacourse/kotlin-omok/pull/93 코드 리뷰 받은 코멘트들 Dao는 도메인 로직일까? 모델의 생성자에 Dao를 받아서, 모델 내에서 저장을 해주었다. 하지만 데이터를 저장하는 것은 도메인 로직이 아니기 때문에, 모델이 Dao를 알 필요가 없다. Dao(SQLite) 자체가 안드로이드 프레임워크에 의존적이니, 액티비티에서 Dao를 수행한다. Activity 내의 flag flag가 Ac..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/b2wFuh/btsGANZZetr/2xwWBBxW0MmQCDkkyOIkf0/img.png)
우테코에서 진행했던 방과후 수업 자료를 업로드한다. 엘레강트 오브젝트 스터디를 하면서 인상 깊었던 내용과, 이를 우테코 미션에 어떻게 적용했는지에 대해 얘기했다. 발표에 대한 강박을 깨기 위해 수업을 진행했는데, 머리 속 뒤죽박죽 했던 지식들을 정리할 수 있어서 좋았다 🤗 명령형 프로그래밍 vs 선언적 프로그래밍 명령형 프로그래밍 :컴퓨터처럼 연산을 차례대로 실행한다. 주로 static 메서드로 구성된다. 선언적인 프로그래밍 : 객체와 객체 사이의 관계로 구성된다. 예를 들어, 세 개의 수 중 중간 값(between)을 찾는 기능을 구현한다고 하자. 명령형 프로그래밍 public static int between(int l, int r, int x) { return Math.min(Math.max(l, ..
미션 관련 링크 블랙잭 레포지토리 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 기존에는 카드를 받을 때마다 카드의 점수를 계산해서, 멤버 프로퍼티를 갱신하는 로직이었다. 그런데 리뷰어님이..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/2mI82/btsF9G8EV86/hsp85ftML2I0SG2g5gF7p0/img.png)
자바처럼 코틀린에서도 클래스 안에 다른 클래스를 선언할 수 있다. 도우미 클래스(?)를 캡슐화하거나 코드를 사용하는 곳에 가까이 두고 싶을 때 유용하다. 코틀린에서는 클래스 내부에 다른 클래스를 정의할 수 있는 두 가지 방법이 있다. 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)라고도 한다. 이러한 불변 객체에도 단점이 있다. 값을 변경할 때마다 인스턴스를 생성하기 때문에 메모리 측면에서 비효율적일 수 있다는 점이다. (하지만 불변 객체는 메모리를 걱정하는 것..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/VBYx5/btsGB9O0a0S/bKLITyJW1DCgu1OiM22DN0/img.png)
미션 관련 링크 로또 레포지토리 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는 클래스 내에 여러개 구현 가능) ..