
상속을 이용해 기능을 확장한 예시를 들어보자. FileOut은 데이터를 파일에 출력하는 기능을 제공한다. 그리고 BufferedOut과 ZipOut은 각각 버퍼 기능과 압축 기능을 추가 제공한다. 그런데 만약 버퍼 기능과 압축 기능을 함께 제공하고 싶다면 어떻게 해야 할까? 이렇게 하위 클래스를 추가해서 구현할 수 있다. 이 방법은 직관적이지만 추가할 수 있는 기능이 많아질 경우 클래스의 개수가 지나치게 많아질 수 있다는 문제가 있다. 이럴 때 사용할 수 있는 것이 바로 데코레이터 패턴이다. 데코레이터 패턴은 상속이 아닌 '위임' 방식으로 기능을 확장한다. 구조가 조금 복잡해보이니 코드를 통해 이해해 보자. public abstract class Decorator implements FileOut { p..

자판기에 들어가는 소프트웨어를 만든다고 상상하자. 자판기는 다음과 같이 동작한다. 동작 상태 실행 결과 동전을 넣는다 동전 없음 금액을 증가 제품 선택 가능 상태 동전을 넣는다 제품 선택 가능 금액을 증가 제품 선택 가능 상태 제품을 선택한다 동전 없음 아무 동작하지 않음 동전 없음 상태 유지 제품을 선택한다 제품 선택 가능 제품을 주고 잔액 감소 잔액 있으면 제품 선택 가능 잔액 없으면 동전 없음 상태 위 표를 토대로 다음과 같은 프로그램을 작성했다. public class VendingMachine{ public static enum State { NOCOIN, SELECTABLE } private State state = State.NOCOIN; public void insertCoin(int co..

첫 번째 손님, 그리고 신선하지 않은 과일에 대해 할인을 적용하는 과일 가게를 생각해보자. public class Calculator{ public int calculate(boolean firstGuest, List items){ int sum = 0; for (Item item : items){ if(firstGuest) sum += (int)(item.getPrice()*0.9); else if(!item.isFresh()) sum += (int)(item.getPrice()*0.8); else sum += item.getPrice(); } return sum; } } 간단한 코드지만 만약 할인 정책이 계속해서 추가된다면 if-else 문이 늘어나고 calculate의 parameter도 증가해 코..

고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 된다. 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다. 고수준 모듈 : 의미 있는 단일 기능을 제공하는 모듈 저수준 모듈 : 고수준 모듈 기능을 구현하기 위해 필요한 하위 기능의 실제 구현 예를 들어 상품의 가격을 결정하는 정책을 살펴보자. 고수준 : 쿠폰을 적용해서 가격 할인을 받을 수 있다. 저수준 : 가격 할인을 %로 할 것인가, 고정된 금액으로 할 것인가 등등... 만약 고수준인 '가격계산모듈'이 저소준 모듈(쿠폰 구현)에 의존한다면 어떤 문제가 생길까? 쿠폰 구현이 추가되거나 변경될 때마다 가격계산모듈의 코드에도 변경사항이 생길 것이다. 이러면 기능변경에 따른 프로그램의 변경이 어려워진다. 저소준 모듈이 변경되더라도 고소준 모듈..
상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다. 무슨 말인지 모르겠다. 예제 코드로 살펴보자. 리스코프가 잘 지켜지지 않은 사례 : 직사각형-정사각형 문제 public class Rectangle{ private int width; private int height; public void setWidth(int width){ this.width = width; } public void setHeight(int height){ this.height = height; } public int getWidth(){ return width; } public int getHeight(){ return height; } } public class Square..

클래스는 단 한 개의 책임을 가져야 한다. 단일 책임 원칙이 지켜지지 않은 예 public class DataViewer{ public void display(){ String data = loadHtml(); updateGui(data); } public String loadHtml(){ HttpClient client = new HttpClient(); client.connect(url); return client.getResponse(); } private void updateGui(String data){ GuiData guiModel = parseDataToGuiData(data); tableUI.changeData(guiModel); } private GuidData parseDataToGui..
- Total
- Today
- Yesterday
- java
- 토비
- 백기선
- 예외처리
- 객체지향
- ec2
- gracefulshutdown
- 카카오
- 토비의스프링
- 코테
- 프록시
- 김영한
- 템플릿콜백
- 코딩테스트
- 데코레이터패턴
- 메서드레퍼런스
- 토비의봄TV
- 디자인패턴
- SOLID
- 자바
- 프로그래머스
- BOJ
- c++
- OOP
- 프록시패턴
- 스프링
- AOP
- provider
- 자바스터디
- 서비스추상화
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |