Computer Science 29

디자인 패턴 - 전략 패턴(Strategy pattern)과 디자인 패턴에 대한 고찰_feat(우테코 - 자동차 경주)

우테코 1단계 level 1 의 자동차 경주 미션 리팩토링을 진행하고, 미션 리뷰어에게 전략 패턴에 대한 이야기를 들었다. 나는 사실 전략 패턴에 대해 잘 알지 못했다. 그런데 전략 패턴을 이미 구현했다는 피드백을 보고 신기함을 느꼈다. 어떻게 제대로 모르는 것을 구현할 수 있지? 이 궁금증을 시작으로 전략 패턴을 더 자세히 공부하기로 했다. 전략 패턴(Strategy Pattern)? '알렉산더 슈베츠' 저자의 '디자인 패턴에 뛰어들기' 라는 책에서는 이렇게 설명하고 있다. (이 글은 위 링크 글을 보고 공부하여 정리한 내용으로 원문을 참조하시는 것을 추천한다.) 전략 패턴은 알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스에 넣은 후 그들의 객체들을 상호교환할 수 있도록 하는 행동 디자인 패..

코드의 네이밍과 코딩 컨벤션은 왜 중요한가?

우테코 수업을 듣다가 코드에서 효과적인 네이밍이 왜 중요한가? 라는 질문을 들었다. 효과적인 네이밍은 왜 중요한가? 모두들 흔히 좋은 네이밍으로써 코드의 가독성과 이해도를 향상시키고 유지보수성을 높이는데 도움이 된다고 말한다. 하지만 이것에 대해 다시 왜? 냐고 물으면 쉽게 입이 떼어지지 않았다. 좋은 네이밍이 중요한 이유 Eddy 님의 글에서는 아래처럼 말한다. 프로그래밍은 문제 해결이 전부가 아니다. 프로그래밍은 다른 사람과의 커뮤니케이션이고 협업이다. 내가 만든 코드를 읽는 것은 컴퓨터 뿐만이 아니라 '다른 프로그래머들'이, 그들과 다를 바 없는 '미래의 나' 이다. 그래서 코드는 그 사람들에게 이 프로그램이 어떤 동작을 하는지(어떤 책임을 갖는지)를 명료하게 전달해야 한다. 또 우테코 코치 제이슨..

MVC 패턴을 다시 공부해보자

우아한 테크 코스의 프리코스에서 숫자 야구 게임 구현 단계를 진행하고 있었습니다. 이 때 따로 GUI 는 없고 콘솔을 통해서 입력과 출력을 받고 있었습니다. 저는 먼저 한 클래스에 모든 구현을 때려 넣은 후에 리팩토링하면서 각 객체에게 역할과 책임을 분리했습니다. 그런데 프리코스 커뮤니티에서 MVC 패턴에 대한 이야기가 나오더라구요..? 저는 안드로이드 프로젝트만 해왔기 때문에 당연히 따로 View 가 있는 패턴(MVC 나 MVVM 과 같이)을 사용할 생각을 못했었는데 말이죠. 그래서 MVC 패턴을 적용해서 구현한 코드를 리팩토링하려고 했습니다. 그런데 갑자기 조금씩 헷갈리더라군요.. 그래서 MVC 패턴을 어떤 프레임워크에 국한되지 않도록, 조금만 더 자세히 알아보려고 합니다. 참고로 이전에 MVC, M..

디자인 패턴 - 동적 프록시(Dynamic Proxy). 동적 프록시 직접 구현해보고 Retrofit 의 create 다시 보기

이전 '디자인 패턴 프록시 패턴 글' 에서 Proxy pattern(프록시 패턴)에 대해 알아 보았습니다. 그리고 'Retrofit 알아보기 (2) - create 뜯어보기' 에서도 프록시 패턴을 사용하는 부분이 나왔었죠. https://sh1mj1-log.tistory.com/169 디자인 패턴 - 프록시 패턴(Proxy pattern) 자바 코드 예시로 보기 먼저 프록시(proxy)의 뜻을 살펴봅시다. 위처럼 proxy 는 대리, 대리인, 대용물 이라는 뜻을 가집니다. 그렇다면 프록시 패턴이라 하면, 누군가가 어떠한 일(역할)을 대신 해주는 모습의 디자인 패턴 sh1mj1-log.tistory.com https://sh1mj1-log.tistory.com/168 안드로이드 통신에 자주 사용하는 Ret..

디자인 패턴 - 프록시 패턴(Proxy pattern) 자바 코드 예시로 보기

먼저 프록시(proxy)의 뜻을 살펴봅시다. 위처럼 proxy 는 대리, 대리인, 대용물 이라는 뜻을 가집니다. 그렇다면 프록시 패턴이라 하면, 누군가가 어떠한 일(역할)을 대신 해주는 모습의 디자인 패턴임을 예상할 수 있겠네요. Proxy pattern(프록시 패턴) 프록시 패턴은 클라이언트가 실제 서비스 객체를 대신하는 객체를 제공해주는 구조 디자인 패턴입니다. 클라이언트의 요청을 수신하고 일부 작업들을 수행한 다음 요청을 서비스 객체에 전달하는 형태이지요. 여기서 일부 작업들에는 흔히 접근 제어, 캐싱 등이 있습니다. 프록시 객체는 서비스 객체와 같은 인터페이스를 가지기 때문에 클라이언트에 전달되면 실제 객체와 상호적으로 교환이 가능합니다. 우리가 코드를 변경할 수 없는 클래스에 몇가지의 행동들을 ..

