분류 전체보기 154

안드로이드 레트로핏 api 호출하는 인터페이스에서 @Header 중복을 제거하기

지난 4개월 전쯤 친구를 통해서 여러 다른 분들과 플레이스토어에 바바-BABA 라는 앱을 출시했습니다. 작성했던 코드들을 천천히 보면서 리팩토링 및 버그 픽스를 하며 공부를 더 해보려고 합니다. 일단 오늘 볼 부분은 서버와 api 통신을 하는 부분인데요. 이 프로젝트에서는 Retrofit 을 사용했고, Di 는 Hilt 를 사용하였습니다. 서버와 api 통신을 하는 전체 구조 먼저 간단한 UML 을 통해 기존에 어떻게 서버 통신을 진행하고 있는지를 간단히 표현하자면 아래와 같습니다. 클라이언트에서 AlbumApi 를 호출할 때 Retrofit 객체를 만들어 주고, 또 OkHttpClient 객체를 만들어 주는 부분은 Hilt 로 구현되어 있습니다. 화살표가 UML 의 표준으로 그린 것도 아니고 실제로 H..

디자인 패턴 - 데코레이터 패턴(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 원칙 중복 코드는 변경을 방해합니다. 중복 코드는 코드를 수정하는데 드는 비용을 더 증가시킵니다. 테스트를 할 때도 그렇죠. 중복 여부를 판단하는 기준은 모양이 아니라 변경입니다. 요구사항이 변경되었을 때 두 코드를 함께 수정해야 한다면 이 코드는 중복인 것입니다. 중복 여부를 결정하는 기준은 코드가 변경에 반응하는 방식입니다. 코드의 모양이 유사하다는 것은 단지 중..

[JAVA] 이진 트리 백준 BOJ 1991 전위 순회, 중위 순회, 후위 순회

이진 트리(binary tree) 는 각 노드의 자식 노드(차수)의 개수가 2 이하로 구성되어 있는 트리입니다. 트리 영역에서 가장 많이 사용됩니다. 이진 트리 핵심 이진 트리 종류 이진 트리는 크게 아래 세 개로 나뉩니다. 그림만으로도 각각의 특징을 대충 느낌을 잡을 수 있을 텐데요. 편향 이진 트리(Skewed Binary Tree) 같은 높이의 이진 트리 중에서 최소 개수의 노드 개수를 가짐. 왼쪽 혹은 오른쪽 서브트리만을 가지는 이진트리. 포화 이진 트리(Full Binary Tree) 모든 레벨의 노드가 꽉 차있는 이진 트리. N = 2ᴴ - 1 을 만족한다. (N: 노드의 개수, H: 트리의 높이) 완전 이진 트리(Complete Binary Tree) 트리의 높이가 H 일 때 레벨 1 부터 ..

[JAVA] 트리 자바 백준 BOJ 11725, 1068

트리(Tree) 는 노드와 에지로 연결된 그래프의 특수한 형태입니다. 순한 구조(cycle) 이 없고, 1개의 루트 노드가 존재. 루트 노드를 제외한 노드는 단, 1개의 부모 노드를 가짐. 트리의 부분 트리(subtree) 역시 트리의 모든 특징을 따름. 리프노드는 트리에서 가장 하위에 존재하는 노드(자식 노드가 없는 노드) 입니다. 백준 11725 트리의 부모 찾기 https://www.acmicpc.net/problem/11725 11725번: 트리의 부모 찾기 루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오. www.acmicpc.net 1. 문제 분석 주어지는 데이터가 단순히 연결되어 있는 두 노드를 알려 주는 것이므로 데이터 ..

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

이전 글에서의 다양한 의존성 관리 기법을 원칙 이라는 관점에서 정리해봅시다. https://sh1mj1-log.tistory.com/154 의존성 관리 - 코드로 이해하는 객체지향 잘 설계된 객체지향 App. 은 작고 응집도 높은 객체들로 구성됩니다. 책임이 명확하고 한 가지 일을 잘하는 객체이지요. 이 객체들이 협력을 하는 것입니다. 협력은 하면 필연적으로 의존성이 발 sh1mj1-log.tistory.com 개방-폐쇄 원칙 개방-폐쇄 원칙(Open-Closed Principle, OCP): 소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다. 여기서 확장 은 애플리케이션(이하 앱)의 동작의 관점, 수정 은 코드의 관점 을 반영합니다. 확장에 ..

[JAVA] 최소 신장 트리 알고리즘 자바 백준 BOJ 1197, 17472, 1414

최소신장 트리 최소 신장 트리(Maximum Spanning Tree, MST)란 그래프에서 모든 노드를 연결할 때 사용된 에지들의 가중치의 합을 최소로 하는 트리입니다. 아래 특징을 가집니다. 사이클이 포함되면 가중치의 합이 최소가 될 수 없으므로 사이클을 포함하지 않음. N 개의 노드가 있으면 최소 신장 트리를 구성하는 에지의 개수는 항상 N-1 개임. 최소 신장 트리 핵심 이론 1. 그래프 구현(에지 리스트), 유니온 파인드 배열 초기화 최소 신장 트리는 데이터를 노드가 아니라 에지를 중심으로 저장합니다. 그래서 벨만-포드 알고리즘에서처럼 에지 리스트의 형태로 저장해야 합니다. Edge 클래스는 일반적으로 노드 변수 2개, 가중치 변수 1개로 구성됩니다. 사이클 처리를 위한 유니온 파인드 배열도 초..