미션 관련 링크 오목 레포지토리 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..
우테코에서 진행했던 방과후 수업 자료를 업로드한다. 엘레강트 오브젝트 스터디를 하면서 인상 깊었던 내용과, 이를 우테코 미션에 어떻게 적용했는지에 대해 얘기했다. 발표에 대한 강박을 깨기 위해 수업을 진행했는데, 머리 속 뒤죽박죽 했던 지식들을 정리할 수 있어서 좋았다 🤗 명령형 프로그래밍 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 기존에는 카드를 받을 때마다 카드의 점수를 계산해서, 멤버 프로퍼티를 갱신하는 로직이었다. 그런데 리뷰어님이..
자바처럼 코틀린에서도 클래스 안에 다른 클래스를 선언할 수 있다. 도우미 클래스(?)를 캡슐화하거나 코드를 사용하는 곳에 가까이 두고 싶을 때 유용하다. 코틀린에서는 클래스 내부에 다른 클래스를 정의할 수 있는 두 가지 방법이 있다. 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..
객체 객체는 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체다. 객체 식별 가능한 개체 또는 사물이다. 객체는 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수도 있다. 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다. 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다. 상태 객체가 주변 환경의 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤 일이 발생했느냐에 좌우된다. 어떤 행동의 결과는 과거에 어떤 행동들이 일어났었느냐에 의존한다. 상태를 이용하면 과거의 모든 행동을 기억하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다. 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식..
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) 여러번 사용되는 상수는, 해당 상수를 사용하는 클래스에 각각 선언하는 것은 중복 코드라고 생각했기 때문이다. 또한 하나의 클래스에 상수를 선언하고, 다른 클래스에서는 그 클래스의 상수를 참조한다면, "상수를 선언하는 클래스를 어떻게 정할지..
객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다. 협력에 참여하는 모든 객체들은 역할과 책임을 다하고 있다. 객체지향의 핵심은 적절한 객체에게 적절한 책임을 할당하는 것에서 시작된다. 역할, 책임, 협력 역할 협력 안에서 차지하는 책임이나 의무를 의미한다. 관련성 높은 책임의 집합이다. 협력 "어떤 객체도 섬이 아니다" - 워드 커닝험 객체는 역할과 책임을 다하는 동시에, 다른 객체와 협력한다. 객체 간의 연쇄적인 요청과 응답의 흐름으로 구성되어 있다. 협력이 얼마나 조화를 이루는지는 객체가 결정한다. 협력의 품질을 결정하는 것은 객체의 품질이다. 객체의 역할 여러 객체가 동일한 역할을 수행할 수 있다. 객체를 사용하는 다른 객체의 입장에서는, 어떤 객체가 자신의 ..