CS/λ””μžμΈ νŒ¨ν„΄ 10

[λ””μžμΈ νŒ¨ν„΄] ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„

ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ΄λž€ ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ ν”„λ‘œκ·Έλž˜λ°μ˜ 관점을 κ°–κ²Œ ν•΄μ£ΌλŠ” 역할을 ν•˜λŠ” 개발 방법둠이닀. 예λ₯Ό λ“€μ–΄, 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ΄ ν”„λ‘œκ·Έλž¨μ„ μƒν˜Έ μž‘μš©ν•˜λŠ” κ°μ²΄λ“€μ˜ μ§‘ν•©μœΌλ‘œ λ³Ό 수 있게 ν•˜λŠ” λ°˜λ©΄μ—, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ μƒνƒœ 값을 μ§€λ‹ˆμ§€ μ•Šμ€ ν•¨μˆ˜ κ°’λ“€μ˜ μ—°μ†μœΌλ‘œ λ³Ό 수 있게 ν•œλ‹€. ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ€ 크게 μ„ μ–Έν˜•κ³Ό λͺ…λ Ήν˜•μœΌλ‘œ λ‚˜λ‰˜κ³ , μ„ μ–Έν˜•μ€ ν•¨μˆ˜ν˜•μ΄λΌλŠ” ν•˜μœ„ κ°œλ…μ„ κ°€μ§€λ©°, λͺ…λ Ήν˜•μ€ 객체 μ§€ν–₯ν˜•κ³Ό 절차 μ§€ν–₯ν˜•μœΌλ‘œ λ‚˜λ‰œλ‹€. μ„ μ–Έν˜•κ³Ό ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°(declarative programming)은 '무엇을' ν’€μ–΄λ‚΄λŠ”κ°€μ— μ§‘μ€‘ν•˜λŠ” νŒ¨λŸ¬λ‹€μž„μ΄λ‹€. 예λ₯Ό λ“€μ–΄, 화면에 μ›Ή νŽ˜μ΄μ§€λ₯Ό λ‚˜νƒ€λ‚΄μ•Ό ν•  λ•Œ, "μ–΄λ–€ 방법"으둜 νŽ˜μ΄μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ”μ§€μ— μ§‘μ€‘ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, 제λͺ©, λ³Έλ¬Έ..

[λ””μžμΈ νŒ¨ν„΄] MVP νŒ¨ν„΄, MVVM νŒ¨ν„΄

https://1eehyunji.tistory.com/entry/MVC-%ED%8C%A8%ED%84%B4 MVC νŒ¨ν„΄ λͺ¨λΈ(Model), λ·°(View), 컨트둀러(Controller)둜 이루어진 λ””μžμΈ νŒ¨ν„΄μ΄λ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ꡬ성 μš”μ†Œλ₯Ό μ„Έ κ°€μ§€ μ—­ν• λ‘œ κ΅¬λΆ„ν•΄μ„œ 개발 ν”„λ‘œμ„ΈμŠ€μ—μ„œ 각각의 ꡬ성 μš”μ†Œμ—λ§Œ μ§‘μ€‘ν•΄μ„œ κ°œλ°œν•  수 μžˆλ‹€. 1eehyunji.tistory.com MVP, MVVM νŒ¨ν„΄ λͺ¨λ‘ MVC νŒ¨ν„΄μ—μ„œ νŒŒμƒλœ νŒ¨ν„΄μ΄λ―€λ‘œ MVC νŒ¨ν„΄μ— λŒ€ν•œ 지식이 μ„ ν–‰λ˜μ–΄μ•Ό ν•œλ‹€! MVP(Model - View - Presenter) νŒ¨ν„΄ MVC νŒ¨ν„΄μœΌλ‘œλΆ€ν„° νŒŒμƒλ˜μ—ˆκ³ , MVCμ—μ„œ C에 ν•΄λ‹Ήν•˜λŠ” Controllerκ°€ Present둜 ꡐ체된 νŒ¨ν„΄μ΄λ‹€. κ·Έλ ‡λ‹€λ©΄ μ΄λ ‡κ²Œ 컨트둀러λ₯Ό ν”„λ ˆμ  ν„°λ‘œ λ³€κ²½ν•΄μ„œ μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” ..

[λ””μžμΈ νŒ¨ν„΄] MVC νŒ¨ν„΄

