한빛 미디어의 2005년작 Head First Desing Patterns를 보고 OOP 디자인 패턴을 공부하면서 코드와 글을 정리하는 시리즈이다.
SOLID라고 한다 SRP라고 부른다. 하나의 클래스는 하나의 책임만 가져야한다는 것이다. 물론 이 하나의 책임이라는것은 모호하다. 이를 결정하는것은 변경이다. 변경이 있을 때 그 변경이 다른 코드들에 미치는 영향이 적어야한다. 확장에는 열려있으나, 변경에는 닫혀있어야
알고리즘군을 정의하고 각각을 캡슐화하여 교환, 사용할 수 있게 만들어준다. 클라이언트와는 독립적으로 알고리즘 변경이 가능하다.쉽게 말해서 클라이언트는 그냥 가져다 쓰기만하고 개발자들이 알아서 캡슐화시켜놓고 그걸 바꿔끼면 된다는 뜻이다.말이 어려우니 예제로 보자.오리라는
신문사가 신문을 찍어낸다구독자가 구독 신청을 하면 계속 신문을 공급한다. 구독자는 신문이 새로워 지거나 말거나 아무튼 계속 받는다.구독해지를 하면 더 이상 받지 않는다.비슷한 원리로 작동하는게 옵저버패턴이다. Subject 객체에서 데이터를 관리하고, observer
OCP는 가장 중요한 원칙가운데 하나이다. 다른글에서도 설명했지만 확장에는 open이지만, 변경에는 closed라는 뜻이다.즉, 클래스를 확장하는것은 가능하지만, 코드를 고치는건 안된다는 뜻이다. 뭔가 모순되는 말 같지만, 옵저버 패턴에서도 본 것 처럼, 기존의 인터페
Temp Body
객체 의존성과 객체 뒤집기 의존적인 객체들은 OCP원칙을 위배한다. 한쪽이 변하면 다른 한쪽도 변해야하고 이는 코드변경 수요가 너무 많아지기 때문이다. 따라서 수정이 일어나기 쉬운 부분과 아닌 부분을 분리해서 작성하는것이 중요하다. 그래서 이전글에서 정리한것처럼 변
싱글톤 패턴은 하나의 객체만 만들어서 이를 공유해서 쓰게 만드는 패턴이다. 객체를 계속 생성하는것은 불필요한 부담이 되기도하고, 하나만 관리하는것이 유리하기 때문이다.고전적인 싱글톤에서는, private 생성자를 만들고, public static get_instance
실행될 기능을 캡슐화 해서 재사용성을 높이는 패턴이다. 커맨드패턴을 이용하면 요구사항대로 객체를 캡슐화 할 수 있으며, 매게변수를 써서 여러가지 다른 요구사항을 집어넣을 수 있다. 커맨드패턴은 명령을 주는 클라이언트이를 받는 커맨드이를 세팅하는 인보커최종적으로 메소드를
한 클래스의 인터페이스를 다른 클래스에서 사용하고자 할 때, 어댑터를 통해서 호환성 문제를 해결한다. 예전에 만든 오리 인터페이스와 객체가 있다. 그 오리 인터페이스에 칠면조를 넣으려면 어댑터라는 특수한 객체를 통해 넣어줘야한다. 코드를 살펴보자이 때, 칠면조를 오리에
이러한 두 클래스가 있다고 하자. 이 때 자세히 보면 이들이 일정기능을 공유하고 있음을 알 수있다. 따라서 이를 추상클래스화 하여 통합할 수 있다. 이와 같은 패턴을 기본 템플릿 메서드 라고 한다템플릿 메소드 패턴에서는 메소드에서 알고리즘의 골격을 정의한다. 알고리즘의
이러한 클래스에 의거, 메뉴를 만든 식당이 두개 있다고 하자.팬케이크 식당은 ArrayList를 사용했고, Diner식당은 array를 사용했다. 이 두 식당을 합병하려면 어떻게 해야할까?굳이 방법을 찾자면 waitress 클래스에서 새로운 리스트를 만들고 양쪽의 내용
printMenu줄이기 보면 알겠지만, waitress에서 printMenu가 좀 여러번 반복되는 것을 볼 수 있고, 하나 추가될 때 마다 또 추가를 해야한다. 따라서 이는 OCP 원칙 위배라고 볼 수 있다. 이를 어떻게 줄일 수 있을까? 컴포지트 패턴 컴포지트
이런 구조를 가진 뽑기기계가 있다고 하자. 지금 이 코드는, 하나의 클래스에서 구현부터 처리까지 전부하고있는 구조이다. 이러한 뽑기 기계를 운영하던중 10개중 한번꼴로 하나가 더 나오는 코드를 추가해달라는 요청이 들어왔다.지금 이 코드는, 변경되는 부분을 캡슐화 하라는
프록시란 서버쪽에서도 종종 사용하지만 대리자, 대변인이란 뜻으로 어떤 일을 대신 해주는것을 의미한다. 구체적으로 프록시 패턴은 인터페이스를 사용하면서 기능을 정의하는 구상객체 대신 투입해서 대리자 객체를 통해 메서드를 호출하고 반환 값을 받는지 전혀 모르게 처리하는 것