일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- array
- 자바 스레드 실행 순서 제어
- input
- Easy
- 수학
- hash table
- R
- 자바입력
- Kadane's Algorithm
- SpringBoot 2
- 카데인 알고리즘
- scanner
- JAVA11
- 사칙연산
- heroku
- 자바 thread 실행 순서 제어
- Today
- Total
목록Design Pattern (42)
DeFacto-Standard IT
1. 가정 - 책을 등록하고, 등록한 책의 내용을 모두 출력하는 프로그램을 작성한다. - 책은 4개 존재한다. 2. Naive Code - Bookpublic class Book { private String name; public Book(String name){ this.name = name; } public String getName() { return this.name; } } 책에 대한 클래스이다. - NaiveBookShelf1public class NaiveBookShelf1 { private Book[] books; private int last = 0; public NaiveBookShelf1(int maxsize){ this.books = new Book[maxsize]; } publi..
1. 가정 - A4전용 복사기를 만든다. - 복사기는 내용이 적인 A4종이를 복사하여, 똑같은 내용이 출력된 A4용지를 만들어낸다. 2. Naive Code - Paperpublic class Paper { private String content; public Paper(String content) { this.content = content; } public String getContent() { return content; } public void show() { System.out.println(content); } }Paper 클래스이다. 종이 생성 시 Content를 저장하고, show()를 통해 종이에 적힌 내용을 출력한다. - PhotoCopierpublic class PhotoCopier..
1. 연관 관계 (Association) 클래스들이 개념상 서로 연결. 한 클래스가 다른 클래스에서 제공하는 기능을 사용 1-1) 단방향 연관 관계 (Uni-Directional Relationship) - UML : 화살표 + 실선 - 소스코드public class Person { private Car car; public void doIt() { car.doIt(); } } public class Car { public void doIt() { // ... } } 1-2) 양방향 연관 관계 (Bi-Directional Relationship) - UML : 실선 - 소스코드public class Member { private Team team; } public class Team { private A..
S - Single Responsibility Princile, SRP, 단일 책임 원칙 하나의 클래스(객체)는 하나의 역할만 책임진다.(클래스를 변경하는 이유는 단 한 개여야 한다) 응집도는 높게, 결합도는 낮게 설계 DB의 정규화 과정을 거치는 것도 SRP를 적용하는 것과 마찬가지 지켜지지 않으면 이 클래스가 무슨 클래스인지도 모르며, 다른 클래스에서 했어야할 책임인데 여기서 수행하므로 전혀 상관없는 클래스를 고치게 되는 꼴이 되어버린다. 소스가 엉망이 된다는 소리. https://defacto-standard.tistory.com/110 O – Open Closed Principle, OCP, 개방 폐쇄 원칙 기능을 확장하는 것에는 열려있지만(다형성), 주변의 변화(코드 수정)에 대해서는 닫혀있다...
인터페이스를 사용하는 경우 - 관련되지 않은 클래스에 일반적인 기능을 제공하는데 적합 - 만들고 있는 기능이 광범위한 분산 개체에서 유용하게 사용될 것으로 예상되는 경우 - 작고 간결한 기능을 디자인 하는 경우 추상클래스를 사용하는 경우 - 밀접하게 관련된 개체에 사용 - 여러 버전의 구성요소를 만들 것으로 예상되는 경우 간단하고 쉽게 구성요소의 버전을 작성할 수 있다. 기본 클래스를 업데이트하면 모든 상속 클래스의 변경 내용이 자동으로 업데이트. (인터페이스의 경우 한번 만들면 변경 불가. 새 버전의 인터페이스가 필요하면 완전히 새롭게 인터페이스를 만들어야 한다.) - 큰 기능 단위들을 디자인하는 경우 - 모든 구성 요소의 구현 사이의 일반적인 구현된 기능을 제공하는 경우. 추상 클래스를 사용하면 부분..
에리히 감마 Erich Gamma 리차드 헬름 Richard Helm 랄프 존슨 Ralph Johnson 존 블리시디스 John Vlissides 생성 패턴 구조 패턴 행위 패턴 추상 팩토리 (Abstract Factory) 어댑터 (Adapter) 책임 연쇄 (Chain of Responsibility) 빌더 (Builder) 브리지 (Bridge) 커맨드 (Command) 팩토리 메서드 (Factory Method) 컴퍼지트 (Composite) 인터프리터 (Interpreter) 프로토타입 (Prototype) 데커레이터 (Decorator) 아이터레이터 (Iterator) 싱글턴 (Singleton) 퍼사드 (Facade) 미디에이터 (Mediator) 플라이웨이트 (Flyweight) 메멘토 (..
인터페이스 분리 원칙 (ISP, Interface Segregation Principle) 프로그래밍 능력에 변화가 생기더라도 외국어 능력이나 발표 능력을 사용하는 영업 업무에는 영향을 미치지 않을 확률이 높지만 개발 업무 부서에는 영향을 미칠 수 있다. ISP는 위의 관점(클라이언트의 관점에서 바라는)에서 생긴 객체지향 설계 원칙에는 클라이언트 자신이 이용하지 않는 기능에는 영향을 받지 않아야 한다는 내용이 담겨있다. 복합기 기능을 제공하는 클래스는 매우 비대해질 가능성이 크다. 하지만 이 비대한 클래스의 모든 기능을 클라이언트가 동시에 사용하는 경우는 거의 없다. 클라이언트의 필요에 따라 프린터, 팩스, 복사기 중 하나의 기능만 이용할 수 있다. 따라서 프린터 기능만 이용하는 클라이언트가 팩스 기능의..
의존 역전 원칙 (DIP, Dependency Inversion Principle) 객체 사이에 서로 도움을 주고받으면 의존 관계가 발생한다. 의존 역전 원칙은 그러한 의존 관계를 맺을 때의 가이드라인에 해당. *DIP는 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것 보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 원칙. 변하기 쉬운 것과 변하기 어려운 것은 어떻게 구분하는가. 정책, 전략과 같은 어떤 큰 흐름이나 개념 같은 추상적인 것은 변하기 어려운 것에 해당하고 구체적인 방식, 사물 등과 같은 것은 변하기 쉬운 것으로 구분하면 좋다. 아이가 장난감을 가지고 노는데 어떤 경우에는 로봇을, 어떤 경우에는 자동차를 가지고 놀 것이다. 이때 구체적인 장난감은 변하기 쉬운 것이..
리스코프 치환 원칙 (LSP, Liskov Substitution Principle) 일반화 관계에 대한 이야기며 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 한다. LSP를 만족하면 프로그램에서 부모 클래스의 인스턴스 대신에 자식 클래스의 인스턴스로 대체해도 프로그램의 의미는 변화되지 않는다. 이를 위해 부모 클래스와 자식 클래스 사이는 행위가 일관되어야 한다. LSP를 이해하려면 일반화 관계를 다시 생각해야한다. 일반화 관계는 'is a kind of 관계' 라고도 한다. 예를들어 원숭이는 포유류이고, 원숭이와 포유류 사이에 '원숭이 is a kind of 포유류 관계'가 성립한다. 따라서 부모 클래스로 포유류, 자식 클래스로 원숭이를 설정하는 것에 대체로 반론의 여지..
개방-폐쇄 원칙 (OCP, Open-Closed Principle) 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다. 단일책임 원칙에서 예를 든 성적표나 출석부에 학생의 성적이나 출석 기록을 출력하는 기능을 생각해보자. 다음 그림은 SomeClient 클래스에서 이 기능을 이용하는 경우를 모델링한 것. 성적표나 출석부에 학생을 출력하는 기능을 사용 만약 도서관 대여 명부와 같은 새로운 매체에 학생의 대여 기록을 출력하는 경우라면, 아주 간단한 방식으로 도서관 대여 명부 클래스를 만들어 SomeClient 클래스가 이 기능을 이용하도록 할 수 있다. 그러나 이 방식은 OCP를 위반한다. 새로운 기능(도서관 대여 명부에 학생의 대여 기록을 출력)을 추가하려고 SomeClient ..