λͺ¨λΈ(Model), λ·°(View), 컨트둀러(Controller)둜 이루어진 λ””μžμΈ νŒ¨ν„΄μ΄λ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ꡬ성 μš”μ†Œλ₯Ό μ„Έ κ°€μ§€ μ—­ν• λ‘œ κ΅¬λΆ„ν•΄μ„œ 개발 ν”„λ‘œμ„ΈμŠ€μ—μ„œ 각각의 ꡬ성 μš”μ†Œμ—λ§Œ μ§‘μ€‘ν•΄μ„œ κ°œλ°œν•  수 μžˆλ‹€. μž¬μ‚¬μš©μ„±κ³Ό ν™•μž₯성이 μš©μ΄ν•˜λ‹€λŠ” μž₯점이 있고, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ³΅μž‘ν•΄μ§ˆμˆ˜λ‘ λͺ¨λΈκ³Ό 뷰의 관계가 λ³΅μž‘ν•΄μ§€λŠ” 단점이 μžˆλ‹€. λͺ¨λΈ(Model) λͺ¨λΈμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 데이터인 λ°μ΄ν„°λ² μ΄μŠ€, μƒμˆ˜, λ³€μˆ˜ 등을 λœ»ν•œλ‹€. λ·°μ—μ„œ 데이터λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ μˆ˜μ •ν•˜λ©΄ 컨트둀러λ₯Ό 톡해 λͺ¨λΈμ„ μƒμ„±ν•˜κ±°λ‚˜ κ°±μ‹ ν•œλ‹€. λ·°(View) UI(User Interface) μš”μ†Œλ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 즉, λͺ¨λΈμ„ 기반으둜 μ‚¬μš©μžκ°€ λ³Ό 수 μžˆλŠ” 화면을 λœ»ν•œλ‹€. λͺ¨λΈμ΄ κ°€μ§€κ³  μžˆλŠ” 정보λ₯Ό λ”°λ‘œ μ €μž₯ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜λ©° λ‹¨μˆœνžˆ 화면에 ν‘œμ‹œν•˜λŠ” μ •λ³΄λ§Œ κ°€μ§€..

[λ””μžμΈ νŒ¨ν„΄] μ΄ν„°λ ˆμ΄ν„° νŒ¨ν„΄(Iterator Pattern)κ³Ό λ…ΈμΆœλͺ¨λ“ˆ νŒ¨ν„΄(revealing module pattern)

μ΄ν„°λ ˆμ΄ν„° νŒ¨ν„΄ μ΄ν„°λ ˆμ΄ν„° νŒ¨ν„΄μ€ μ΄ν„°λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•΄μ„œ μ»¬λ ‰μ…˜μ˜ μš”μ†Œλ“€μ— μ ‘κ·Όν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€. 이λ₯Ό 톡해 μˆœνšŒν•  수 μžˆλŠ” μ—¬λŸ¬ κ°€μ§€ μžλ£Œν˜•μ˜ ꡬ쑰와 상관없이 μ΄ν„°λ ˆμ΄ν„°λΌλŠ” ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ‘œ μˆœνšŒκ°€ κ°€λŠ₯ν•˜λ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ μ΄ν„°λ ˆμ΄ν„° νŒ¨ν„΄ const mp = new Map() mp.set('a',1) mp.set('b',2) mp.set('c',3) const st = new Set() st.add(1) st.add(2) st.add(3) for (let a of mp) console.log(a) for (let a of st) console.log(a) /* ['a',1] ['b',2] ['c',3] 1 2 3 */ λ‹€λ₯Έ 자료ꡬ쑰인 Set, Mapμž„μ—λ„ λ˜‘κ°™μ€ for a of bλΌλŠ” μ΄ν„°λ ˆμ΄ν„°..

[λ””μžμΈ νŒ¨ν„΄] ν”„λ‘μ‹œ νŒ¨ν„΄(Proxy Pattern)κ³Ό ν”„λ‘μ‹œ μ„œλ²„(Proxy Server)

https://1eehyunji.tistory.com/entry/%ED%94%84%EB%A1%9D%EC%8B%9CProxy-%EA%B0%9D%EC%B2%B4 ν”„λ‘μ‹œ(Proxy) 객체 ν”„λ‘μ‹œ κ°μ²΄λŠ” μ–΄λ–€ λŒ€μƒμ˜ 기본적인 λ™μž‘(속성 μ ‘κ·Ό, ν• λ‹Ή, 순회, μ—΄κ±°, ν•¨μˆ˜ 호좜 λ“±)의 μž‘μ—…μ„ κ°€λ‘œμ±„μ„œ νŠΉλ³„ν•œ λ‹€λ₯Έ λ™μž‘(트랩)을 ν•  수 있게 ν•˜λŠ” 객체λ₯Ό λœ»ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν”„λ‘μ‹œ 1eehyunji.tistory.com μ•žμ„œ μž‘μ„±ν–ˆλ˜ κΈ€μ˜ ν”„λ‘μ‹œ κ°μ²΄λŠ” λ””μžμΈ νŒ¨ν„΄ 쀑 ν•˜λ‚˜μΈ ν”„λ‘μ‹œ νŒ¨ν„΄μ˜ κ°œλ…μ΄ λ…Ήμ•„λ“€μ–΄ μžˆλŠ” 객체이닀. ν”„λ‘μ‹œ νŒ¨ν„΄μ€ λŒ€μƒ 객체에 μ ‘κ·Όν•˜κΈ° μ „ κ·Έ 접근에 λŒ€ν•œ 흐름을 κ°€λ‘œμ±„μ„œ λŒ€μƒ 객체 μ•žλ‹¨μ˜ μΈν„°νŽ˜μ΄μŠ€ 역할을 ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€. 즉, μ–΄λ–€ λŒ€μƒ 객체에 μ ‘κ·Όν•˜κ³ μž ν•  λ•Œ ν•΄λ‹Ή 객체λ₯Ό μ§μ ‘μ μœΌλ‘œ..

[λ””μžμΈ νŒ¨ν„΄] μ˜΅μ €λ²„ νŒ¨ν„΄(Observer Pattern)

μ˜΅μ €λ²„ νŒ¨ν„΄μ€ 주체가 μ–΄λ–€ 객체의 μƒνƒœ λ³€ν™”λ₯Ό κ΄€μ°°ν•˜λ‹€κ°€ μƒνƒœ λ³€ν™”κ°€ μžˆμ„ λ•Œλ§ˆλ‹€ λ©”μ„œλ“œ 등을 ν†΅ν•΄μ„œ μ˜΅μ €λ²„ λͺ©λ‘μ— μžˆλŠ” μ˜΅μ €λ²„λ“€μ—κ²Œ λ³€ν™”λ₯Ό μ•Œλ €μ£ΌλŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€. μ—¬κΈ°μ„œ '주체'λŠ” 객체의 μƒνƒœ λ³€ν™”λ₯Ό μ§€μΌœλ³΄κ³  μžˆλŠ” κ΄€μ°°μžμ΄λ©°, 'μ˜΅μ €λ²„'λ“€μ΄λž€ 이 객체의 μƒνƒœ 변화에 따라 μ „λ‹¬λ˜λŠ” λ©”μ„œλ“œ 등을 기반으둜 'μΆ”κ°€ λ³€ν™” 사항'이 μƒκΈ°λŠ” 객체듀을 μ˜λ―Έν•œλ‹€. μ˜΅μ €λ²„ νŒ¨ν„΄μ€ 주체와 객체λ₯Ό λ”°λ‘œ 두지 μ•Šκ³  μƒνƒœκ°€ λ³€κ²½λ˜λŠ” 객체λ₯Ό 기반으둜 κ΅¬μΆ•ν•˜κΈ°λ„ ν•œλ‹€. μ΄λŸ¬ν•œ μ˜΅μ €λ²„ νŒ¨ν„΄μ„ ν™œμš©ν•œ λŒ€ν‘œμ μΈ μ„œλΉ„μŠ€λ‘œλŠ” 'νŠΈμœ„ν„°'κ°€ μžˆλ‹€. νŠΈμœ„ν„°λŠ” 주체(이 κ²½μš°μ—” μƒνƒœκ°€ λ³€κ²½λ˜λŠ” 객체)κ°€ μƒˆλ‘œμš΄ νŠΈμœ—μ„ 올리면 주체의 νŒ”λ‘œμ›Œλ“€μ—κ²Œ μƒˆλ‘œμš΄ νŠΈμœ—μ΄ μ˜¬λΌμ™”λ‹€λŠ” μ•ŒλžŒμ„ μ „μ†‘ν•œλ‹€. μ˜΅μ €λ²„ νŒ¨ν„΄μ€ 주둜 이벀트 기반 μ‹œμŠ€ν…œμ— μ‚¬μš©ν•˜κ³ , MVC(..

[λ””μžμΈ νŒ¨ν„΄] μ „λž΅ νŒ¨ν„΄(Strategy Pattern)

객체의 ν–‰μœ„λ₯Ό λ°”κΎΈκ³  싢은 경우 '직접' μˆ˜μ •ν•˜μ§€ μ•Šκ³  μ „λž΅μ΄λΌ λΆ€λ₯΄λŠ” 'μΊ‘μŠν™”ν•œ μ•Œκ³ λ¦¬μ¦˜'을 μ»¨ν…μŠ€νŠΈ μ•ˆμ—μ„œ λ°”κΏ”μ£Όλ©΄μ„œ μƒν˜Έ ꡐ체가 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“œλŠ” νŒ¨ν„΄μ΄λ‹€. *μ»¨ν…μŠ€νŠΈ : 상황, λ§₯락, λ¬Έλ§₯을 μ˜λ―Έν•˜λ©° κ°œλ°œμžκ°€ μ–΄λ–€ μž‘μ—…μ„ μ™„λ£Œν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  κ΄€λ ¨ 정보 μ˜ˆμ‹œ) 동일 κ³„μ—΄μ˜ μ•Œκ³ λ¦¬μ¦˜(κ±·κ±°λ‚˜ λ›°λŠ” λ“±μ˜ 이동 방식 계열)을 μ •μ˜ν•˜κ³ , 이듀을 'Move Strategy'λΌλŠ” μ΄λ¦„μœΌλ‘œ μΊ‘μŠν™”ν•΄μ„œ 이듀 μ‚¬μ΄μ˜ μƒν˜Έ κ΅ν™˜μ΄ κ°€λŠ₯ν•˜λ„λ‘ ν•œλ‹€. 즉, κ±Έμ–΄κ°€λ˜ 물체가 뛰어가기도 ν•˜κ³ , λ›°μ–΄κ°€λ˜ 물체가 날아가기도 ν•˜κ²Œλ” 이동 μ „λž΅μ„ λ³€κ²½ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것이닀. Robot μ΄λΌλŠ” 좔상 클래슀λ₯Ό μ„ μ–Έν•΄μ„œ, κ±·κΈ° λ‘œλ΄‡(WalkingRobot), λ›°κΈ° λ‘œλ΄‡(RunningRobot), λ‚ κΈ° λ‘œλ΄‡(FlyingRobot) ..

