분류 전체보기

    프로그래머에게 디자인 패턴이 중요한 이유

    디자인 패턴의 등장 배경 개발자들은 개발을 하면서 프로그램의 유연성과 확장성과 관련된 비슷한 문제들을 마주하며, 이 문제들은 풀기 위해서 많은 시간이 소요된다. 만약 이 문제들에 해결책이 있다면 어떨까? 문제를 풀기 위한 시간을 줄일 수 있을 것이다. 이러한 생각에서 만들어진 것이 바로 소프트웨어 디자인 패턴이다. 디자인 패턴은 개발을 하면서 생길 수 있는 문제를 유형별로 나눠서 해결책을 제시한다. 즉, 디자인 패턴은 일종의 수학 공식 같은 역할을 한다. 다만 수학 문제가 개발의 확장성 유연성 문제가 되고 수학 공식은 디자인 패턴이 된다. 만약 우리가 근의 공식을 안다면 2차 함수 문제를 빠르게 풀 수 있지만 근의 공식을 모른다면 2차 함수 문제를 푸는데 시간이 걸린다. 디자인 패턴도 마찬가지로 디자인 ..

    [Kotlin] 옵저버 패턴 직접 구현해보기

    개요 앞선 글에서 Delegates.observable이 어떻게 구현되었는지 살펴봤다. 이번 글에서는 이 구현을 간소화해서 필요한 부분만을 뽑아 옵저버 패턴을 구현해보고자 한다. 옵저버 패턴 직접 구현 해보기 1. Kotlin 변수의 변화를 인식하기 위한 interface 선언 Kotlin 변수의 변화를 인식하기 위해서는 operator fun getValue(thisRef: T?, property: KProperty): T, operator fun setValue(thisRef: T?, property: KProperty, newValue: T) 을 위임을 통해 다시 구현해야 한다. interface PropertyChangeListener { fun onPropertyChanged(oldValue: ..

    [Kotlin] 옵저버 패턴 내부 구현 살펴보기 : Delegates.observable은 어떻게 동작하는가?

    개요 앞선 글에서 옵저버 패턴이 무엇인지, 옵저버 패턴을 어떻게 사용하는지 살펴봤다. 단순히 라이브러리의 구현체를 가져다 쓰는 것도 좋지만, 구현체가 어떻게 이루어져 있는지 살펴보아야 더욱 깊게 이해할 수 있다. 따라서 이번 글에서는 옵저버 패턴이 어떻게 구현되어 있는지 내부를 직접 살펴보고 구현해보고자 한다. 이번 글에서는 Kotlin에서 기본으로 제공되는 메서드를 살펴보고, 비슷한 메서드를 만들어보도록 하자. Delegates.observable을 활용한 Observer Pattern 적용 Kotlin에서는 Delegates Object에서 제공되는 observable 함수를 통해 옵저버 패턴을 만들어낼 수 있다. String 타입의 data 변수를 선언한 후 변수의 구현을 Delegates.obse..

    [Kotlin] Observer Pattern : 옵저버 패턴 알아보기

    리액티브 프로그래밍과 옵저버 패턴 리액티브 프로그래밍 패러다임은 최근 프로그래밍 패러다임 중 가장 중요한 패러다임 중 하나이다. 리액티브 프로그래밍 패러다임이 유행하기 이전에는 명령형 프로그래밍 패러다임이 유행했다. 명령형 프로그래밍 패러다임 하에서는 데이터가 변할 때 데이터가 변화에 따라 데이터가 변해야 하는 부분에 모두 적용을 시켜줘야 했다. 리액티브 프로그래밍 패러다임은 데이터가 변하는 것을 관찰해서 데이터가 변할 때 동작을 변하도록 만드는 것을 기본으로 한다. 즉, 데이터에 반응(Reactive)하도록 코드를 만드는 것이다. 이렇게 하면 데이터가 변화할 때 변화가 필요한 부분에 변화를 관찰하도록 코드를 넣어주면 데이터가 변화했을 때 데이터 변화에 대한 변경 사항이 즉시 게시된다. 옵저버 패턴은 리..

    [Kotlin] if, require 메서드를 활용해 메서드 실행 제한하기

    블록이 실행되지 말아야 할 때의 Best Practice Kotlin에서는 if-else 문으로 코드 블록을 실행할지 결정한다. 하지만 if-else 문을 중첩해서 쓰면 블록이 계속 블록이 중첩되기 때문에 가독성이 떨어진다. 특히 오랫동안 유지보수된 레거시 코드들을 보면 이러한 상황이 매우 잘 나타난다. 보통 이러한 코드들은 null이 아님을 확인하기 위해 1번 if 문을 쓰는 것을 기본으로 한다. 예를 들어 다음 코드와 같이 사용된다. fun blockExecuteExample(apple : Apple?) { if (apple != null) { if(apple is Fruit) { eat() } } } 여기서 끝나면 괜찮겠지만 보통 이런 코드들은 if문을 여러 번 중첩한다. if 문을 여러 번 중첩하..