최상단 광고

2012년 4월 18일 수요일

물리1 - 힘과 관성력 기본공식


1.F=ma
(F의 힘을가했을때 m의질량을 가진물체는 a만큼의 가속도를 받는다)
음.. 이해를 돕자면 m의질량을 가진물체가 a의가속도로 무언가를 들이받았을때 가해진힘이 F라고보면됩니다, 작용반작용에 법칙에의해서 가해진힘이F인만큼 돌아온힘도 F입니다.
(들이받혀진 물체는 m의 질량을 가진 물체가 F의 힘을 가했기에 F의 힘을 받았습니다)

*왜 F=mv가 아니라 "F=ma"냐면, F=ma라는 공식은 얼마나 힘을주어야 m의 질량을 가진물체를 a만큼 가속시킬수있을까를 알기위해 만들어진 식이기 때문입니다. 정확히말하자면 "일정한 힘을가했을때 m의 질량을 가진 물체는 a만큼의 가속도를 받는다" 가되겠죠.

*물론 위 식에서 가속도(a)는 F에 비례하고 m에는 반비례한다는것도 알수있습니다
(F가 고정됬을떄 m이증가하면 a는감소하죠,그러므로 반비례하지만 m이고정됬을떄F가증가하면 a도 증가하기때문에 F와a는 비례합니다)

2.F=-ma
(관성력입니다. 한방향으로 F의 힘이가해졌다면 작용반작용의 법칙으로인해서 반대쪽으로도 같은힘 F가 가해집니다(반대방향으로 작용하니까 가속도에 -값이 붙어서 -ma인거죠))


[직접설명] 관성력은 버스와 탑승객이 "붙어있기때문에" 또는 "접촉해있기때문에" 발생합니다.
더불어서 달려가다가 갑자기멈췄을때 몸이앞으로쏠리는것도 온몸이 동시에멈추지않고 다리부터 멈추기때문에 발생합니다(좀 잔인하지만 표현하자면 상체와 하체가 붙어있기떄문에 발생합니다), 더 정확한 이유는 "힘의 전달"이 바로 관성의 원인입니다. 버스가 앞으로 이동함에따라 가장먼저 우리몸에 그 힘이 도달하는부위는 다리입니다. 그리고 상체로올라가죠, 따라서 다리가 상체보다 더빨리 힘의 영향을받게되고 상체는 가만히있는데 다리는 앞쪽으로 이동하므로(버스와같이) 상체보다 하체또는 다리가 먼저 앞쪽으로 나아가는원리로 우리의 몸이기울어지는겁니다. 급정거도 역시 같은원리입니다.
정말 간단한원리죠! "물체가 기존의 운동상태를 유지하려는 성질이 있기때문에"라는 말은 개소립니다, 그딴말 무시하세요. 아마 학교에서도 일부 선생님들은 그따위로 가르칠겁니다. 옛날시대에 파동이란 개념이 거의없을때에나 말하던 수준입니다. 사실 관성력이란 힘은 존재하지않습니다. 단지 각부위가 동시에이동하지않고 힘을 먼저받은부위가 더 빨리 움직이니까 기울어지거나 밀려지면서 마치 특정부위에 힘을받은것같이 되는거죠, 그래서 관성력이 가상의힘인겁니다(실제 작용하는힘이아니죠)  

따라서  처음 맞닿아있는부분에 도달하는 힘이 F일때 제일 윗부분은 힘이 작용하고있지않기때문에 우리는 F 만큼의 힘을 거꾸로 받은듯한 느낌을 받는착각을 가지게되는데 그게바로 가상의힘인 관성력 "F"를 의미합니다.
 


[14일 - 내용추가]
이해하기쉽게 그림을 하나 올립니다.
h1이 h2보다 먼저 힘을받으니 h2에는 힘이작용하지않는데 h1만 버스와같이 앞으로이동해버리니 h2는그대로인채 h1(하체)가 앞으로가니 마치 몸이 뒤로기울어지는것처럼 느껴지는거죠(사실은 하체가 앞으로이동한겁니다)

*물리를 선택하신분치고 파동을 전혀모르시는분은 없다고믿겠습니다(전혀 모르시면 솔직하게 말해서 물리 포기하세요..)

어차피 파동의 제대로된 개념은 후에 다루게됩니다..다만 파동에대한 그림이 머릿속으로 그려지지않거나 그냥 파동이뭔지모르시는분들을 일컷는겁니다..(상상력이없는거죠... 아니면 과학에대한 열정이없는데 물리를 택한 신기한분이던가)