[λ””μžμΈ νŒ¨ν„΄] νŒ©ν† λ¦¬ νŒ¨ν„΄(Factory Pattern)

객체λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œμ—μ„œ 객체 생성 뢀뢄을 λ–Όμ–΄λ‚΄ μΆ”μƒν™”ν•œ νŒ¨ν„΄μ΄μž, 상속 관계에 μžˆλŠ” 두 ν΄λž˜μŠ€μ—μ„œ μƒμœ„ ν΄λž˜μŠ€κ°€ μ€‘μš”ν•œ λΌˆλŒ€λ₯Ό κ²°μ •ν•˜κ³ , ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ 객체 생성에 κ΄€ν•œ ꡬ체적인 λ‚΄μš©μ„ κ²°μ •ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€. μƒμœ„ ν΄λž˜μŠ€μ™€ ν•˜μœ„ ν΄λž˜μŠ€κ°€ λΆ„λ¦¬λ˜κΈ° λ•Œλ¬Έμ— λŠμŠ¨ν•œ 결합을 κ°€μ§€κ³ , μƒμœ„ ν΄λž˜μŠ€μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€ 생성 방식에 λŒ€ν•΄ μ•Œ ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ— 더 λ§Žμ€ μœ μ—°μ„±μ„ κ°€μ§€κ²Œ λœλ‹€. 그리고 객체 생성 둜직이 λ”°λ‘œ λ–Όμ–΄μ Έ 있기 λ•Œλ¬Έμ— μ½”λ“œλ₯Ό λ¦¬νŒ©ν† λ§ν•˜λ”λΌλ„ ν•œ 곳만 κ³ μΉ  수 있게 λ˜μ–΄ μœ μ§€ λ³΄μˆ˜μ„±μ΄ μ¦κ°€ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 라떼 λ ˆμ‹œν”Όμ™€ 아메리카노 λ ˆμ‹œν”Ό, 우유 λ ˆμ‹œν”ΌλΌλŠ” ꡬ체적인 λ‚΄μš©μ΄ λ“€μ–΄μžˆλŠ” ν•˜μœ„ ν΄λž˜μŠ€κ°€ 있고, μƒμœ„ 클래슀인 λ°”λ¦¬μŠ€νƒ€ 곡μž₯μ—μ„œ 이 λ ˆμ‹œν”Ό(ν•˜μœ„ν΄λž˜μŠ€)듀을 ν† λŒ€λ‘œ μƒν’ˆμ„ μƒμ‚°ν•˜λŠ” 생산 곡정을 생..

