달력

05

« 2012/05 »

  •  
  •  
  • 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
  •  
  •  
우리는 나이가 들면서 중요한 것을 가끔 잊고 삽니다. 하지만 가끔씩 이런 것을 어린 아이들로부터 다시 배우기도 합니다. 그 중 하나가 '왜?'라는 질문입니다. '왜?'라는 질문에 화를 내는 이유는 내가 모르는 것을 인정하기 싫거나, 특별한 이유없이 나의 생각을 상대방에게 강요하고 있다는 불편한 진실을 드러내고 싶지 않기 때문이라고 생각합니다.


하지만 개발자라면 이 '왜?'라는 질문을 적극적으로 하고, 스스로 답을 찾는 노력이 반드시 필요합니다. 마찬가지로 우리가 객체지향 설계 원칙을 따르는 이유에 대한 질문도 필요하고, 그에 대해 이미 지난 글을 통해서 알아본 바 있습니다. ([패턴/객체지향] - 객체설계[3] - 객체지향 설계 원칙을 따르는 이유)

보통 '왜?'라는 질문에 대해서 이해가 되기 시작하면 그 다음 단계는 '어떻게?'라는 질문을 하게 됩니다. 오늘 배우실 객체지향 설계 원칙이 바로 이 '어떻게?'라는 질문에 대한 답이 되겠네요. 오늘은 그 원칙의 핵심을 먼저 알려드리겠습니다.

1. 설계의 목표를 파악한다. (재설계의 경우 재설계의 원인을 파악한다.)
2. 바뀌는 부분과 바뀌지 않는 부분을 파악한다.
3. 바뀌는 부분을 캡슐화한다.


끝입니다. 너무 간단한가요? 아니면 너무 추상적이라서 여전히 어떻게 해야할 지 감이 안잡히시나요? 원래 기본이라는 것은 쉬워보이지만 그 의미를 깨닫기까지 아주 많은 노력과 시간이 필요합니다. 앞으로 상세하게 알아볼 모든 내용이 이 3가지 원칙에서 거의 벗어나지 않습니다. 

소개팅을 한번 예로 들어볼까요? 우리의 목표는 소개팅하는 과정을 표현하고, 그 결과를 boolean 값으로 나타낸다고 가정해보겠습니다. 

1. 설계의 목표를 파악한다.