<이쯤에서 마치겠습니다>
*작용-반작용의 법칙같은 말로 형용가능한 간단한 개념들은 교과서만 한번읽어보셔도 납득됩니다.
(굳이 원리를 증명할필요도 없다고봅니다..)
*그래프개념은 외울필요없습니다,순간 가속도도 결국엔 시간-속력그래프에서 속력을 가속도로바꾼것뿐이고 (사실 이론이라기보단 말장난이죠) 공식이해 제대로한분들은 그래프 보고 기울기가 뭘의미하는지, 넓이가 무엇을의미하는지 다 딱보고 알아보니까요.
*힘의합성은 수직항력파트에서 다시 응용됩니다(원리증명)

ps.대각선의 길이(합력)구하는법까지 아실필요는없어요(물리2에서 어차피 나오니까요)
ps2.힘과 관성력에 관련된 문제들은 개념을 완벽하게 이해했다면 스스로 고민해서 푸는데
        전혀 지장이없습니다!(푸는데 어려움을 느끼신다면 이해가 덜된거에요..)

물리1 - 속력과 속도구분,그리고 부가개념


물리1의 1단원인 속도와 가속도를 들어가기전에 앞서서 기본적으로 알아둬야할 "개념"들이 있는데
이 개념들은 우리가 중고등학교에서 무조건 시험을 잘보기위해서 "공식따위를 외우는것"과는 다르게 너무 당연하게 외우고있어야하는 "과학자들사이에서의 또는 학문에서의 하나의 약속"이므로 알아두지않으면 정작 중요한 본래 내용을 이해하지못하게되므로 꼭 알아둬야 한다.
───────────────────────────────────
1.스칼라와 벡터
스칼라:크기만을 나타내는 물리량 (이동거리,속력,시간,일,에너지 등)
벡터:크기와 방향을 함께 나타내는 물리량(변위,속도,가속도,힘,운동량,충격량 등)

※벡터나 스칼라를 표기하는 기호와 관련해서는 후에 물리2에서 자세하게 다루게됩니다.
물리1에서는 그렇게 크게 응용되거나 사용되지않기 때문입니다.

2.이동 거리와 변위의 크기

①운동 방향이 변하지않는 직선 운동을 할 때: 이동거리 = 변위의 크기

※이동경로는 시작지점과 끝지점이 이어진 직선이 될테니 변위(직선의길이)=이동거리(직선의길이)가 되겠죠.

②운동 방향이 변하는 운동을 할 때 : 이동거리>변위의크기

※이동경로가 시작지점으로부터 끝지점까지 직선을 이루지않고  그 길이나 경로에 변화가있을테니까
변위의크기(첫지점부터 끝지점까지의 거리)가 전체 이동거리보다 무조건 짧아질수밖에없겠죠

3.순간 속력(속도)
일반적으로 속력(속도)라고 할 때는 순간 속력(속도)을 나타낸다.

4.속도의부호
속도의 부호는 운동방향을 나타낸다. 직선 운동에서 한쪽 운동방향을 (+)로 표시하면,반대쪽 운동방향은(-)로 나타낸다.

※ (+)로 표시한 방향을 기준으로 함으로써 (+)라고 표시된쪽을 바라보는 상태로 뒤로 이동한다는 의미가되는것이지(후진), A가 만약 그 반대방향을 "바라보고"이동한다면 그 운동방향은 (-)로 표시하지않고 "~라는 방향으로 ~(+값)의 속도로 움직인다"가 되야합니다. 더 쉽게 요약하자면 음수의 속도가 나올때에는 어느 한방향을 바라보고 "뒤로"가고 있다는소리가됩니다. 

───────────────────────────────────

A.속력과 속도

1.이동 거리와 변위
①이동 거리 : 물체가 실제로 이동한 경로의 총 길이
②변위(위치 변화량) : 물체의 이동 경로와는 무관하게 처음 시작지점부터 끝시작지점을 직선으로 연결한 길이와 그 방향 

2.속력과 속도
①속력: 물체의 빠르기를 나타내는 물리량, 단위 시간 동안의 이동거리
※크기만을 나타내므로 스칼라 값입니다.

-속력 공식-
v= velocity : 속력  , t= time : 시간 , s=space : 거리

평균 속력 : 어느 시간 동안의 평균적인 빠르기, 운동 도중의 속력 변화는 무시한다.

※v위에 직선을 보실수있는데 평균 속력은 크기만을 가지므로 스칼라값이죠, 그런데 왜 직선이 그어져있냐고 의문을 가질수있는데 직선은 그냥 평균이라는 소리지 일정한 스칼라,벡터를 나누는 기준이되는 기호는아닙니다.

순간 속력 : 어느 한 순간의 속력 

