본문 바로가기

Develop/Design25

리팩토링으로 클래스 응집도 높이기 객체지향 코드를 짜기 위해 노력해 본 사람이라면, 좋은 객체지향적 코드를 짜기 위해서는 결합도는 낮추고 응집도를 높이라는 말을 들어보셨을 것이다. 혹시 결합도, 응집도가 무엇인지 잘 모르는 사람은 아래의 링크를 통해 공부하고 오자. https://devkingdom.tistory.com/300 결합도와 응집도 이야기 OOP를 다루는 개발자라면 혹은 컴퓨터 공학을 전공하는 사람이라면 누구나 이런 얘기를 들어본 적이 있을 것이다. "결합도는 낮추고, 응집도는 높여야 유지보수하기 쉬운 좋은 프로그램이 된다" devkingdom.tistory.com 클래스가 아래와 같은 이유로 분리의 필요성을 느낀다면 이는 클래스가 응집도가 낮은 것이니 클래스를 분리해야한다. 1. 변경의 이유를 기준으로 클래스를 분리 클래스가.. 2023. 8. 23.
[Design Pattern] Singleton Pattern 우리는 객체를 하나만 사용하기 위해 Singleton 패턴을 많이 활용한다. Singleton 을 구현하기 위해 몇가지 방법이 있는데 간단하게 말씀드려보겠다. public static member 해당 방법은 인스턴스를 초기화 시킨 뒤 고정시켜 사용하는 방법이다. 사용자는 변수에 직접 접근하여 사용하여야 한다. 이렇게 사용하면 의도하지 않은 객체 생성을 막을 수 있다. public class Member { public static final Member INSTANCE = new Member(); private Member() { } } private static final field 해당 방법은 getInstance라는 메서드를 통해 instance에 접근하는 방법이다. 인스턴스 변수에 직접 접근하는.. 2023. 1. 28.
추상적인 책임 vs 상세한 책임 앞선 글들에서 객체지향 설계의 품질은 책임을 어떻게 설정하는가에 달려있다고 했다. 객체지향 설계를 하다보면 책임의 레벨을 어떻게 설정해야할지 고민할 때가 올 것이다. 오늘은 어떤 수준의 책임을 만들어내는 것이 적합한지에 대해 이야기 해보고자 한다. 1번 상황 위의 상황을 보자. 이와 같은 경우는 책임에 대한 자율성이 높지만 너무 추상적인 책임이다. 이러한 경우에는 자율성이 높은 만큼 잘못된 의도대로 책임이 수행되지 않을 수 있다. 2번 상황 위와 같은 경우는 1번과는 다르게 아주 상세한 수준으로 구현이 되었다. 이렇게 하면 정확하게 의도한대로 책임을 수행하긴 하지만 책임에 대한 자율성이 제한된다. 마치 신입직원(?)처럼 팀장에게 의존할 수 밖에 없는 형태이다. 3번 상황 1번 상황에서의 일하라라는 책임은.. 2022. 10. 25.
[Design Pattern] Composite 패턴 정리 Composite pattern 오늘은 Composite Pattern 에 대해 정리를 해 두고자한다. 해당 패턴은 전체와 부분을 하나의 단위로 추상화해야할 경우 사용된다. 클라이언트 입장에서 메시지 수신자가 부분인지 전체인지에 상관없이 동일한 메시지를 통해 동일한 방식으로 대상과 상호작용해야할 경우 사용하는 패턴이다. 아래는 Composite Pattern 을 다이어그램으로 그린 형태이다. Composite pattern에서 협력에 참여하는 역할과 책임을하는 구성요소를 살펴보자. Component 는 클라이언트와 협력할 수 있는 공용인터페이스를 정의하는 역할을 수행한다. 예시로 든 다이어그램에서는 추가, 제거, 포함된 하위 컴포넌트 반환 등의 역할을 수행한다. Leaf 는 공용 인터페이스에 대한 오퍼레.. 2022. 10. 11.
협력, 역할, 책임의 관점에서 바라본 객체지향 세계 객체지향 개발을 하는 사람이라면 누구나 이해해야할 개념이 있다. 바로 협력,역할,책임이다. 오늘은 협력, 역할, 책임의 관점에서 객체지향을 어떻게 잘 설계할 수 있을지를 글로 작성해보려 한다. 협력 개체지향 세계는 동일한 목적을 달성하기 위해 객체끼리 서로 협력하는 세상이다. 여기서 나오는 협력이라는 단어는 객체지향 설계를 논할때 가장 중요한 요소 중 하나이다. 협력은 여러가지의 요청과 응답에 의해 이루어진다. 여기서 각 요청과 응답은 서로 연결된 채 유지된다. 즉 , 서로 관계를 맺는다는 얘기다. 요청과 응답은 서로 관계를 맺으며 객체가 수행할 책임을 명확하게 만든다. 어떤 대상에 대해 어떠한 요청을 한다면 요청을 받은 대상은 해당 요청을 처리할 책임이 주어진다. 이렇게 객체가 다른 객체에게 책임을 수.. 2022. 10. 10.
[Design Pattern] 빌더 패턴 정리 빌더패턴은 디자인 패턴 중 생성 패턴 중 하나이다. 빌더는 복잡한 Object들을 단계별로 구축할 수 있게 해준다. 이 패턴을 활용하면 동일한 구성코드를 통해 다양한 타입과 표현을 제공받을 수 있다. 쉽게말해서 이 패턴을 이용해 우리는 객체를 편리하게 만들어 낼 수 있다. 기존에 우리는 빌더 패턴없이 setter 메서드를 활용하거나 생성자를 이용해 객체를 생성해왔다. 아래는 setter 를 이용한 객체생성의 예시이다. setter public class Person { private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age =.. 2022. 9. 27.
객체 바로알기 - 협력, 행동, 상태, 식별자 객체지향 세계는 실세계와 유사하다. 허나 면밀히 살펴보면 기이한 세상이다. 객체지향 세계에서 객체는 단순히 실세계를 모방하고 추상화한 존재가 아니다. 하나하나가 생명이 부여되어 살아 숨시고 있다. 모든 사물이 영화 아이언 맨의 '자비스'처럼 스스로 생각하고 해동한다. 객체지향 세계에서 객체는 실세계의 객체보다 훨씬더 많은 능력과 특성을 보유하고 있다. 오늘은 이 객체에 대해 면밀히 살펴보도록 하겠다. 객체지향 세계에서 객체는 식별이 가능한 개체나 사물을 뜻한다. 객체는 컴퓨터, 키보드같은 사물이 될 수도 있고 사랑, 우정 같은 추상적인 개념이 될 수도 있다. 객체는 구별가능한 식별자, 객체만의 특징을 가진 행동, 행동에 따라 변경되는 상태로 구성된다. 객체를 행동, 상태 그리고 식별자의 관점에서 살펴보자.. 2022. 9. 14.
객체지향 설계 - 책임, 역할, 협력 개발 관련 일을 한지 5년정도 되다보니, 이제는 구현뿐만 아니라 설계적인 능력도 중요하게 되었다. 요즘 하나의 기능을 추가해도 깔끔하게 설계를 한 뒤에 프로그래밍하는 것이 습관이 되었다. 오늘은 객체지향 설계의 가장 중요한 요소인 책임, 역할, 협력의 관점에서 어떻게 설계를 해야할 지를 풀어나가 볼 예정이다. 대학생 때, 교수님 한분이 그런 말씀을 하셨다. "객체지향은 실세계를 모방하여 구현하는 것이 아니라 새로운 세계를 창조하는 것이다." 예전에 이말이 참 이해가 안되었는데, 실무를 경험하다 보니 조금은 이해가 된다. 객체지향은 말그대로 실세계를 조금 참고하여, 새로운 세계를 만들어내는 것이다. 우리는 실세계의 다양한 부분을 통해 객체지향의 기본 사상을 이해하고 학습한다. 객체지향 세계에서 모든 일은 .. 2022. 9. 6.
객체지향 설계를 위한 추상화 메커니즘 정리 하이! 오늘은 객체지향의 개념중 가장 중요하다 할 수 있는 추상화에 대해 총정리 해두려고 한다. java나 c#등 객체를 이용한 , 객체를 지향하는 다양한 언어가 있다. 객체지향으로 짜여진 프로그램에서는 무수히 많은 객체가 서로 메시지를 주고 받으며 협력한다. 너무나 많은 객체가 있다보니 이를 효율적이고 단순하게 관리할 필요가 있다. 객체지향에서는 대표적으로 추상화라는 방식을 통해 복잡한 도메인을 단순화 시키고 직관적으로 만든다. 추상화란 현실을 어느정도 반영하되, 구체적인 사물간의 공통점은 취하고 차이점은 버리는 분류를 통해, 그리고 중요한 부분을 강조하기 위해 불필요한 세부사항은 버리는 일반화를 통해 이루어진다. 아래는 객체지향에서 활용하는 추상화 메커니즘을 정리해 놓은것이다. -분류와 인스턴스화 -.. 2022. 9. 2.