[λ””μžμΈ νŒ¨ν„΄] 싱글톀 νŒ¨ν„΄(Singleton Pattern)

ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— 였직 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œμ„ κ°€μ§€λŠ” νŒ¨ν„΄μ΄λ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„  λ‹¨μˆœν•˜κ²Œ λ¦¬ν„°λŸ΄ {} λ§ŒμœΌλ‘œλ„ 싱글톀 νŒ¨ν„΄μ„ λ§Œλ“€ 수 μžˆλ‹€. const obj = { a:27 } const obj2 = { a:27 } console.log(obj==obj2) //false λ¦¬ν„°λŸ΄λ‘œ 객체λ₯Ό μƒμ„±ν•˜κ²Œ 되면 λ‹€λ₯Έ μ–΄λ–€ 객체와도 κ°™μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 같은 λ‚΄μš©μ„ 가지더라도 obj와 obj2λŠ” μ„œλ‘œ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€λ₯Ό κ°€μ§„λ‹€. ν•˜μ§€λ§Œ, μ΄λ ‡κ²Œ κ΅¬ν˜„ν•˜λ©΄ λΉ„κ³΅κ°œ μƒνƒœλ‚˜ λΉ„κ³΅κ°œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 μ—†κΈ° λ•Œλ¬Έμ— λ‹€μŒκ³Ό 같은 λ°©μ‹μœΌλ‘œ 싱글톀 νŒ¨ν„΄μ„ κ΅¬μ„±ν•œλ‹€. Class Singleton { // constructor(μƒμ„±μž) // class 객체의 μ΄ˆκΈ°κ°’ μ„€μ • // class λ‚΄λΆ€μ—μ„œλŠ” ν•œ 개만 μ‘΄μž¬ν•  수 있고 2번 이상 μ‚¬μš©ν•˜λ©΄ Sy..

[λ””μžμΈ νŒ¨ν„΄] SOLID 원칙

S Single Resposibility Principal(단일 μ±…μž„μ˜ 원칙) : μ–΄λ–€ 클래슀 ν•œ κ°œλŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ§„λ‹€. 예λ₯Ό λ“€μ–΄, Class ADD { // λ”ν•˜κΈ° κΈ°λŠ₯을 μ œκ³΅ν•  μ±…μž„λ§Œ κ°€μ Έμ•Ό 함 // λΉΌκΈ°, λ”ν•˜κΈ° λ“±λ“± λΆ€κ°€μ μœΌλ‘œ μ œκ³΅ν•˜λ©΄ SRPλ₯Ό μœ„λ°˜ν•¨ } O Open Close Principal(개방 νμ‡„μ˜ 원칙) : κ°œλ°©μ—λŠ” openλ˜μ–΄ 있고, μˆ˜μ •μ—λŠ” closeλ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄, A.classλ₯Ό λ§Œλ“€μ–΄μ„œ ν…ŒμŠ€νŠΈν•˜κ³  μ„œλΉ„μŠ€λ„ ν•˜κ³  있음. μ΄λŸ¬ν•œ μƒν™©μ—μ„œ A.classλ₯Ό κΈ°λŠ₯ 보완을 ν•˜κ³  싢을 λ•Œ A.classλ₯Ό κ³ μΉ˜λŠ” 것이 μ•„λ‹ˆλΌ, μƒˆλ‘œμš΄ 클래슀λ₯Ό λ§Œλ“€μ–΄μ„œ μƒˆ ν΄λž˜μŠ€μ—μ„œ κΈ°λŠ₯ 보완을 ν•΄μ•Ό ν•œλ‹€. 즉, 기쑴에 μžˆλŠ” 클래슀λ₯Ό μ†λŒ€μ§€ μ•Šκ³ (μˆ˜μ •μ—λŠ” close), μƒˆλ‘œμš΄ 클래슀λ₯Ό 만..