※거리-시간 그래프에서 두 점을 잇는 직선의 기울기 = 평균 속력
                        (두 점이 가지는 두 점 사이의 시간동안에 속력의 평균값을 의미)
                             한 점에서 그은 접선의 기울기 = 순간속력
                     (한점의 기울기가 그 한점이 가지는 시간값동안의 속력을 의미)

②속도 : 물체의 운동방향과 빠르기를 함께 나타내는 물리량, 단위 시간 동안의 변위
※크기와 방향이 같이 존재하므로 벡터물리값입니다.


평균 속도 : 어느 시간 동안의 평균적인 속도, 운동 도중의 속도 변화는 무시한다.
※"평균값"이지만 v위에 직선을 그을수가없기에 (벡터 물리값이기때문에 기존에 가지고있는기호가있죠) 원래의 기호를 유지합니다.
순간 속도 : 어느 한 순간의 속도 

※위치-시간 그래프에서 한 점에서 그은 접선의 기울기=순간 속도
        (시간분의 거리(위치)= 속도(속력))->한 점이 가지는 한 시점(시간)의 속도=순간속도
                              두 점을 잇는 직선의 기울기=평균 속도
   (시간분의 거리(위치)= 속도(속력))-> 두점사이의 속력= 두 점이 가지는 시간사이의 평균속도        
                                                                      


사실 혼자서 공부한분들이라면 모두 공식을 나름대로 해석하다보니 자연스래 외워지고 다 아실만한 "기초"내용들입니다, 근데 물리1을 처음접하는분들중에 물리학과와는 상관없이 그저 내신성적을 위해서 공부하는분들은 물리1에 그렇게 이해하려 시간투자하고 그러지않잖아요, 그래서 일일이 해석해드린겁니다(하나하나 무슨의민지,어떤원리인지)            

물리1 - 속도와 가속도 기본공식


.속력(Velocity-v)=거리(Space-s)/시간(Time-t)
 
이 식만 외우면 속력이나 시간,거리 공식 세가지를 전부 알고있는셈입니다만
초등학생때 과학을전공해서 학원을 운영하시던(-_-) 훌룡한 선생님이 알려준 그림이 더 편합니다.
  바로 , 이 그림입니다! 초등학교 다닐때 과학시간에 이걸로 문제풀었었죠!
1-2. "속력과 속도는 다른개념입니다"-추가내용(필요할거같더군요)
속도란 개념은 학교수업이나 잠깐의 탐구로 알수있는내용이지만 굳이 설명하겠습니다.
속력은 "단위시간동안(일정시간동안) 이동한거리를 속력이라합니다"
이때 이동한거리는 말그대로 우리가 이리갔다 저리갔다 이동한거리를 다합친값입니다.

"속도=변위/시간"

이때 "변위"는 처음에있었던지점에서 최종지점을 선으로 그었을떄 그 길이(거리)와 방향을 의미합니다. 이것은 과학자들사이에서의 약속이며, 어떤 유도가있다기보단 변위라는값의 의미가 그러합니다.
한마디로 속도는 일정시간동안 정확히 첫지점부터 "얼마나 멀리가느냐"가 중점인거죠.

※속력은 Am/s로 그 크기만 서술해주면되지만 변위가 방향성을 가지는 벡터물리량이듯이
속도도 벡터물리량입니다 ~의 방향으로 ~ m/s라고 정확히 방향과 크기를 둘다서술해야합니다.

1-3. 순간속도 평균속도

평균속도=거리-시간그래프에서 두 시점에서의 두 속도(속도=기울기=거리/시간) 를 점찍었고 직선으로 이었을때, 그 이어진 직선의 기울기가 평균속도가됩니다(두시간사이의)

반면 순간속도는 그래프에 나타난 "실제한순간의 이동속도"의 한시점의 기울기가 됩니다.
(그러니까 속도를 의미하는 직선이든 곡선이든 함수그림위에 어느한시점의 속도를 딱 점찍었을때 그 점의 접선의 기울기가 순간속도가되는거죠)

평균속력과 순간속력은 위에서 속도를 속력으로고쳐주면됩니다.




*물체가 등속도운동을 할때에 물체의 이동거리는 "s=vt"

*거리-시간,속력-거리등등 모든 그래프는 나타내지않았습니다(사실 공식만알고있다면 기울기가뭔지 넓이가뭔지 유추하는게 가능하기때문이죠)
 

2.가속도(Acceleration-a)=걸린시간(Time-t)/속도변화량(V²-V¹)
=일정시간동안 얼마의 속력이 변화헀는가.그리고 그 속력변화량이 바로 가속도입니다
(그렇기 때문에 나중속도에서 처음속도를 뺀값=속도변화량=가속도입니다)

