Proxy란 1. 대리(권) 2. 대리인 3. (측정・계산하려는 다른 것을 대표하도록 이용하는) 대용물 등 대신 무엇을 하는 것을 뜻한다. proxy패턴 또한 무슨 일을 대신할 객체를 만들어서 사용하는 것인데, 하는 일에 따라 분류가 된다. 원격 프록시 원격에 있는 객체를 대신하여 주는 프록시 가상 프록시 생성하기에 비용이 많이 드는 객체가 준비가 완료될때까지 대신하여 주는 프록시 보호 프록시 원 객체에 대한 접근 보호 기능을 제공하기 위해사용되는 프록시 이 글에는 가상 프록시에 대한 글을 써보겠다.위에 테이블에 나온 글 그대로 가상 프록시는 무엇을 생성하는데, 그것의 생성하는 비용이 커서 준비할 동안 대신해준다. 예로 이미지를 보여주는데, 이미지 로드 시간이 길어서 Loading이라는 문구를 띄워주는 ..
Bridge Pattern(가교패턴)은 구조패턴의 하나로, 추상과 구현을 분리하여 다양성을 가질수 있도록하는 패턴이다. 가교패턴을 사용하면, 런타임에 구현방법을 선택할 수 있고, 추상과 구현이 분리 되어있기 때문에 추상개념만 연결하면 독립적으로 확장하는게 쉽다. 가교패턴을 살펴보면, 기본 구조(꼴)이 다음과 같이 보인다. 추상을 만들고 이를 상속하는 컨크리트클래스를 만들어서 구현한다. 이와 관련된 예시를 생각해보았으나 잘 생각나지 않아 위키에 있는 예제코드(조금 바꿈) 살펴보겠다. 기본적으로 추상으로써, DrawingAPI라는 인터페이스를 만들어서, 이를 상속받는 DrawingAPI1과 DrawingAPI2를 만들어 구현한다. (여기서 구현부는 출력만 되도록 되있다.) public interface Dr..
prototype pattern, 즉 원형패턴이란 원형이 되는 인스턴스를 활용해서 새로운 객체를 생성하는 생성패턴 중 하나이다. 원형패턴을 사용함으로써, 미리 원형으로 초기화를 해두고, 나중에 이와 같은 객체를 생성할때, 다시 초기화하지 않아도 되는 편리성을 제공한다. 즉, 새로운 객체는 일반적인 방법으로 객체를 생성(create)하는 고유의 비용이 매우 클 때, 이 비용을 감내하지 않을 수 있게 해준다. 또한, 런타임에 새로운 제품을 추가 및 삭제가 가능하고, 값들을 다양화할 수 있다. 일반적으로 원형패턴의 구조는 다음과 같다. 원형 패턴을 구현하기 위해서는 원형클래스를 다루는 원형 관리자가 있어야한다. 그리고, 복사를 해야하기 때문에, Clone연산이 필요하다. 간단하게 구현해보자. 게임에서 흔히 나..
의존성을 낮출 수 있는 생성패턴의 하나로 생성 방법이 바뀔 때마다 새로운 매개변수를 넘겨받음으로써, 생성할 객체의 유형을 바꿀 수 있는 추상 팩토리 패턴에 대한 예를 적어보고자 한다. 이런 생성 패턴을 사용하는 이유 중 가장 큰 이유가 의존성의 낮춤으로써, 유연성을 확보하는 데 목적을 둔다. 이 패턴을 설명하기위해 로봇을 생성하는 프로그램을 간단하게 제작해 보겠다. 우선, A, B, C라는 공장이 있다. A공장에서는 청소로봇을 생산하고, B공장은 전투로봇을 생산한다. 그리고 , C공장은 요리로봇 생산한다. 사용자는 청소로봇을 필요로 해서, A공장에 찾아가서 로봇을 만들어달라고 한다. 이 상황을 코드로 옮겨 보자. Client RobotFactory factory = new ARobotFactory(); ..
Code refactoring is a "disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior" 리팩토링은 위 정의대로 바뀌것은 없어보이지만, 소프트웨어 내부를 더 좋게 바꾸는 작업이다. 리팩토링을 하는 이유는 무엇일까? 1. 리팩토링으로 중복된 코드를 제거함으로써, 소프트웨어의 수정 및 가독성이 좋아진다.중복된 코드를 사용하게 되면, 코드의 길이가 늘어나게 된다. 이런 경우 굉장히 복잡해 보이고, 읽기 힘들어 지기 마련이다. 또한, 수정을 하더라도, 중복된 코드의 모든 내용을 수정해야하므로, 코드의 중복은 피할 수..
Law of demeter는 최소 지식의 원칙이다. 여기서 말하는 지식은 "객체간의 얼마나 많은 정보를 가지고 있는 가"이다. 이런 지식을 최소한으로 가져야한다. 즉, Coupling 관계가 낮아야한다. 다음 코드는 최소 지식의 원칙에 어긋 나는 경우이다. public class A { private B b; public A() { b = new B(); } public B getB(){ return b; } } public class B { public void doSomething(){ System.out.println("작동을 한다."); } } A, B클래스가 있다. 호출하는 클래스에서 a 객체를 가지고 b의 객체 정보를 받아온다. 하지만, 받아오는 과정을 보면 호출하는 클래스에서 정보를 너무 많..
DIP(Dependency Inversion Principle)는 의존관계역전의 원칙이다. A라는 객체가 B라는 객체를 포함하고 있는 경우, B가 A객체를 호출해야 하는 일이 필요할 수 있다. 즉, 하이 레벨 모듈이 로우 레벨 모듈을 의존하는 구조, 추상이 상세를 의존하는 구조적 디자인, 이런 경우 의존관계연전 이라고 하게 된다. 이를 해결하기 위해서는 단순 컨크리트 클래스를 참조하기 보다는 참조하는 것을 추상화시켜서 참조하는 것이 좋다. 즉, 인터페이스에 의존해야한다. 이유는 자주 변경되는 컨크리트 클래스보다 추상클래스, 인터페이스가 의존을 느슨하게 하기 때문이다.
ISP( Interface Segregation Principle ) : 많은 클라이언트 고유의 인터페이스는 하나의 범용 인터페이스보다 우수하다. 즉, 거대한 클래스가 있다면, 그것을 쪼개라. 다음과 같은 코드가 있다. public interface Worker { public void work(); public void eat(); } public class Staff implements Worker { @Override public void work() { System.out.println("Staff가 일한다."); } @Override public void eat() { System.out.println("Staff가 먹는다."); } } 위 코드는 일하는 사람이라는 Worker인터페이스를 Sta..
SRP(Single Responsibility Principle)는 단일 책임의 원리로써, 한 클래스는 오직 하나의 책임만을 가진다는 것이다. 클래스를 만들다보면, 클래스가 여러기능을 하는 경우가 많다. 이런경우는 객체지향적 관점에서 좋지 않다. 다음과 같은 코드가 있다. public class Student { private String penColor; private int penThick; public Student(String penColor, int penThick) { this.penColor = penColor; this.penThick = penThick; } public String getPenColor() { return penColor; } public void setPenColor(..
OCP(Open Closed Principle)는 확장에는 열려있되, 수정에는 닫혀있어야한다는 디자인 원칙이다. 게임 캐릭터에서 궁수라는 캐릭터를 예를들어 설명해보겠다. 아래 클래스는 아처(캐릭터) 클래스와 활(무기) 클래스이다. public class Archer { private Bow bow; private int level; public Archer(int level) { bow = new Bow(); this.level = level; } public void Attack(){ StringBuilder sb = new StringBuilder(); sb.append("Archer가 데미지 "); sb.append(getPower()); sb.append("을(를) 입혔습니다."); System...
- Total
- Today
- Yesterday