public boolean 소개팅() {
...


2. 바뀌는 부분과 바뀌지 않는 부분을 파악한다.

바뀌지 않는 부분 : [1. 소개받는다. 2. 만난다. 3. 헤어진다.]로 이어지는 절차
바뀌는 부분 : 소개받는 방법, 만나서 데이트 하는 방법, 헤어지는 방법 등


3. 바뀌는 부분을 캡슐화한다.

public boolean 소개팅() {
// 1. 소개받는다.
소개받음();

// 2. 만나서 데이트한다.
만나서 데이트();

// 3. 헤어진다.
헤어짐();
}

private void 소개받음() {
// 소개받는 방법을 구체적으로 기술
...(친구를 괴롭혀서 강제로 소개해달라고 함)


private void 만나서 데이트() {
// 만나서 데이트 하는 방법을 구체적으로 기술
...(영화보고, 근사한 곳에서 저녁식사를 함)


private void 헤어짐() {
// 헤어짐
...(집까지 바래다주고, 애프터 신청을 정중하게 함)


자, 어떠신가요? 조금은 이해가 되시는가요? 바뀌지 않는 부분인 절차적인 부분은 소개팅()에 구현이 되었고, 바뀌는 부분은 private 메서드로 빼서 상세한 내용을 기술하면서 소개팅()에서는 그 내용을 알 수 없도록 캡슐화한 것입니다. 

캡슐화를 하는 방법은 다양합니다. private 메서드로 만들거나, 클래스로 만들거나, 인터페이스로 만듭니다. 아주 쉽게 말하면 블락( { ... } )안으로 감싸는 것입니다.

만약 캡슐화를 하지 않으면 다음과 같은 모양이 나옵니다.

public boolean 소개팅() {
// 소개받는 방법을 구체적으로 기술
...(친구를 괴롭혀서 강제로 소개해달라고 함)

// 만나서 데이트 하는 방법을 구체적으로 기술
...(영화보고, 근사한 곳에서 저녁식사를 함)

// 헤어짐
...(집까지 바래다주고, 애프터 신청을 정중히 함)


두번째 예제가 더 좋아보일지도 모릅니다. 일련의 흐름이 하나의 메소드 안에 다 적혀있어서 그렇겠죠? 하지만 두번째 예제는 변경에 굉장히 취약한 구조를 가지고 있습니다. 소개받는 방법이 변경되어도, 또는 만나서 데이트하는 방법이 바뀌던지, 헤어지는 방법이 바뀌어도 소개팅()를 수정해야합니다. 그리고 수정해야 할 내용이 2개 이상만 되어도 소개받는 방법 때문에 소개팅()이 실패(false)하는지, 헤어지는 방법때문에 소개팅()이 실패하는지 알기 힘듭니다.

또한 소개팅()를 보는 사람은 [소개받음 -> 만나서 데이트 -> 헤어짐]으로 이어지는 큰 흐름을 파악하지 못할 가능성이 높아집니다. 이렇게 코드에 대한 가독성이 떨어지면 당연히 수정에 오래 걸리게 됩니다. 이해하는 시간이 그만큼 더 많이 필요하기 때문이죠.

단적인 예로 소개받음 부분이 50라인, 만나서 데이트하는 부분이 100라인, 헤어짐 부분이 50라인이라고 한다면 200라인을 한꺼번에 보시는 것이 이해하기 쉬우신가요? 아니면 3라인으로 흐름을 파악한 후 구체적인 각 절차를 따로 이해하시는 것이 이해하기 쉬우신가요?

선택은 여러분들의 몫입니다. ^^

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 스쿨쥐
"세상에서 변하지 않는 것은 변화 그 자체이다."라는 말이 있습니다. 마찬가지로 우리가 만드는 소프트웨어도 만드는 과정에서 변화의 과정을 거치게 됩니다. 프로젝트를 진행하면서 프로젝트를 구성하는 요소들, 즉, 범위, 비용, 시간, 품질 등은 항상 변화합니다. 그 중 가장 빈번하게 변화하는 것을 꼽으라면 범위(요구사항)가 아닐까 합니다.

범위가 변하는 이유는 여러가지가 있습니다.

1. 비즈니스 상황이 변하여 능동적으로 대처할 수 밖에 없는 경우.
- ex) 개인정보보호법처럼 법이 개정되어 소프트웨어에 영향을 주는 경우, 아이폰과 같은 스마트폰 도입으로 인한 새로운 요금제 도입 등
2. 고객이 비즈니스를 잘못 이해한 경우
3. 고객이 설명해준 비즈니스를 개발하는 입장에서 잘못 이해한 경우

이 외에도 많은 이유들이 존재할 수도 있습니다. 하지만 이럴 경우 소프트웨어를 만드는 입장에서 어떻게 대처를 해야할까요? 1번 또는 2번의 경우 고객이 제대로 하지 못했으니 불가능합니다라고 대답하면 될까요?

다시 한번 이번 연재의 처음글을 잠시 살펴보고 다음 질문에 대한 답을 생각해봅시다.
([패턴/객체지향] - 객체설계[1] - 소프트웨어의 목표)

우리가 만드는 소프트웨어의 목표가 무엇인가요?

네. 맞습니다. 고객이 원하는 가치를 만족시켜주는 것입니다. 범위에 대한 변화를 줘서 고객 가치가 증대된다면 그렇게 해야합니다. 그렇다면 무조건 고객이 원하는 대로 만드는가? 그것도 아닙니다. 다음과 같은 것을 해야합니다.

1. 목적의 이해
- 고객이 범위를 변경해서 얻는 가치가 무엇인가? 정말 필요한 것인가?
2. 방법의 타당성 검증
- 고객이 원하는 방법이 정말 고객이 원하는 가치를 만족시켜줄 수 있는 방법인가? 다른 방법은 없는가?
3. 영향도 및 비용 분석
- 고객이 원하는 방법으로 바꾸었을 경우 고객이 얻는 가치와 프로젝트 자원의 소모(비용, 시간 등)를 계산했을 때 범위를 수정하는 것이 이익인가? 손해인가?

앗! 이것을 개발자가 해야한다구요? 네. 맞습니다. 개발자가 해야합니다. 물론 고객이나 프로젝트 관리자, 분석가, 설계자 등 다른 프로젝트 구성원과 함께 해야 합니다. 다만, 개발자는 고객이나 관리자가 결정을 내릴 수 있도록 '참고자' 역할까지만 해주면 됩니다. 그렇게 하면 개발자가 정리한 내용으로 고객이 관리자와 함께 협의하여 결정을 내릴 것입니다. 최소한 이정도는 해주셔야 합니다.

그런데 아이러니하게도 과거의 비즈니스 결정사항이나 개발자의 코드 구현의 품질에 따라서 영향도나 수정 비용이 다르게 계산됩니다. 즉, 우리가 과거에 만들었던 코드의 설계구조가 소프트웨어를 통해 만족시킬 고객 가치에 대해서 영향을 줄 수 있다는 것입니다. 그렇기 때문에 우리가 만드는 소프트웨어의 설계가 어떻게 구성되어있는지가 중요하며, 객체지향 설계원칙을 따르면 이런 변화에 대해서 조금은 대처를 잘 할수 있는 구조를 가져갈 수 있기 때문입니다.

또한 개발자 입장에서 객체지향 설계원칙을 따르는 이유를 정리하면 다음과 같습니다.

1. 코드를 변경하기 쉬워집니다.
2. 코드를 이해하기 쉬워집니다.
3. 코드를 재사용하기 쉬워집니다.


앞에서 장황하게 설명한 이유는 제가 생각하기에도 다소 무리가 있을 수 있다고 생각합니다. 하지만 개발자 입장에서 객체지향 설계원칙을 따르는 이유에 대해서는 많은 분들이 공감을 하시리라 생각합니다. 그럼 다음 시간부터는 객체지향 설계의 원칙들이 어떤 것들이 있는지 하나하나 알아가보도록 하겠습니다. 
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 스쿨쥐
우리는 지난글([패턴/객체지향] - 객체설계[1] - 소프트웨어의 목표)을 통해서 소프트웨어의 목표와 원칙에 대해서 알아보았습니다. 그렇다면 이러한 소프트웨어는 어떻게 만들어지는 것일까요? 바로 '프로젝트'라는 것을 통해서 만들게 됩니다.

프로젝트의 정의는 다음과 같습니다. 
명사
1. 연구나 사업. 또는 그 계획. '연구과제', '일감'으로 순화.
2. <교육> [같은말] 프로젝트법(실제에 있어서 일의 계획과 수행 능력을 기르는 교육방법).
- 출처 : 네이버 국어사전(http://krdic.naver.com/detail.nhn?docid=41015800
프로젝트라는 말은 비단 IT에서만 쓰이는 말이 아닙니다. 아폴로 계획(Project Apollo), 맨해튼 계획(Manhattan Project) 등 여러 분야에서 사용되고 있습니다. 즉, 프로젝트어떤 목표를 달성하기 위한 계획 또는 그 계획을 실현하기 위한 일련의 일의 진행과정을 모두 포함하는 의미입니다.

이런 의미를 확장한다면 소프트웨어 프로젝트소프트웨어가 가지는 목표를 달성하기 위해서 소프트웨어를 만들어가는 계획 및 일의 진행과정을 의미한다고 할 수 있습니다. (앞으로 나오는 프로젝트란 소프트웨어 프로젝트를 의미합니다.) 이런 프로젝트를 관리를 잘 해서 고객이 원하는 가치를 만족시켜주는 소프트웨어를 만들어내야 하는데 관리해야할 것들이 굉장히 많습니다. 그 중 중요한 것을 추려내면 다음과 같습니다.

프로젝트 관리 삼각형

이미지출처(http://en.wikipedia.org/wiki/File:The_triad_constraints.jpg)


1. scope(범위) : 기능을 얼마나 만들어 낼 것인가?
2. cost(비용) : 비용은 얼마나 들것인가?
3. schedule(시간) : 시간은 얼마나 들것인가?
4. quality(품질) : 얼마나 좋게 만들것인가? 

이 네개의 요소를 어떻게 결정할 것인가가 바로 프로젝트 관리의 핵심입니다. 어라? 위에 나와있는 그림은 지난번 글에서 보던 소프트웨어의 목표를 달성하기 위한 원칙을 나타내는 그림과 비슷합니다. 비교해볼까요?


앗! 거의 똑같네요. 여기서 어떤 생각이 드시나요? 잠깐 생각해보고 글을 계속 읽어주세요. 

제가 생각하는 프로젝트 관리소프트웨어를 통해서 얻을 수 있는 고객 가치를 최대화하기 위해서 고객 가치를 조절해나가는 계획과 그 계획을 실행해가는 과정을 의미합니다. 우리가 가지고 있는 자원(시간, 비용 등)은 제한되어 있고, 그 제한된 자원 속에서 최대치의 고객 가치를 만들어 내는 것이지요.

말은 쉽지만 실제로는 굉장히 어렵습니다. 그 이유는 자원(시간, 비용 등)이 제한되어 있고, 고객이 원하는 기능(범위, 요구사항 등)이 수시로 변하는 것입니다. 특히 개발하는 입장에서는 고객의 요구사항이 변경되는 것이 굉장히 부담스럽습니다. 그렇다고 변하는 요구사항을 마냥 무시할 수 없는 일입니다. 

그럼 어떻게 해야할까요? 

바로 다음 글에서 이어집니다. 
 


저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 스쿨쥐
우리가 만들고 있는 소프트웨어는 고객이 원하는 가치를 만들어내기 위한 것입니다. 

고객이 원하는 가치는 다양합니다. 고객이 하고 싶은 일을 하기 위해서 소프트웨어를 사용할 수 있습니다. 또는 고객이 시간이 필요해서 다른 수단을 통해서 할 수 있지만 소프트웨어를 통해서 시간을 아끼고 싶을 수 있습니다. 아니면 소프트웨어를 이용하여 기존에 들었던 비용을 줄이는 것이 목적일 수도 있습니다.

예를 한번 들어보죠. 

1. 지하철 앱 : 항상 지하철 노선도(종이)를 들고 다니기 힘들기 때문에 스마트폰에 있어서 항상 확인할 수 있었으면 한다. 지하철 환승의 경우 어느 칸에 가면 빠르게 환승할 수 있는지 궁금하다. 
(하고 싶은 일을 하기 위한 경우)

2. 코레일 앱 : 기차를 자주 이용하는데, 역에서 줄을 서서 예매를 하거나, 자동발매기를 이용하려면 시간이 오래 걸린다. 인터넷으로도 가능하지만 컴퓨터를 접하지 않는 직업의 경우 컴퓨터를 사용하려면 시간을 따로 내야한다. 그냥 평소에 들고다니는 스마트폰에서 가능하다면 시간을 절약할 수 있을 것 같다.
(시간을 아낀 경우)

3. 인터넷뱅킹 : 기존 은행 창구에서 입출금에 대한 업무를 처리하는 것은 많은 비용(공간비용, 인건비 등)이 들었다. 인터넷뱅킹을 통하여, 은행고객에게 편의성을 제공하면서, 은행 창구에서의 입출금 업무가 줄어들어 비용(공간비용, 인건비 등)을 줄일 수 있었다.
(비용을 줄인 경우)

이처럼 우리가 만든 소프트웨어는 여러가지 형태로 고객이 원하는 가치를 만들어내고 있습니다. 이 때문에 고객은 소프트웨어를 필요로 하는 것입니다.

소프트웨어의 목표는 다음과 같은 원칙을 통해 고객이 원하는 가치를 만족시키는 것입니다.
1. 고객이 원하는 일을 할 수 있도록 기능을 제공한다.
2. 고객이 원하는 일을 하는데 드는 시간을 줄인다.
3. 고객이 원하는 일을 하는데 드는 비용을 줄인다.

이것 외에도 고객이 원하는 가치는 많습니다. 게임의 경우 즐거움이라는 가치를 주는 것이고, 어떤 경우에는 타임킬링(시간 때우기)을 위해서 하기도 합니다. 하지만 이런 것들도 큰 범주 내에서 본다면 위에서 언급한 3가지 원칙안에 포함된다고 할 수 있을 것입니다.

객체설계를 하는데 왜 갑자기 소프트웨어의 목표를 언급을 하느냐라고 궁금하실 수 있습니다. 이에 대해서는 차차 언급할 생각입니다. 글이 길면 읽기도 힘들고, 핵심을 놓치는 경우가 많습니다. 이번 글은 여기까지이며, 다음 글에서 계속 이어나가겠습니다.
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 스쿨쥐
2010/08/04 10:24

javadoc의 주석 태그 패턴/구현패턴2010/08/04 10:24


@exception : 메소드에서 발생할 수 있는 예외를 기술(method 뒤에 throws가 있을 때 사용)
@throws : @exception과 동일하나 method 뒤에 throws가 없고 코드상에서 RuntimeException이 발생할 때 사용


대충 작성중...
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 스쿨쥐
2010/08/03 16:50

개발시 참조할 용어정리 패턴/구현패턴2010/08/03 16:50

프로젝트에서 개발시에 참조할 용어정리 중....
  1. 퍼시스턴트
    • create
    • read
    • update
    • delete

  2. 도메인(비지니스)
    • add, register ...
    • inquiry, find, search...
    • modify, change, to, convert, revise ...
    • remove, cancel, destroy ...
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 스쿨쥐

보통 비지니스 로직을 구현하는 부분에 있어서는 비지니스 로직을 글이나 말로 설명하듯이 코드를 작성하는 것이 좋습니다. 물론 어플리케이션 로직과 100% 분리는 할 수 없겠지만 노력은 해야합니다. 이런 노력을 기울인다면 컴퓨터가 이해하는 로직이 아닌 사람이 이해하는 로직을 짤 수 있지 않을까 합니다.

자판기에서 커피를 뽑는 것을 생각해봅시다.
1. 자판기에 동전을 넣습니다.
2. 자판기에서 금액에 맞는 커피 종류 버튼에 불이 들어옵니다.
3. 불이 들어온 버튼을 누릅니다.
4. 커피 나오는 곳에서 불이 켜지면서 자판기에서 일정시간동안 커피를 만듭니다.
5. 커피를 만들고 나면 커피나오는 곳의 불이 꺼지게 됩니다.

아래의 경우와 비교해봅시다.
1. 자판기는 기존 금액에 동전만큼의 금액을 더합니다. 
2. 커피의 종류 중 금액보다 작은 커피의 종류에 불켜짐 속성을 true로 바꿉니다.
3. 버튼을 누릅니다. 자판기는 해당 버튼의 불켜짐 속성이 true인지 false인지 비교를 합니다. 
4. 불켜짐 속성이 true이면 커피 나오는 곳의 불켜짐 속성을 true로 하고, 해당 커피를 설탕 ~g과 커피 ~g, 물 ~cc를 넣어서 섞습니다.
5. 커피를 만들고 나면 커피 나오는 곳의 불켜짐 속성을 false로 바꿉니다.

위쪽이 훨씬 이해하기가 쉽지 않을까요? 물론 코드 자체는 굉장히 유사할 수 있지만 로직을 구현하는 부분에서 비지니스 설명단위로 메서드를 표현하고 메서드명을 의도에 맞게 이름을 짓는 것이 좋습니다. 예를 들어, 자판기에 동전을 넣는 것을 setMoney 또는 addMoney라고 하는 것보다 insertCoin이 훨씬 낫겠지요.

서비스 명이나 도메인에 있어서의 메서드 명은 의도가 분명히 들어나는 이름을 사용해야 할 것이고, DAO를 통해 데이터베이스에 값을 저장하는 것과 같이 어플리케이션 로직에서는 그에 맞는 이름을 사용해야 할 것입니다.

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 스쿨쥐
2009/12/04 19:01

생성패턴 패턴/디자인패턴2009/12/04 19:01

생성패턴은 객체를 만드는 절차를 추상화하는 패턴입니다. 왜 이것을 써야 하냐구요? new 연산자로 그냥 만들면 되는데 왜 이런 ~~패턴이라는 녀석을 꼭 적용해서 써야만 하는 것일까요? 맞습니다. new 연산자로 그냥 만들면 됩니다. 자, 지금부터 생성 패턴이 왜 필요한 지 알아봅시다 ^^

요즘 많은 분들이 카드를 쓰십니다. 좋죠. 혜택도 많구요. 다만 절제력이 약하다면 신용불량자가 될 지도 모릅니다. ^^; 어쩃든 저는 카드가 필요합니다. 카드를 한번 만들어보죠 ^^

Card myCard = new Card();

오우!! 카드가 만들어졌네요 +_+ 이제 카드를 쓰시면 됩니다. 아... 그런데 법이 바뀌었다고 합니다. 반드시 이름을 넣어야 카드를 사용할 수 있다네요. 그래서 새로 카드를 만듭니다.

Card myCard = new Card("스쿨쥐");

야호~ 새로운 카드가 발급 되었습니다. 약간의 변경은 있었지만 제가 원하던 카드가 만들어졌네요. 이제 쇼핑을 즐겨볼까요? 아... 또 법이 바꼈답니다. 카드 발급이 쉬우니까 신용불량자도 많이 생겼고, 국가에서 좀 엄격하게 심사를 해서 발급하라고 하는군요. 신분증 사본을 내라고 하네요. 그래서 운전면허증을 제출해서 만들려고 합니다.


DriverLicence licence = new DriverLicence("스쿨쥐");
Card myCard = new Card("스쿨쥐", licence);

아... 아직까지는 간단한 듯 보입니다. 하지만 불안한 기운이 엄습해오는군요. 법이 바뀔 때마다 점점 늘어가는 코드량에 약간씩 두려움을 느낍니다. 아니나다를까 이젠 소득증빙도 해야한답니다. 그리고 제출한다고 무조건 발급되는 것이 아니라 제출한 증명서(신분증 사본, 소득증빙서류)를 내부적인 심사를 거쳐서 발급해준다고 하는군요. 심사를 통과를 못하면 발급을 안해준다고 합니다.

DriverLicence licence = new DriverLicence("스쿨쥐");
IncomeDoc incomeDoc = new IncomeDoc("스쿨쥐");

Card myCard = null;
if(licence.vaild() && incomeDoc.getS
alary() >= 3000) { myCard = new ("스쿨쥐");

점점 복잡해지는군요. 그런데 생각을 해보니 카드는 여러 종류였던 것입니다. 신용카드, 체크카드, 기프트카드 등등 이런 종류에 따라 발급 조건이 다 다르다고 합니다. 카드사마다 정책도 다르구요. 이제는 단순 코딩, 단순 new 연산만을 사용해서 하기에는 복잡도가 너무나도 커졌습니다.

이제는 new 연산자가 아니라 카드를 전담하는 무엇인가가 필요하다는 것을 느끼게 되었습니다. 즉, 카드 발급(카드 생성)을 전담하는 클래스(또는 클래스들)이 필요하게 되었고, 사용자 입장에서는 그 카드들이 어떠한 조건을 거쳐서 발급되는지 알 필요는 없습니다. 단지 카드가 발급되어서 받기만 하면 되니까요.

자, 어떠신가요? 이런 이유에서 우리는 이런 객체를 만드는 패턴을 생각하게 되었고 이러한 것들을 가리켜서 생성패턴이라고 명명하게 된 것이죠.

그럼 생성패턴에는 어떠한 것들이 있는지 한번 알아보겠습니다.

 Abstract Factory  추상 제품들과 추상 공장들을 만들어내는 패턴(조립방법 없음, 공장 여러개, 부품종류 여러개)
 Builder  객체를 생성하는 방법과 객체를 구현하는 방법을 분리하는 패턴(조립방법 별도 관리)
 Factory Method  상위클래스에서 부품을 조립하고 하위클래스에서 부품 생성을 하는 패턴(조립방법 포함, 공장 하나, 부품종류 하나)
 Prototype  클래스로 공장 종류를 만드는 것이 아니라 견본 공장으로부터 인스턴스를 복사해서 사용하는 패턴
 Singleton  인스턴스가 반드시 하나만 있어야할 때 사용하는 패턴

GoF에서 나오는 생성패턴은 모두 5가지입니다. 각각의 패턴이 어떤 경우에 사용되는지 잘 확인하시고 사용하시면 될 것 같습니다. 앞으로 생성패턴에 대해서 하나하나 자세히 알아가보겠습니다.
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License

'패턴 > 디자인패턴' 카테고리의 다른 글

생성패턴  (0) 2009/12/04
디자인 패턴 사용 방법  (0) 2009/12/04
디자인 패턴 관계도  (0) 2009/12/03
디자인 패턴이란?  (0) 2009/12/03
Posted by 스쿨쥐
2009/12/04 15:56

디자인 패턴 사용 방법 패턴/디자인패턴2009/12/04 15:56

GoF 패턴의 목록입니다. GoF패턴을 모두 읽으신 후 실제로 적용해야할 때 어떤 것을 선택해야할 지 고민스럽습니다. 그래서 간단한 요약을 통해서 적절한 판단을 할 수 있도록 참조용 표를 한번 만들어보았습니다. 

경고 : 
패턴은 함께 사용할 때 진정한 힘을 발휘하며, 중요한 것은 패턴 카탈로그에 나오는 구조가 아니라 의도와 적용시점이라는 점을 명심하십시오.


1. 생성 패턴
 Abstract Factory  제품 객체군(큰 공장)
 Builder  복합 객체 생성 방법(감독자와 빌딩건축)
 Factory Method  인스턴스화될 객체의 서브클래스(작은 공장)
 Prototype  인스턴스화될 객체 클래스(인스턴스 복사)
 Singleton  클래스의 인스턴스가 하나일때(워3의 영웅)

2. 구조 패턴
 Adapter  객체에 대한 인터페이스(호환성)
 Bridge  객체 구현(기능과 구현의 분리)
 Composite  객체의 합성과 구조(트리, 재귀구조)
 Decorator  서브클래싱 없이 객체의 책임성(원본유지, 위임기능추가)
 Facade  서브시스템에 대한 인터페이스(안내소, 프런트)
 Flyweight  객체의 저장 비용(인스턴스 공유, pool)
 Proxy  객체 접근 방법(프록시 서버, 매니저)

3. 행동 패턴
 Chain of Responsibility  요청을 처리하는 객체(책임 떠넘기기)
 Command  요청의 처리 시점과 처리 방법(요청의 캡슐화)
 Interpreter  언어의 문법과 해석 방법(문법 규칙을 클래스로 표현)
 Iterator  집합 객체 요소들의 접근 방법 및 순회 방법(컬렉션 처리, 순차처리)
 Mediator  어떤 객체들이 어떻게 상호작용하는지?(분산처리)
 Memento  언제 어떤 정보를 객체의 외부에 저장하는지?(history, snapshot, save파일)
 Observer

 다른 객체에 종속적인 객체 수(1:N)

 종속적인 객체들의 상태 변경 방법(모델과 뷰의 관계)

 State  객체의 상태
 Strategy  알고리즘 교체(동적인 교체)
 Template Method  알고리즘의 단계(상위:처리의 흐름, 하위:처리의 세부내용)
 Visitor  클래스의 변경없이 객체에 적용할 수 있는 연산(순차가 아닌 특정 로직형태로 처리)
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License

'패턴 > 디자인패턴' 카테고리의 다른 글

생성패턴  (0) 2009/12/04
디자인 패턴 사용 방법  (0) 2009/12/04
디자인 패턴 관계도  (0) 2009/12/03
디자인 패턴이란?  (0) 2009/12/03
Posted by 스쿨쥐
2009/12/03 20:03

디자인 패턴 관계도 패턴/디자인패턴2009/12/03 20:03

GoF 디자인 패턴의 관계도입니다. 패턴을 한번 적용하면 끝나는 것이 아니라 요구사항이 변함에 따라 다른 해결책을 모색해야할 때가 있습니다. 그러한 결정을 내릴 때 도움이 되는 관계도입니다. 

예를들어 관계도 가장 아래쪽에 있는 Facade 패턴을 적용했다고 합시다. 하지만 이 Facade의 구현체가 반드시 하나의 인스턴스를 통해서 제공되어야 한다면 어떻게 해야할까요? 그럴때 Singleton 패턴을 적용하는 것입니다. 

이와같이 패턴은 서로간의 관계를 가지고 있습니다. 이 그림이 그러한 판단을 내리는 데 도움이 됩니다. ^^


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License

'패턴 > 디자인패턴' 카테고리의 다른 글

생성패턴  (0) 2009/12/04
디자인 패턴 사용 방법  (0) 2009/12/04
디자인 패턴 관계도  (0) 2009/12/03
디자인 패턴이란?  (0) 2009/12/03
Posted by 스쿨쥐