3.등가속도 직선운동(가속도가 일정한 직선운동, 일정하게 증가하거나,일정하게감소)
*그래프는 당연히 기울기가 계속증가하거나 계속감소하겠죠

사실 굳이 해석하자면 별로 어려운 식이아닙니다(개인적으로 물리1에 등장하는 식중 파동파트를 제외하면 어려운공식은 없습니다.. 진짜 어려운공식은 대학교들어가서 슈뢰딩거의 파동방정식이나 움직임을 방정식으로 나타낸 그런 공식들이 진짜 어려운식이고 물리의 진짜세계죠ㅋㅋ)

[v=v₁+at]
v는 현재의 속력을 의미하는데 현재의 속력은 처음속력에 일정한 가속도가 가해진 상태이지않겠습니까? 그리고 "현재"라는게 처음으로부터 얼마만큼의 시간이 경과했는지는 고정된값이아니죠,따라서 at는 일정한 등가속도가 가해지기 시작한지 얼마만큼의 시간이 지났다를 의미합니다. 예로들어서 애초에 지금이 등가속도운동을 막 시작한 시점이라면 t에 0이 대입되서 v=v₁이겠죠.

[s=v₁t+½at²]
s는 space란 단어의 약자로 이동거리를 의미합니다.
"이동거리=처음속도만 존재했다면 이동했을거리+등가속도에의해서 더 이동한거리"
가되는것이죠, 처음속도로의 이동거리는 v₁이 되겠고 ½at²이 등가속도에의해서 더 이동한거리가 됩니다만, 단순히 저 식만가주고는 왜 "½at²" 가 나오는지를 이해하지못합니다(왜냐하면 그래프에서 유추된 공식이기때문이죠) 그래서 저는 그래프로 증명해보이겠습니다.
 
 (1)먼저 우리는 이동거리를 구할것이기때문에 s=vt를이용해서 y축은 v값을, x축은 t값을 가지는 그래프를 그립니다(x축이 v값이고 y축의 t값이어도 되긴합니다만, 시간의 흐름에따른 속도값,이동거리를 보는 그래프이기때문에 시간이 x축에있는게 보기편하겠죠,그래서 x축에 t값을 두는겁니다)
 
 (2)자, 이동거리는 처음속도로 이동한거리+ 더해진속도만큼 이동한거리 이기때문에
 처음속도인 v₁을 먼저 표기할껍니다.그리고 v₁의 속력에 일정한 가속도가 계속 가해지기때문에 (감소하는 가속도로 그려도상관없습니다,중요한건이해!) v₁점점 속력이 증가하는 그래프가 그려지겠죠.
 
 (3) 자, 그리고 어느한시점을 t로 잡습니다, 그리고 현재 속도를 나타내게끔 위로 그어줍니다
 (4) 처음속도와 t시점의 속도의 차이가 바로 t초동안 증가하거나 감소한 속력, 즉 at 겠죠 ㅎ
  
 자 이제 그림은 완성했습니다, 이제 생각해봅시다.
 우리는 s(이동거리)를 구하려고하고 s=vt라는 공식에 의해서 그래프에서 이동거리는
 t시점까지의 그래프값의 면적, 또는 도형의 넓이가 됩니다.
 그리고 도형의넓이는 직사각형의넓이+삼각형부분의 넓이=v₁t+½at²가되죠.
도형의넓이는 = s(Space=이동거리)이므로 s=v₁t+½at² 라는 식이 유도된겁니다!

[2as=V²₂-V²₁]
이 식은 위 두가지식을 연립시켜서 만들어진 식입니다.
귀찮으니(왜요?오래걸린다고요!) 수식을 이용해서 만들어보이겠습니다.

   


여기서부터는 그냥 두번쨰식에 대입만하고 2as만 한쪽으로 옮겨주면 공식이 완성됩니다.ㅋ 

여러분, 수식편집기는 정말 좋습니다. 이런 차칸기능이있다니.. 아아 고맙다..


ps.속도와 가속도에 관련된 문제들은 두가지유형이 있다고볼수있습니다(크게)
가속도 공식을 이용해서 식끼리 어찌어찌해서 값을구해서 푼다던가, 순수하게 방향에따라
속도가 더해지고 가해지고를 이용해서 맞는답을 고르는문제정도가 있습니다.
(물론 문제에 그래프가 나타나는경우가 많은데, 그래프를 스스로 해석할줄아셔야합니다)

2012년 4월 17일 화요일

[Chapter 7] 생성패턴 총 정리