디자인 패턴 - 데코레이터 패턴(Decorator pattern) 자바 코드 예시로 보기

데코레이터 패턴이란? 데코레이터 패턴은 객체지향 프로그래밍에서 자주 사용되는 디자인 패턴입니다. 어떤 객체를 특수한 Wrapper 객체들 내에 감싸서(wrap, decorate) 새로운 행동을 가지도록 하는 것입니다. 이렇게만 설명하면 크게 감이 안 올 수 있는데요. 먼저 구체적인 프로그램을 만든다고 가정해서 이 프로그램에 데코레이터 패턴을 적용해 나가는 것으로 설명하겠습니다. 문제 상황 우리는 사용자들에게 알림을 보내는 `Notifier` 라이브러리를 만들고 있다고 합시다. `Notifier` 는 사용자들에게 중요한 이벤트에 대해 이메일로 알림을 보내줄 수 있는 기능을 가집니다. 클라이언트 역할을 하는 타사 이메일 애플리케이션은 `Notifier` 객체를 한 번 생성하고, 설정한 후에 중요한 이벤트가 ..

서브클래싱과 서브타이핑 - 코드로 이해하는 객체지향

상속은 크게 두 가지로 목적으로 사용됩니다. 상속은 타입 계층을 구현하기 위해 사용됩니다. 부모 클래스는 계층 안에서 일반적인 개념을 구현하고 자식클래스는 특수한 개념을 구현합니다. 상속은 코드 재사용을 위해 사용됩니다. 간단한 선언으로 부모 클래스의 코드를 재사용할 수 있습니다. 하지만 재사용을 위해 상속으 사용하면 부모 클래스와 자식 클래스가 강하게 결합되기 때문에 변경하기 어려운 코드를 얻게 될 확률이 높습니다. 그러므로 상속의 사용의 일차적인 목표는 타입 계층을 구현하기 위함이어야 합니다. 코드 재사용을 목표로 상속을 사용하면 부모, 자식 클래스가 강하게 결합되어 설계의 변경을 방해합니다. 하지만 타입 계층을 목표로 상속을 사용하면 다형적으로 동작하는 객체들의 관계에 기반하여 확장 가능하고 유연한..

다형성 - 코드로 이해하는 객체지향

상속은 클라이언트 관점에서 인스턴스들을 동일하게 행동하는 그룹으로 믂고 싶을 때 사용해야 합니다. 단지 단순히 코드를 재사용하기 위함이 목적이면 안 됩니다! 다형성은 런타임에 메시지를 처리하기에 적합한 메서드를 동적으로 찾는 과정을 통해서 구현됩니다. 또 상속은 이런 메서드를 찾기 위한 탐색 경로를 클래스 계층의 형태로 구현하기 위한 방법입니다. 상속의 관점에서 다형성이 구현되는 기술적인 매커니즘을 먼저 살펴봅시다. 다형성 다형성(Polymorphism)은 여러 타입을 대상으로 동작할 수 있는 코드를 작성할 수 있는 방법입니다. 객체지향 프로그래밍에서 다형성은 아래처럼 분류될 수 있습니다. 오버로딩 다형성: 하나의 클래스 안에 동일한 메서드 존재하는 경우입니다. 흔히 말하는 메서드 오버로딩이 이 경우이죠..

합성과 유연한 설계 - 코드로 이해하는 객체지향

상속은 부모 클래스와 자식 클래스를 연결해서 부모 클래스의 코드를 재사용하고 합성은 전체를 표현하는 객체가 부분을 표현하는 객체를 포함해서 부분 객체의 코드를 재사용합니다. 상속 관계는 is-a 관계입니다. 자식 클래스가 Cat, 부모 클래스가 Animal 이면 Cat is a Animal 인 것이죠. 합성은 has-a 관계입니다. Cat has a Claw(발톱). 형식이지요. 이 둘은 코드 재사용이라는 동일한 목적을 가지지만, 이것을 제외하면 구현 방법, 변경을 다루는 방식이 다릅니다. 상속은 부모 클래스의 코드를 자식 클래스가 자신의 것처럼 사용하고, override 할 수 있게 합니다. 하지만 부모 클래스의 내부 구현, 의도를 자세히 알고 이해해야 상속을 제대로 사용할 수 있기 때문에 자식 클래스..

상속과 코드 재사용. 상속을 사용할 때 조심해야 할 점을 중심으로 - 코드로 이해하는 객체지향

재사용 관점에서 상속 은 클래스 안에 정의된 인스턴스 변수와 메서드를 자동으로 새로운 클래스에 추가하는 구현 기법입니다. 코드 재사용의 다른 방법으로는 합성이 있습니다. 새로운 클래스의 인스턴스 안에 기존 클래스의 인스턴스를 포함시키는 방법입니다. 합성은 다음 글에서 알아보고 이번에는 상속에 대해 자세히 알아봅니다. 상속과 중복 코드 DRY 원칙 중복 코드는 변경을 방해합니다. 중복 코드는 코드를 수정하는데 드는 비용을 더 증가시킵니다. 테스트를 할 때도 그렇죠. 중복 여부를 판단하는 기준은 모양이 아니라 변경입니다. 요구사항이 변경되었을 때 두 코드를 함께 수정해야 한다면 이 코드는 중복인 것입니다. 중복 여부를 결정하는 기준은 코드가 변경에 반응하는 방식입니다. 코드의 모양이 유사하다는 것은 단지 중..