본문 바로가기

분류 전체보기

(76)
[Architecture] ISP, LSP 적용하기 안녕하세요.회사에서 진행한 프로젝트에 적용했던, ISP, LSP와 관련된 사례를 정리해보겠습니다.ISP & LSPISP (Interface Segregation Principle)인터페이스는 클라이언트에 맞게 분리하라- 하나의 커다란 인터페이스 보다는, 역할에 맞는 작은 인터페이스 여러 개로 나누는 것이 좋다 LSP (Liskov Substitution Principle)하위 타입은 상위 타입을 대체할 수 있어야 한다- 자식 클래스는 부모 클래스를 대체할 수 있어야 한다- 상위 클래스: Bird // 하위 클래스: 날지 못하는 새 → LSP 위반 LSP 위반유관 부서에서 기능 추가를 요청했습니다JsonTimeUpdateSharedPreferenceTimeUpdate 이와 관련된 클래스가 아래와 같다고 가..
[함수형 프로그래밍] 고차 함수 안녕하세요.오늘은 함수형 프로그래밍에 필요한 기본 개념인 고차 함수에 대해 알아보도록 하겠습니다.고차 함수 (High-Order Function)부분 함수 (Partial Function)커링 함수 (Currying Function)합성 함수 (Composition Function)일급 객체함수형 프로그래밍에서는 함수를 객체처럼 다룹니다.코틀린도 이러한 함수형 프로그래밍 기능을 지원하는 언어 중 하나입니다.1) 고차 함수 (High-Order Function)함수를 변수처럼 전달하고 반환할 수 있는 개념으로, 아래 2가지 기능이 가능합니다함수를 매개변수로 받는 함수 ( highOrderFunction1 )함수를 반환하는 함수 ( highOrderFunction2 )fun highOrderFunction1..
[Microbenchmark] try-catch block 성능 테스트 안녕하세요.오늘은 try-catch block의 성능에 대해서 분석해보겠습니다.필요성Effective Kotlin의 item7 (결과 부족이 발생한 경우 null과 Failure를 사용하라) 에서 아래 구문을 확인했습니다.try-catch 블록 내부에 코드를 배치하면, 컴파일러가 할 수 있는 최적화가 제한된다 실제로 얼마나 차이나는지 궁금해져서 테스트 해보게 되었습니다.Microbenchmark성능 분석을 위해 Android에서 제공하는 Microbenchmark를 사용했습니다.https://developer.android.com/topic/performance/benchmarking/microbenchmark-write?hl=ko Microbenchmark 작성  |  App quality  |  An..
[Kotlin] Builder Pattern 대체하기 안녕하세요.오늘은 Builder Pattern에 대해 알아보고, 코틀린에서는 이를 어떻게 쉽게 대체하는지 알아보겠습니다.Builder PatternBuilder Pattern은 객체를 단계별로 설정하고, 최종적으로 객체를 생성하는 방식입니다. 객체가 복잡하고 여러 인자가 필요할 때,각 인자들을 설정하는 메서드를 호출하여 객체를 만드는 패턴입니다. Java 예제여러 프로퍼티를 가지는 객체 Car가 있습니다.public class Car { private String engine; private String wheels; private String seats; private String airConditioning; public Car(String engine, String whe..
[Kotlin] Generic (3) - 그 외 지난 Generic (1), (2) 포스팅에 이어서Generic (3) 포스팅을 끝으로 제네릭에 대해 전부 알아보겠습니다제네릭 타입 삭제 (Type Erasure)kotlin은 런타임에 제네릭 타입 정보를 유지하지 않습니다.→ 컴파일 시점에만 타입 정보가 사용되고 런타임에는 제네릭 타입에 대한 정보가 사라집니다. is 연산자로 타입 체크를 할 수 없습니다.fun checkType(value: T) { if (value is String) { // 오류: 'Cannot check for instance of erased type: T' println("This is a String!") } else { println("This is not a String!") ..
[Kotlin] Generic (2) - 변성 지난 포스팅에 이어서이번에는 Generic의 변성에 대해 알아보도록 하겠습니다.개요코틀린의 변성(Variance)은 제네릭 타입 간의 상속 관계를 정의하는 방식입니다.변성은 무공변성(Invariance), 공변성(Covariance), 반공변성(Contravariance) 로 나뉩니다.무공변성 (Invariance)제네릭은 기본적으로 무변성입니다.Box은 Box으로 간주되지 않으며, 두 타입은 전혀 관련이 없습니다.class Box(val value: T)fun useBox(box: Box) { println(box.value)}fun main() { val stringBox: Box = Box("Hello") useBox(stringBox) // 컴파일 오류} 이유무공변성은 타입 안정성..
[Kotlin] Generic (1) - 제네릭? 안녕하세요.오늘은 Generic에 대해서 알아보겠습니다.제네릭?제네릭은 클래스나 함수에서 타입을 파라미터화 할 수 있는 기능입니다.코드 작성 시점에 구체적인 타입을 지정하지 않고, 타입을 변수처럼 처리할 수 있어 여러 타입을 다룰 수 있게 합니다. 제네릭을 사용하면 2가지 장점을 얻을 수 있습니다. 1) 타입 안정성컴파일 타임에 타입 오류를 검출해 타입 안정성을 강화합니다.제네릭을 안 쓰게 되면, 컴파일 시점에 아래 오류를 못 잡고 런타임 에러가 발생합니다.fun addToList(list: List, item: Any): List { val mutableList = list.toMutableList() mutableList.add(item) return mutableList}fun ma..
[Kotlin] 위임 (Delegation) 안녕하세요. 오늘은 위임 (Delegation) 에 대해 알아보겠습니다. 다른 부서의 코드를 참고하다가 아래와 같은 코드를 봤습니다.class UserRepository(userDao: UserDao) : UserDao by userDao 오늘은 이 코드를 이해해 보도록 하겠습니다.위임?위임 (Delegation) 은 객체지향 프로그래밍에서 구성 (Composition)을 활용하여객체의 일부 기능을 다른 객체에 위임하는 디자인 패턴입니다. 코틀린에서는 by 키워드를 통해 위임을 쉽게 구현하도록 도와줍니다. 위임은 크게 2가지가 있습니다.1) 클래스 위임 (Class Delegation)2) 위임 프로퍼티 (Delegated Properties)클래스 위임클래스 위임은 by 키워드를 사용하여 클래스에서 특..