▶ 시스템이 생성하는 객체의 클래스로 시스템을 매개변수화하는 일반적인 방법은 두가지가 있습니다.
1) 객체를 생성하는 클래스를 상속해서 서브클래스를 만드는 방법   <팩토리 메서드>
2) 객체 합성으로 시스템을 매개변수화하는 방법                          <추상 팩토리, 빌더, 원형 패턴>
-> 제품 객체를 생성하는 책임을 갖고 있는 새로운 "팩토리 객체"를 만듭니다.

▶ "그리기 편집기 프레임워크" 를 통해 알아보자.
그리기 편집기 프레임워크는 GraphicTool이 제품 클래스로 매개변수화되는 다양한 방법을 보여준다.

>> 팩토리 메서드를 적용하여, 팔레트에 Graphic의 서브클래스 각각에 대해 GraphicTool의 서브클래스를 생성합니다. GraphicTool은 NewGraphic() 연산은 갖는데, 이 연산은 각 GraphicTool 서브클래스가 재정의합니다.
>> 추상 팩토리 패턴을 적용한 결과, 여러 GraphicFactory의 클래스 계통이 만들어집니다. 클래스 계통은 Graphic 서브클래스 별로 한 개씩입니다. 이때, 각 팩토리는 단지 하나의 제품만을 생성합니다. 예) CircleFactory는 circle, LinFactory는 line을...
>> 원형 패턴을 적용하면 각 Graphic의 서브클래스가 Clone() 연산을 구현하며, GraphicTool은 그것이 생성하는 Graphic의 원형으로 매개변수화 됩니다.


▶ 정리하기
: 팩토리 메서드는 설계를 사용자가 입맛에 맞게 고칠 수 있도록 해 주면서 그 설계가 복잡해지지 않게 합니다. 다른 디자인 패턴은 새로운 클래스가 필요한 반면, 팩토리 메서드 패턴에서는 새로운 연산만 정의하면 됩니다. 개발자들은 객체를 생성하는 표준 방식으로 팩토리 메서드를 자주 사용하고는 합니다. 그러나 인스턴스화 할 클래스가 변하지 않거나 초기화 연산처럼 서브클래스들이 쉽게 재정의 할 수 있는 연산에서 인스턴스화가 된다면 상속으로도 쉽게 해결할 수 있으므로 이때는 꼭 팩토리 메서드를 사용할  필요는 없습니다.
: 추상 팩토리, 원형 또는 빌더 패턴을 사용하는 설계는 팩토리 메서드를 사용하는 설계보다 더 유연할 때가 많습니다. 팩토리 매서드를 사용해서 시작한 설계에 좀 더 유연성을 부가 할 필요가 있다면 다른 생성 패턴을 사용하는 설계로 진화합니다.

[Chapter6] 생성 패턴 - 단일체

1. 단일체(Singleton) 패턴이란?
오직 한 개의 클래스 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공합니다. 클래스 자신이 자기의 유일한 인스턴스로 접근하는 방법입니다.
ex) 프린터 스풀, 윈도우 관리자 등.


2. 단일체 패턴은 언제 사용되는가?
- 클래스의 인스턴스가 오직 하나여야 함을 보장하고, 잘 정의된 접근점으로 모든 사용자가 접근할 수 있도록 해야 할 때
- 유일한 인스턴스가 서브클래싱으로 확장되어야 하며, 사용자는 코드의 수정 업이 확장된 서브클래스의 인스턴스를 사용할 수 있어야 할 때


3. 단일체 패턴의 다이어그램


☆ Singleton
: Instance() 연산을 정의하여, 유일한 인스턴스로 접근할 수 있도록 합니다.
  Instance() 연산은 클래스 연산입니다. 유일한 인스턴스를 생성하는 책임을 맡습니다.

4. 단일체 패턴을 쓰면...
1) 유일하게 존재하는 인스턴스로의 접근을 통제합니다.
: Singleton 클래스 자체가 인스턴스를 캡슐화하기 때문에, 이 클래스에서 사용자가 언제, 어떻게 이 인스턴스에 접근 할 수 있는지 제어 할 수 있습니다.

2) 네임스페이스를 좁힙니다.
단일체 패턴은 전역 변수보다 더 좋습니다. 전역 변수를 사용해서 네임스페이스를 망치는 일을 없애주기 때문입니다. 즉, 전역 변수를 정의하여 발생하는 디버깅의 어려움 등 문제를 없앱니다.

