객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다. 협력에 참여하는 모든 객체들은 역할과 책임을 다하고 있다. 객체지향의 핵심은 적절한 객체에게 적절한 책임을 할당하는 것에서 시작된다. 역할, 책임, 협력 역할 협력 안에서 차지하는 책임이나 의무를 의미한다. 관련성 높은 책임의 집합이다. 협력 "어떤 객체도 섬이 아니다" - 워드 커닝험 객체는 역할과 책임을 다하는 동시에, 다른 객체와 협력한다. 객체 간의 연쇄적인 요청과 응답의 흐름으로 구성되어 있다. 협력이 얼마나 조화를 이루는지는 객체가 결정한다. 협력의 품질을 결정하는 것은 객체의 품질이다. 객체의 역할 여러 객체가 동일한 역할을 수행할 수 있다. 객체를 사용하는 다른 객체의 입장에서는, 어떤 객체가 자신의 ..
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는 클래스 내에 여러개 구현 가능) ..
들어가며 엘레강트 오브젝트의 1장은 출생이다. 이 책에서는 객체를 살아있는 유기체라고 여기는데, 이러한 객체를 대상으로 출생, 학교생활, 회사생활, 은퇴의 챕터로 이루어져 있다. 1장의 제목이 출생인 만큼, 객체의 이름과 생성에 대해 다룬다. 이 책의 목표는 객체와 객체의 역할을 이해하여 유지보수성을 향상시키는 것이다. 그에 따르는 장점은 아래와 같다. 유지보수성 향상 코드 길이 감소 이해하기 쉬움 응집도 높아짐 if (price < 100) { val extra = Cash(5) price.add(extra) } 먼저 객체는 자신의 가시성 범위 내에서 살아간다. 예를 들어 위 코드에서 price는 extra 객체의 외부에 존재하고, 숫자 5는 객체 내부에 존재한다. 1. -er로 끝나는 이름을 사용하지..
우테코에 들어와서 첫 미션을 마쳤다! 첫 미션은 프리코스 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..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bba9vm/btsCN5xb4Ow/GaAAPLvnr7rzVH4PQ7E4m0/img.png)
우테코 6기 ot 전날 설렘 반 떨림 반의 마음으로 합격 회고를 적어본다. 뒤늦게 합격 회고를 적는 이유는... 우테코 과정에서 얻은 사소한 것 모두 티스토리에 기록하자는 자신과의 다짐을 했는데, 이 합격 회고가 그 기록의 시작이길 바라며! 지원 계기+자소서 사실 얼른 취업하고 싶은 마음이 커서 (지금은 아님), 혼자 기업지원+스터디를 할 생각이었다. 그래서 우테코 모집글을 보고도 아무 생각 없이 넘겼고, 내 머릿속에서 우테코가 잊혀질 때쯤.. 우연히 백준에서 우테코 지원 광고를 다시 보게 되었다. "취준 기간 동안, 증거로 남는 의미있는 활동을 하는 것도 좋다"는 동기의 말이 생각나 지원을 다짐했다. 그때가 딱 지원 마감 하루 전이라서 자소서 벼락치기를 했다 ^^;; 우테코 자소서가 기존에 작성하던 기..
특정 뷰가 사용자에게 보여지지 않을 때를 처리할 경우가 있다. 안드로이드 View 클래스에 onWindowVisibilityChanged 라는 리스너가 있었는데, xml이나 코드 상에서 뷰의 visibility 자체를 GONE, INVISIBLE, VISIBLE로 변경하는 경우에만 호출이 되었다. (참고: https://developer.android.com/reference/android/view/View#onWindowVisibilityChanged(int)) 하지만 visibility는 변하지 않고 다른 뷰에 의해 가려지거나 스크롤 액션에 의해 가려지는 경우를 특정하고 싶었다. 그래서 디바이스 화면 자체에서 뷰의 x, y 좌표를 구하고, 그 좌표가 음수값인지 아닌지에 따라 hide 여부를 판별했다...