3) 연산 및 표현의 정체를 허용합니다.
: Singleton 클래스는 상속될 수 있기 때문에, 이 상속된 서브클래스를 통해서 새로운 인스턴스를 만들 수 있습니다. 또한 이 패턴을 사용하면, 런타임에 필요한 클래스의 인스턴스를 써서 응요프로그램을 구성할 수도 있습니다.

4) 인스턴스의 개수를 변경하기가 자유롭습니다.
: 마음이 바뀌어서 Singleton 클래스의 인스턴스가 하나 이상 존재할 수 있도록 변경해야 할 때도 있는데, 이 작업도 어렵지 않습니다. 게다가, 응용프로그램이 사용하는 인스턴스가 다수여야 할 때도 똑같은 방법을 쓸 수 있습니다.
  즉, Singleton 클래스의 인스턴스에 접근할 수 있는 허용 범위를 결정하는 연산만 변경하면 됩니다. 왜냐하면 기존에는 하나의 인스턴스로만 접근을 허용했다면, 이제는 여러 개의 인스턴스를 생성해서 그 각각의 인스턴스로 접근할 수 있도록 연산의 구현을 바꾸면 되기 때문입니다.

5) 클래스 연산을 사용하는 것보다 훨씬 유연한 방법입니다.
: 단일체 패턴과 동일한 기능을 발휘하는 방법이 클래스 연산을 사용하는 것입니다. 그러나 이 두 언어(C++, 스몰토크)에서 클래스의 인스턴스가 하나 이상 존재할 수 있도록 설계를 변경하는 것은 어려습니다.


cf) 구현방법 中
: 단일체에 대한 레지스트리를 사용하는 것입니다. Instance() 연산에 가능한 Singleton 클래스 집합을 정의하는 대신에 Singleton 클래스는 이 단일체 인스턴스를 레지스트리에 이름을 갖는 인스턴스로 등록합니다.
  레지스트리는 문자열로 정의된 이름을 해당 단일체 인스턴스로 대응시켜 둡니다. Instance() 연산에서 단일체가 필요할 때 레지스트리를 뒤져서 이름으로 해당 단일체를 찾아달라고 의뢰하면 레지스트리는 해당하는 단일체를 찾아서 돌려주는 것입니다. 이런 방식을 취하면 Instance() 연산이 모든 달일체 클래스와 인스턴스를 알 필요가 업습니다.

[Chapter5] 생성 패턴 - 원형(프로토타입)

1. 원형(프토로타입) 패턴이란?
  프로토타입 패턴(prototype pattern)은 생성할 객체들의 타입이 프로토타입인 인스턴스로부터 결정되도록 하며, 인스턴스는 새 객체를 만들기 위해 자신을 복제(clone)하게 된다. 프로토타입 패턴은 추상 팩토리 패턴과는 반대로, 클라이언트 응용 프로그램 코드 내에서 객체 창조자(creator)를 서브클래스(subclass)하는 것을 피할 수 있게 해준다.  프로토타입 패턴은 새로운 객체는 일반적인 방법(예를 들어, new를 사용해서라든지)으로 객체를 생성(create)하는 고유의 비용이 주어진 응용 프로그램 상황에 있어서 불가피하게 매우 클 때, 이 비용을 감내하지 않을 수 있게 해준다. 패턴을 구현하려면, 우선 clone() 메소드를 선언하는 추상 베이스 클래스를 하나 만든다. 다형적 생성자(polymorphic constructor) 기능이 필요한 클래스가 있다면, 그것을 앞에서 만든 클래스를 상속받게 한 후, clone() 메소드 내의 코드를 구현한다.


2. 원형 패턴은 언제 사용되는가?
제품의 생성, 복합, 표현 방법에 독립적인 제품을 만들고자 할 때
- 어떤 클래스의 인스턴스를 만드는 것이 자원/시간을 많이 잡아먹거나 복잡 할 때
- 모두 클래스로 만들기에는 종류가 너무 많은 경우
인스턴스 생성이 어려운 경우(인스턴스화할 클래스를 런타임에 지정할 때, 동적 로딩)- framework와 생성하는 인스턴스를 분리하고 싶은 경우
- 제품 클래스 계통과 병렬적으로 만드는 팩토리 클래스를 피하고 싶을 때
클래스의 인스턴스들이 서로 다른 상태 조합 중에 어느 하나일 때
미리 원형으로 초기화해 두고, 나중에 이를 복제해서 사용하는 것이 매번 필요한 상태 조합의 값들을 수동적으로 초기화하는 것보다 편리 할 수도 있습니다.


3. 원형 패턴의 다이어그램



☆ Prototype
:  자신을 복제하는 데 필요한 인터페이스를 정의합니다.

☆ ConcretePrototype
: 자신을 복제하는 연산을 구현합니다.

☆ Client
: 원형에 자기 자신의 복제를 요청하여 새로운 객체를 생성합니다.


4. 원형 패턴을 쓰면..
1) 런타임에 새로운 제품을 추가하고 삭제할 수 있습니다.
: 원형 패턴을 이용하면 사용자에게 원형으로 생성되는 인스턴스를 등록하는 것만으로도 시스템에 새로운 제품 클래스르 추가할 수 있게 됩니다. 런타임에 새로운 원형을 넣고 빼기가 쉽다는 접에서 다른 생성 패턴에 비해 유연성을 지니고 있습니다.

2) 값들을 다양화함으로써 새로운 객체를 명세합니다.
: 고도로 동적화된 시스템에서는 새로운 클래스를 생성할 필요 없이 객체 합성으로 새로운 행동을 정의할 수 있습니다. 객체의 변수가 다른 클래스에 대한 참조자를 정의하고 있다면, 이 참조자가 합성한 새로운 클래스만 정의하고, 그 클래스에 인스턴스에 대한 참조자만을 넘겨주면, 새로운 행동이 정의되는 것처럼 보인다는 것입니다.

3) 구조를 다양화함으로써 새로운 객체를 명세할 수 있습니다.
: 많은 응용프로그램은 구성요소와 부분 구성요소의 복합을 통해 객체를 구축합니다. 예를 들어, 회로설계를 위한 편집기는 세부 회로를 모아서 큰 회로를 만듭니다. 이런 응용프로그램에서는 편의를 위한 복잡한 사용자 정의 구조를 사용자가 인스턴스화 하여 그 상황에 맞는 세부 회로를 계속 이용할 수 있도록 배려해 줄 때가 많습니다. 복합 회로 객체가 Clone() 연산을 구현함으로써 다른 구조를 갖는 회로의 기본 골격을 만듭니다.

4) 서브클래스의 수를 줄입니다.
: 팩토리 메서드를 보면 Creator 클래스의 계통이 처리할 제품 관련 클래스의 계통과 병렬로 복합되는 것을 알 수 있습니다. 원형 패턴에서는 팩토리 메서드에 새로원 객체를 만들어 달라고 요청하는 것이 아니라 원형을 복제하는 것으로, Creator 클래스에 따른 새로운 상속 계층이 필요 없습니다.

5) 동적으로 클래스에 따라 응용프로그램을 설정할 수 있습니다.
: 몇몇 런타임 환경에서는 동적으로 클래스들을 응용프로그램으로 등록할 수 있도록 해 줍니다. 동적으로 로드된 클래스의 인스턴스를 생성하고 싶은 응용프로그램은 정적으로 그 클래스이 생성자를 참조할 수 없습니다. 그 대신 런타임 환경이 그 클래스의 인스턴스를 자동으로 생성하고 원형 관리자에게 등록합니다. 그러면 응용프로그램은 이 원형 관리자에게서 필요한 클래스의 인스턴스를 얻게 됩니다.


§ 관련 패턴 §
: 원형 패턴과 추상 팩토리 패턴은 어떤 면에서는 경쟁적인 관계입니다. 하지만 함게 사용 될 수도 있습니다. 추상 팩토리 패턴은 원형 집합을 저장하다가 필요할 때 복제하여 제픔 객체를 반환하도록 사용할 수 도 있습니다. 만약 복합체 패턴과 장식자 패턴을 많이 사용해야 하는 설계에서 원형 패턴을 쓰면 종종 재미를 볼 수 있습니다.

[Chapter4] 생성 패턴 - 빌더

1. 빌더(Builder) 패턴이란?
  빌더 패턴이란 복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공할 수 있도록 합니다. 하나의 소스객체에 복잡한 여러개의 객체를 만들 수 있도록 하는 패턴으로 소스 객체는 복잡한 객체를 생성하기 위한 기능을 여러 부분으로 제공합니다.
  즉, 객체를 구성하는 부분을 먼저 생성하고, 이를 조합함으로써 전체 객체를 생성하기 때문에 생성할 객체가 손 쉽게 추가, 확장 가능하게 된다.


2. 빌더는 언제 사용되나?
- 복합 객체의 생성 알고리즘이 이를 합성하는 요소 객체들이 무엇인지 이들의 조립 방법에 독립적일 때
- 합성할 객체들의 표현이 서로 다르더라도 생성 절차에서 이를 지원해야 할 때

§ 예시 - 세트메뉴 서빙 §
  에피타이저 - 메인 - 디저트" 순으로 음식이 제공된다.
  에피타이저 종류는 ○○ 샐러드, ☆☆ 샐러드, □□ 샐러드 ... 가 있고, 메인 메뉴는 ●● 스테이크, ★★ 스테이크, ◆◆ 스테이크 ...가 있다. 마지막 디저트로는 △△ 아이스크림, ♡♡ 아이스크림, ♧♧ 아이스크림 ... 이 있다.
  손님이 원하는 종류는 선택해서 먹을 수 있다. 이처럼 세트 메뉴를 에피타이저 -> 메인 -> 디저트 순으로 음식이 나오지만 그 결과가 달라진다. 이때 bulider 패턴을 사용한다.


3. 빌더 패턴의 다이어그램 
▲ 구조 다이어그램

▲ 상호작용 다이어그램

☆ Builder
: Product 객체의 일부 요소들을 생성하기 위한 추상 인터페이스를 정의합니다.

☆ ConcreteBuilder
: Builder 클래스에 정의된 인퍼페이스를 구현하며, 제품의 부품들을 모아 빌더를 복합니다. 생성한 요소의 표현을 정의하고 관리합니다. 또한 제품을 검색하는데 필요한 인터페이스를 제공합니다.
: 제품의 내부 표현을 구축하고 복합 객체가 어떻게 구성되는지에 관한 절차를 정의합니다.
: 구상 빌더에서는 실제 제품을 만들어서 Product라는 복합 구조에 집어 넣습니다.

☆ Director (Client)
: Builder 인터페이스를 사용하는 객체를 합성합니다.

☆ Product
 : 생성할 복합 객체를 표현합니다.




4. 빌터 패턴을 쓰면....
1) 제품에 대한 내부 표현을 다양하게 변화할 수 있습니다.
  Builder 객체는 디렉터를 제공하고 제품을 복합하기 위해 필요한 추상 인터페이스를 정의합니다. 빌더를 사용하면 제품이 어떤 요소에서 복합되는지, 그리고 각 요소들의 표현 방법이 무엇인지 가릴 수 있게 됩니다. 즉, 어떤 요소로 전체 제품을 복합하고 그 요소들이 어떤 타입들로 구현되는지 알고 있는 쪽은 빌더뿐입니다. 제품을 복합할 때는 빌더에 정의된 추상 인터페이스를 통해 사용자가 동작하기 때문에, 새로운 제품의 표현 방법이나 제품의 복합 방법이 바뀔 때 추상 인터페이스를 정의한 Builder 클래스에서 상속을 통해 새로운 서브클래스를 정의하면 됩니다.

2) 생성과 표현에 필요한 코드를 분리합니다.
  빌더 패턴을 사용하면, 복합 객체를 생성하고 복합 객체의 내부 표현 방법을 별도의 모듈로 정의 할 수 있습니다. 사용자는 제품의 내부 구조를 정의한 클래스는 전혀 모른 채, 빌더와 상호작용을 통해서 필요한 복합 객체를 생성하게 됩니다. 왜냐하면, 이러한 제품 구조에 대한 상세한 정의를 담은 클래스는 클래스에 정의된 어떤 연산의 매개변수로도 정의되지 않기 때문입니다.

3) 복합 객체를 생성하는 절차를 좀 더 세밀하게 나눌 수 있습니다.
  한 번에 복합 객체를 생성하는 것 처럼, 빌더 패턴은 디렉터의 통제 아래 하나의 내부 구성요소들을 만들어 나갑니다. 디렉터가 빌더에서 만든 전체 복합 객체를 되돌려받을 때까지 제품 복합의 과정은 계속됩니다.

4) 클라이언트에서는 추상 인터페이스만 볼 수 있기 때문에 제품은 구현한 코드를 쉽게 바꿀 수 있습니다. 또한 제품의 내부 구조를 보호 할 수 있습니다.

5) 팩토리를 사용하는 경우에 비해 객체를 만들기 위해서 클라이언트에 대해 더 많이 알아야 합니다.

cf) 관련패턴
: 복잡한 객체를 생성할 때 추상 팩토리 패턴은 빌더 패턴과 비슷한 모습을 보입니다. 근복적인 차이가 있다면 빌더 패턴은 복잡한 객체의 단계별 생성에 중점을 둔 반면, 추상 팩토리 패턴은 제품의 유사군들이 존재할 때 유연한 설계에 중점을 둔다는 것입니다. 빌더 패턴은 생성의 마지막 단계에서 생성한 제품을 반환하는 반면, 추상 팩토리 패턴에서는 만드는 즉시 제품을 반환합니다. 추상 팩토리 패턴에서 만드는 제품은 꼭 모여야만 의미 있는 것이 아니라 하나만으로도 의미기 있기 때문입니다.