suvera-dev πŸ₯¦

Design Pattern ) λ””μžμΈνŒ¨ν„΄ κ°œμš” 2편 λ³Έλ¬Έ

iOS/Design Pattern

Design Pattern ) λ””μžμΈνŒ¨ν„΄ κ°œμš” 2편

suvera 2022. 5. 5. 17:18

λ””μžμΈ νŒ¨ν„΄ κ°œμš” 2νŽΈμ„ μ“°κ²Œ 된 μ΄μœ λŠ”

λ””μžμΈ νŒ¨ν„΄μ— λŒ€ν•œ ν¬μŠ€νŒ…μ„ λͺ‡ 개 보닀가 

μ •λ¦¬ν•˜κ³  싢은 λ‚΄μš©μ„ λ°œκ²¬ν–ˆκΈ° λ•Œλ¬Έ ! γ…Ž

 

 

[Design-Pattern-In-Swift] 3. λ””μžμΈ νŒ¨ν„΄μ„ 톡해 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법

이번 3μž₯은 GoF의 λ””μžμΈ νŒ¨ν„΄ 1.6μž₯ ~ 1.8μž₯을 μž¬κ΅¬μ„±ν•œ λ‚΄μš©μž…λ‹ˆλ‹€! 이제 μ„œλ‘ μ€ 3μž₯μ—μ„œ λ§ˆλ¬΄λ¦¬ν•˜κ³  - λ‹€μŒμž₯λΆ€ν„°λŠ” μ‹€μ§ˆμ μœΌλ‘œ λ””μžμΈνŒ¨ν„΄μ„ μ–΄λ–»κ²Œ Swift에 적용 ν•  수 μžˆλŠ”μ§€μ— λŒ€ν•΄ 닀뀄보렀

i-colours-u.tistory.com

이 글을 λ°”νƒ•μœΌλ‘œ μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

λ””μžμΈνŒ¨ν„΄ 쀑 μƒμ„±νŒ¨ν„΄ λ¨Όμ € κ³΅λΆ€ν•˜κΈ° μœ„ν•΄ μ°Ύμ•„λ³΄λ‹€λ³΄λ‹ˆ

ν΄λž˜μŠ€μ™€ 객체λ₯Ό λ§Œλ“œλŠ” κ³Όμ •μ„μΊ‘μŠν™”ν•œλ‹€.

μ΄λŸ°μ‹μœΌλ‘œ 많이 μ–˜κΈ°λ₯Ό ν•˜λ”λΌκ΅¬μš” 

 

κ·Έλž˜μ„œ 클래슀, 객체, μΊ‘μŠν™” 이런 κ°œλ…λ“€μ„ 짚고 λ„˜μ–΄κ°€μ’Œ ..

고런 λŠλ‚Œμž…λ‹ˆλ‹€..

객체 지ν–₯ ν”„λ‘œκ·Έλž¨μ—μ„œ κ°μ²΄λž€ 무엇이고, μ λ‹Ήν•œ 객체의 규λͺ¨λ₯Ό μ •ν•˜κΈ° μœ„ν•΄μ„œ

λ””μžμΈνŒ¨ν„΄μ„ μ“΄λ‹€λŠ”λ° 그런 전체적인 흐름 ? 을 보고 λ„˜μ–΄κ°€κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€ ! 

 

 

1. 객체 지ν–₯ ν”„λ‘œκ·Έλž¨μ—μ„œμ˜ '객체'

 

κ°μ²΄λŠ” 데이터와 데이터에 연산을 κ°€ν•˜λŠ” ν”„λ‘œμ‹œμ €λ₯Ό ν•¨κ»˜ 묢은 λ‹¨μœ„μž…λ‹ˆλ‹€.

ν”„λ‘œμ‹œμ €λŠ” 일반적으둜 λ©”μ„œλ“œ λ˜λŠ” 연산이라고 λΆ€λ¦…λ‹ˆλ‹€.

 

κ°μ²΄λŠ” μ‚¬μš©μžλ‘œλΆ€ν„° μš”μ²­ λ˜λŠ” 메세지λ₯Ό λ°›μœΌλ©΄ 연산을 μˆ˜ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€ !

μš”μ²­μ€ 객체가 연산을 μ‹€ν–‰ν•˜κ²Œ ν•˜λŠ” μœ μΌν•œ 방법,

연산은 객체 λ‚΄λΆ€ λ°μ΄ν„°μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” μœ μΌν•œ 방법이라고 ν•©λ‹ˆλ‹€ 

 

μ—¬κΈ°μ„œ μš”μ²­μ„ λ˜μ§€λŠ” 객체 μ™ΈλΆ€μ—μ„œλŠ” λ‚΄λΆ€ 데이터에

직접 접근을 ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

즉, λ‚΄λΆ€μ˜ 상황을 λͺ¨λ₯΄λŠ” 것이죠 !

 

이런 μƒνƒœλ₯Ό μΊ‘μŠν™”λ˜μ—ˆλ‹€κ³  ν‘œν˜„ν•©λ‹ˆλ‹€.

 

-

 

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ 

객체끼리 ν˜‘λ ₯ν•˜μ—¬ 각자의 역할을 μˆ˜ν–‰ν•˜λŠ” μ‹μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 객체의 뢄할이 μ΄λ£¨μ–΄μ Έμ•Όν•©λ‹ˆλ‹€.

 

객체의 뢄할은 

μΊ‘μŠν™”, ν¬κΈ°μ •ν•˜κΈ°, 쒅속성, μœ μ—°μ„±, μ„±λŠ₯, 진화, μž¬μ‚¬μš©μ„± λ“±λ“± 

λ‹€μ–‘ν•œ μš”μΈμ„ κ³ λ €ν•΄μ„œ μ²˜λ¦¬ν•΄μ•Όν•©λ‹ˆλ‹€.

 

λ””μžμΈνŒ¨ν„΄μ„ 톡해 객체λ₯Ό μ–΄λŠμ •λ„ λΆ„ν• ν•˜κ³ 

μ–΄λ–€ κ΄€μ μœΌλ‘œ λ‹€λ€„μ•Όν•˜λŠ”μ§€μ— λŒ€ν•œ 방법듀을 μ•Œμ•„λ³΄κ²Œ 될 것 κ°™μŠ΅λ‹ˆλ‹€ !

 

 

2. 객체의 크기 κ²°μ •ν•˜κΈ° 

 

ν”„λ‘œκ·Έλž¨μ„ 섀계할 λ•Œ, κ°μ²΄λŠ” λ°˜λ“œμ‹œ λͺ‡κ°œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€! 처럼 μ •ν•΄μ§„κ²Œ μ—†μŠ΅λ‹ˆλ‹€

그러면 μ λ‹Ήν•œ 객체의 규λͺ¨λŠ” μ–΄λ–»κ²Œ μ •ν• κΉŒμš”?

=> λ””μžμΈνŒ¨ν„΄μ—μ„œ 닡을 μ–»μž !

 

1) νΌμ‚¬λ“œ νŒ¨ν„΄ : μ„œλΈŒ μ‹œμŠ€ν…œμ„ μ–΄λ–»κ²Œ 객체둜 ν‘œν˜„ν•  수 μžˆλŠ”μ§€ μ„€λͺ… 

이λ₯Ό 톡해 μ„œλΈŒ μ‹œμŠ€ν…œμ˜ 객체 크기λ₯Ό κ²°μ •ν•  수 있음

 

2) 좔상 νŒ©ν† λ¦¬ νŒ¨ν„΄ / λΉŒλ” νŒ¨ν„΄ : λ‹€λ₯Έ 객체λ₯Ό μƒμ„±ν•˜λŠ” μ±…μž„λ§Œ μžˆλŠ” 객체λ₯Ό λ§Œλ“€μ–΄λ‚΄λŠ” 법을 μ„€λͺ…

 

3) ν”ŒλΌμ΄κΈ‰ νŒ¨ν„΄ : 규λͺ¨λŠ” μž‘μ§€λ§Œ, κ°œμˆ˜κ°€ λ§Žμ€ 객체λ₯Ό λ‹€λ£¨λŠ” 방법을 μ„€λͺ…

 

4) 방문자 νŒ¨ν„΄ , λͺ…λ Ή νŒ¨ν„΄ : λ‹€λ₯Έ 객체가 μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ μ±…μž„μ§€λŠ” 객체λ₯Ό 

λ§Œλ“€μ–΄λ‚΄λŠ” 법을 μ„€λͺ…

 

=> 이런 μ •ν˜•ν™”λœ νŒ¨ν„΄μ„ 톡해, 각 객체λ₯Ό μ–΄λŠμ •λ„λ‘œ λΆ„λ¦¬ν•˜λŠ”μ§€ νŒŒμ•…ν•  수 있고,

λΆ„λ¦¬ν•œ 객체λ₯Ό μ–΄λ–»κ²Œ λ‹€λ£¨λŠ”μ§€μ— λŒ€ν•œ 방법을 이해할 수 있음 !

 

3. 객체 μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ…μ„Έ 

 

protocol PlanPreviewRepositoryInterface {
	func fetchBodyData(idx: Int, onCompleted: @escaping ([Int])) -> Void) -> Int
}

객체가 μ„ μ–Έν•˜λŠ” λͺ¨λ“  연산은 

μ—°μ‚°μ˜ 이름 (fetchBodyData),

λ§€κ°œλ³€μˆ˜λ‘œ λ°›μ•„λ“€μ΄λŠ” 객체 (idx, onCompletd),

μ—°μ‚°μ˜ λ°˜ν™˜κ°’(Int)을 λͺ…μ„Έν•©λ‹ˆλ‹€.

이λ₯Ό μ—°μ‚°μ˜ μ‹œκ·Έλ‹ˆμ²˜ 라고 λΆ€λ₯΄κ²Œ λ©λ‹ˆλ‹€.

 

SOILD ν• λ•Œ κ³΅λΆ€ν–ˆμ—ˆλŠ”λ°, μŠ€μœ„ν”„νŠΈμ—μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό

ν”„λ‘œν† μ½œμ„ μ΄μš©ν•΄ κ΅¬ν˜„ν•˜κ³  ν”„λ‘œν† μ½œ μ•ˆμ— λ©”μ„œλ“œκ°€ μ‹œκ·Έλ‹ˆμ²˜ κ°œλ…μ΄ λ©λ‹ˆλ‹€ !

 

그리고 νƒ€μž…μ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ‚˜νƒ€λ‚Ό λ•Œ μ‚¬μš©ν•˜λŠ” 이름을 일컫고 μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œν† μ½œ 이름을 μ •ν•  λ•Œ, 이름 끝에 -type을 μ‚¬μš©ν•΄ ν”„λ‘œν† μ½œ 이름을

μ •ν•˜λŠ” 경우λ₯Ό 보신적이 μžˆμ„κ²λ‹ˆλ‹€! .μš”λŸ¬ν•œ λ§₯락을 λ‹΄μ•„μ„œ 넀이밍을 μ§„ν–‰ν•˜κΈ° λ•Œλ¬Έμ΄λΌκ³  ν•΄μš” !

 

-

 

μΈν„°νŽ˜μ΄μŠ€λΌλ¦¬λŠ” 상속이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ—,

λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€κ°€ ν¬ν•¨ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μŠˆνΌνƒ€μž…μ΄λΌκ³  λΆ€λ₯΄λ©°,

λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν¬ν•¨ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„œλΈŒνƒ€μž…μ΄λΌκ³  λΆ€λ¦…λ‹ˆλ‹€ !

 

μŠ€μœ„ν”„νŠΈμ—μ„œ ν”„λ‘œν† μ½œμ„ μƒμ†ν•˜κ²Œ 되면 

μ„œλΈŒνƒ€μž…μ€ μŠˆνΌνƒ€μž…μ˜ μ •μ˜λœ 연산을 λ¬Όλ €λ°›κ²Œ 되죠 !

 

μ™ΈλΆ€μ—μ„œ 객체λ₯Ό μ•Œ 수 μžˆλŠ” 방법은 μΈν„°νŽ˜μ΄μŠ€ 밖에 μ—†μ–΄μ•Ό ν•©λ‹ˆλ‹€ !!

μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•΄μ„œλ§Œ 처리λ₯Ό μš”μ²­ν•  수 있고,

객체의 μΈν„°νŽ˜μ΄μŠ€λŠ” μ–΄λ–»κ²Œ κ΅¬ν˜„ν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œλŠ” 직접 μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€ ! 

μ™œλƒ? μΊ‘μŠν™” λ˜μ—ˆκΈ° λ•Œλ¬Έμ΄μ£  

 

μΈν„°νŽ˜μ΄μŠ€λŠ” 객체 지ν–₯μ—μ„œμ˜ κ°€μž₯ 기본적인 κ°œλ…μ΄ 되고, 

κ°μ²΄λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ μžμ‹ μ„ λ“œλŸ¬λ‚΄κ²Œ λ©λ‹ˆλ‹€.

 

μ΄λŸ¬ν•œ μš”μ²­κ³Ό κ·Έ μš”μ²­μ„ μ²˜λ¦¬ν•  객체λ₯Ό ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑에 ,

즉 λŸ°νƒ€μž„μ— λ‘˜μ„ μ—°κ²° μ§“λŠ” 것을 동적 바인딩이라고 ν•©λ‹ˆλ‹€.

 

동적바인딩은 ν”„λ‘œκ·Έλž¨μ΄ κΈ°λŒ€ν•˜λŠ” 객체λ₯Ό λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€(ν”„λ‘œν† μ½œ)λ₯Ό κ°–κ³  μžˆλŠ” 객체둜

μ–Όλ§ˆλ“ μ§€ κ°ˆμ•„λΌμš°λŠ”κ²Œ κ°€λŠ₯ν•˜λ‹€λŠ” μ˜λ―Έκ°€ λ©λ‹ˆλ‹€. 

=> μ΄λŸ¬ν•œ λŒ€μ²΄μ„±μ„ λ‹€ν˜•μ„±μ΄λΌκ³ ν•©λ‹ˆλ‹€ ! 객체 지ν–₯ μ‹œμŠ€ν…œμ˜ 핡심 κ°œλ…μ΄μ£ .

λ‹€ν˜•μ„±μ„ 톡해 κ°μ²΄κ°„μ˜ 결합도λ₯Ό μ—†μ• κ³ , μ„œλ‘œ κ°„μ˜ 관련성을 λ‹€μ–‘ν™” μ‹œμΌœμ€λ‹ˆλ‹€.

 

μ„œλ‘œ λ‹€λ₯Έ κ°μ²΄λŠ” μ±„νƒν•œ ν”„λ‘œν† μ½œμ— μ •μ˜ν•œ μš”μ²­μ˜ κ΅¬ν˜„ 방법을 

자유둭게 선택이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

κ²°κ΅­, ν”„λ‘œν† μ½œμ΄ μ‹œν‚¨κ±΄ λ‹€ λ§Œμ‘±ν•œ μƒνƒœμ—μ„œ 각자 μ²˜λ¦¬ν•˜λŠ” λ°©μ‹λ§Œ λ‹¬λΌμ§€λŠ” κ±°μ£  !

 

μœ„μ—μ„œ μ–ΈκΈ‰ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ–΄λ–»κ²Œ μž‘μ„±ν• μ§€μ— κ΄€λ ¨λœ λ””μžμΈ νŒ¨ν„΄μ€

 

1) λ©”λ©˜ν†  νŒ¨ν„΄ : 객체의 λ‚΄λΆ€ μƒνƒœλ₯Ό μ–΄λ–»κ²Œ μ €μž₯ν•˜κ³  μΊ‘μŠν™” ν•΄μ•Όν•˜λŠ”μ§€λ₯Ό μ •μ˜, 이λ₯Ό 톡해

μΈν„°νŽ˜μ΄μŠ€μ— λ“€μ–΄κ°€μ•Όν•  것, μ•ˆλ  것을 ꡬ뢄할 수 있음

 

2) μž₯μ‹μž νŒ¨ν„΄/ ν”„λ‘μ‹œ νŒ¨ν„΄ : μž₯μ‹λ˜κ³  μ€‘μž¬λ˜λŠ” 객체와 λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 갖도둝

μž₯μ‹μž/ ν”„λ‘μ‹œ 객체의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš”μ²­ν•˜λŠ” 방법을 μ •μ˜

이λ₯Ό 톡해, 클래슀 간에 μœ μ‚¬ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜λ„λ‘ ν•˜κ±°λ‚˜,

클래슀의 μΈν„°νŽ˜μ΄μŠ€μ— μ—¬λŸ¬κ°€μ§€ μ œμ•½μ„ μ •ν¬ν•©λ‹ˆλ‹€.

 

4. 객체 κ΅¬ν˜„ λͺ…μ„Έν•˜κΈ° 

 

객체의 κ΅¬ν˜„μ€ 클래슀λ₯Ό μ •μ˜ν•˜λŠ” κ³Όμ •μ—μ„œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

ν΄λž˜μŠ€λŠ” 객체 λ‚΄λΆ€ 데이터와 ν‘œν˜„ 방법을 λͺ…μ„Έν•˜κ³ , μˆ˜ν–‰ν•  연산도 같이 μ •μ˜ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

κ°μ²΄λŠ” 클래슀λ₯Ό μΈμŠ€ν„΄μŠ€λ‘œ λ§Œλ“¦μœΌλ‘œμ¨ 생성이 λ©λ‹ˆλ‹€.

즉, κ°μ²΄λŠ” 클래슀의 μΈμŠ€ν„΄μŠ€λΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€ !

 

ν΄λž˜μŠ€λŠ” 객체λ₯Ό λ§Œλ“€μ–΄λ‚΄κΈ° μœ„ν•œ 섀계도라고 ν•˜λ©΄ 

이λ₯Ό μΈμŠ€ν„΄μŠ€ν™” ν•΄μ„œ λ§Œλ“  

μΈμŠ€ν„΄μŠ€λŠ” 섀계도λ₯Ό λ°”νƒ•μœΌλ‘œ κ΅¬ν˜„λœ ꡬ체적인 싀체 ! μž…λ‹ˆλ‹€

μΈμŠ€ν„΄μŠ€λŠ” λ©”λͺ¨λ¦¬μ— 할당이 λ©λ‹ˆλ‹€.

 

* μΈμŠ€ν„΄μŠ€ν™” : 클래슀의 μΈμŠ€ν„΄μŠ€ν™” 과정은 

객체 λ‚΄λΆ€μ˜ 데이터에 λŒ€ν•œ 곡간을 ν• λ‹Ήν•˜κ³ , 이 데이터듀을 μ—°μ‚°κ³Ό 

κ΄€λ ¨μ§“λŠ” κ³Όμ •μž…λ‹ˆλ‹€ !

 

 

클래슀 상속을 톡해, κΈ°μ‘΄ ν΄λž˜μŠ€μ— κΈ°λ°˜μ„ λ‘” μƒˆλ‘œμš΄ 클래슀λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ„œλΈŒν΄λž˜μŠ€λŠ” λΆ€λͺ¨ν΄λž˜μŠ€κ°€ λ¬Όλ €μ€€ μ—°μ‚°μ΄λ‚˜ κ΅¬ν˜„μ„ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 과정을 μ˜€λ²„λΌμ΄λ“œλΌκ³  λΆ€λ¦…λ‹ˆλ‹€ !

μŠ€μœ„ν”„νŠΈμ—μ„œλ„ μ˜€λ²„λΌμ΄λ“œλΌλŠ” ν‚€μ›Œλ“œλ‘œ μ˜€λ²„λΌμ΄λ”©μ΄ κ°€λŠ₯ν•˜μ£  !

 

μžμ‹ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ν΄λž˜μŠ€μ˜ κΈ°λŠ₯을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν• μˆ˜λ„, κ΅¬ν˜„μ„ λ³€κ²½ν• μˆ˜λ„,

μžμ‹ λ§Œμ˜ κΈ°λŠ₯을 μ •μ˜ν•  μˆ˜λ„ 있겠죠 !

 

-

 

μΆ”μƒν΄λž˜μŠ€λŠ” λͺ¨λ“  μ„œλΈŒν΄λž˜μŠ€ 사이에 κ³΅ν†΅λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

μΆ”μƒν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†μŠ΅λ‹ˆλ‹€ 

 

μΆ”μƒν΄λž˜μŠ€κ°€ μ•„λ‹Œ ν΄λž˜μŠ€λŠ” ? ꡬ체 클래슀라고 ν•©λ‹ˆλ‹€.

κ΅¬μ²΄ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€ !

 

μΆ”μƒν΄λž˜μŠ€μΈ protocol A λŠ”

let a = A() 와 같이 μΈμŠ€ν„΄μŠ€ 생성이 λΆˆκ°€λŠ₯ν•˜κ³ 

 

ꡬ체클래슀인 class A λŠ” 

let a = A() 와 같이 μΈμŠ€ν„΄μŠ€ 생성이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

μ•žμ„œλ„ λ§ν–ˆλ“―μ΄ μŠ€μœ„ν”„νŠΈμ—μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν”„λ‘œν† μ½œλ‘œ ν‘œν˜„ν•˜κ³ 

ν”„λ‘œν† μ½œμ€ 연산에 λŒ€ν•œ μ •μ˜λ§Œ μžˆμ„ 뿐, 

ꡬ체적인 연산에 λŒ€ν•œ κ΅¬ν˜„μ€ μ—†κΈ° λ•Œλ¬Έμ— 

데이터와 연산을 μ—°κ²°μ§“λŠ” ν–‰μœ„ 즉, μΈμŠ€ν„΄μŠ€ν™”κ°€ λΆˆκ°€λŠ₯ ν•©λ‹ˆλ‹€ !

 

 

5. 객체 지ν–₯μ—μ„œ 행동 λ³΅ν•©ν•˜κΈ°

 

객체 지ν–₯μ—μ„œλŠ” 행동을 볡합할 수 μžˆλŠ” 방법에 3가지 μžˆμŠ΅λ‹ˆλ‹€

 

1) 상속 : μ„œλΈŒ ν΄λž˜μŠ€μ— μ˜ν•΄ 연산을 κ΅¬ν˜„ν•˜λŠ” 방법

2) ν•©μ„± : λ‹€λ₯Έ 객체λ₯Ό μ—¬λŸ¬κ°œ λΆ™μ—¬μ„œ μƒˆλ‘œμš΄ κΈ°λŠ₯ ν˜Ήμ€ 객체λ₯Ό κ΅¬μ„±ν•˜λŠ” 방법

3) λ§€κ°œλ³€μˆ˜ν™” : νƒ€μž…μ„ μ •μ˜ν•  λ•Œ νƒ€μž…μ΄ μ‚¬μš©ν•˜λŠ” λͺ¨λ“  νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šμ€ 채 μ •μ˜ν•˜λŠ” 방법

 

 

-

 

상속 

 

μ„œλ‘œ λ‹€λ₯Έ 클래슀의 객체듀이 λ™μΌν•œ νƒ€μž…(ν”„λ‘œν† μ½œ)을 가지고,

κ΅¬ν˜„μ€ 제각각으둜 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

νŠΉμ • 객체가 μ–΄λ–€ 클래슀의 μΈμŠ€ν„΄μŠ€λΌκ³  말할 λ•Œ, 

κ·Έ κ°μ²΄λŠ” ν΄λž˜μŠ€κ°€ μ •μ˜ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ§€μ›ν•œλ‹€λŠ” 뜻이 숨겨져 μžˆλ‹€.

 

- 클래슀 상속 : 객체의 κ΅¬ν˜„μ„ μ •μ˜ ν• λ•Œ, 이미 μ •μ˜λœ 객체의 κ΅¬ν˜„μ„ λ°”νƒ•μœΌλ‘œ ν•œλ‹€.

μ½”λ“œμ™€ λ‚΄λΆ€ ν‘œν˜„κ΅¬μ‘°λ₯Ό κ³΅μœ ν•˜κ²Œ λœλ‹€. 이미 λ‹€ 갖좰진 μ—°μ‚°κ³Ό 데이터λ₯Ό λ°›μ•„μ„œ μ²˜λ¦¬ν•œλ‹€.

( μ™„μ œν’ˆμ„ λ°›μ•„μ„œ 거기에 μ‚΄λ§Œ λΆ™μ—¬μ„œ μƒˆλ‘œμš΄ 객체λ₯Ό λΉ λ₯΄κ²Œ μ •μ˜ν•  λ•Œ μ‚¬μš© )

κΈ°μ‘΄ 클래슀λ₯Ό κ·ΈλŒ€λ‘œ μƒμ†ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€λ©΄, 

μƒˆλ‘œμš΄ κ΅¬ν˜„μ— λ“œλŠ” λΉ„μš©μ€ 적은 편 ! ν•˜μ§€λ§Œ κ·ΈλŒ€λ‘œ κ΅¬ν˜„μ„ λ¬Όλ €λ°›λŠ”λ‹€κ³ 

μž¬μ‚¬μš©μ΄ μ™„λ²½ν•˜κ²Œ μ΄λ£¨μ–΄μ§€μ§€λŠ” μ•ŠμŒ

 

- μΈν„°νŽ˜μ΄μŠ€ 상속 ( ν”„λ‘œν† μ½œ 상속 ) : μ—°μ‚°μ˜ μ •μ˜λ§Œ λ¬Όλ €λ°›κ²Œ λ˜λŠ” ν˜•μ‹

이λ₯Ό 톡해, μ–΄λ–€ 객체가 λ‹€λ₯Έ 객체 λŒ€μ‹ μ— μ‚¬μš©λ  수 μžˆλŠ” 경우λ₯Ό 지정할 수 있게됨

μ΄λŸ¬ν•œ μΈν„°νŽ˜μ΄μŠ€ μƒμ†μ˜ μž₯점 ?

μ‚¬μš©μžκ°€ μ›ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ·Έ 객체가 λ§Œμ‘±ν•˜κ³  μžˆλŠ” ν•œ, μ‚¬μš©μžλ“€μ€ 그듀이 μ‚¬μš©ν•˜λŠ”

νŠΉμ • 객체 νƒ€μž…μ— λŒ€ν•΄ μ•Œ ν•„μš”κ°€ μ—†λ‹€.

μ‚¬μš©μžλ“€μ€ 이 객체듀을 κ΅¬ν˜„ν•˜λŠ” 클래슀λ₯Ό μ•Œ ν•„μš”κ°€ μ—†κ³ , ν”„λ‘œν† μ½œμ—κ²Œλ§Œ μ‹œν‚€λ©΄ λœλ‹€.

=> μ΄λŸ¬ν•œ 원칙을 톡해 μ„œλΈŒ μ‹œμŠ€ν…œκ°„ 쒅속성이 없어진닀 !

λ”°λΌμ„œ, κ΅¬ν˜„μ΄ μ•„λ‹Œ μΈν„°νŽ˜μ΄μŠ€μ— 따라 ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λŠ” 것을 ꢌμž₯ν•˜κ³  μžˆλ‹€

 

* μ–΄λ–€ λ³€μˆ˜λ₯Ό ꡬ체 클래슀의 μΈμŠ€ν„΄μŠ€λ‘œ μ„ μ–Έν•˜λŠ” 일을 ν”Όν•˜μž : DIP μœ„λ°˜ 

λŒ€μ‹ , 좔상 클래슀의 μΈν„°νŽ˜μ΄μŠ€λ₯΄ λ”°λ₯΄λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ •μ˜ν•΄μ•Όν•œλ‹€ -> μ˜μ‘΄μ„± μ£Όμž…

 

 

 

ν•©μ„± 

 

클래슀 상속은 λ‹€λ₯Έ λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 상속받아,

λ©”μ„œλ“œμ™€ 데이터λ₯Ό λ¬Όλ €λ°›μ•„ ν•œ 클래슀의 κ΅¬ν˜„μ„ μ •μ˜ν•˜λŠ” 것

λΆ€λͺ¨ν΄λž˜μŠ€μ˜ λ‚΄λΆ€κ°€ μ„œλΈŒ ν΄λž˜μŠ€μ— 곡개되기 λ•Œλ¬Έμ—

ν™”μ΄νŠΈλ°•μŠ€ μž¬μ‚¬μš©μ΄λΌκ³  λΆ€λ₯΄κΈ°λ„ 함

 

객체 ν•©μ„± : λ‹€λ₯Έ 객체λ₯Ό μ—¬λŸ¬κ°œ λΆ™μ—¬μ„œ μƒˆλ‘œμš΄ 객체λ₯Ό κ΅¬μ„±ν•˜λŠ” κ²ƒμœΌλ‘œ,

합성에 λ“€μ–΄κ°€λŠ” κ°μ²΄λ“€μ˜ μΈν„°νŽ˜μ΄μŠ€λ“€μ„ μ •ν™•νžˆ μ •μ˜ν•΄λ‘κ³ ,

ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ“€μ„ μž¬μ‚¬μš©ν•˜λŠ” 방식을 톡해 μ •μ˜λœλ‹€.

 

객체의 λ‚΄λΆ€λŠ” κ³΅κ°œλ˜μ§€ μ•Šκ³  μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 'λΈ”λž™λ°•μŠ€ μž¬μ‚¬μš©'

이라고 λΆ€λ₯΄κΈ°λ„ 함

 

μ—¬κΈ°μ„œ 클래슀의 상속은, μ„œλΈŒν΄λž˜μŠ€κ°€ λΆ€λͺ¨ 클래슀이 κ΅¬ν˜„μ— 쒅속될 수 밖에 μ—†μœΌλ―€λ‘œ

λΆ€λͺ¨ 클래슀 κ΅¬ν˜„μ— 변경이 생기면 μ„œλΈŒν΄λž˜μŠ€μ—λ„ 변경이 μžˆμ–΄μ•Ό 함 !

 

객체 합성을 ν•˜κ²Œ 되면, 각 클래슀 κ°„ μΊ‘μŠν™” μœ μ§€κ°€ κ°€λŠ₯ν•˜κ³ 

클래슀의 1가지 μž‘μ—…μ— 집쀑할 수 μžˆλ‹€.

μŠ€μœ„ν”„νŠΈμ˜ massive viewcontrollerλ₯Ό 막을 수 μžˆλ‹€.

쒅속성이 쀄어듀고 μΊ‘μŠν™”λ₯Ό μœ μ§€ν•  수 있기 λ•Œλ¬Έμ— 객체합성이 클래슀 합성보닀 

더 λ‚˜μ€ 방법이라고 ν• μˆ˜ μžˆλ‹€.

 

but, ν•©μ„±λ§ŒμœΌλ‘œλŠ” ν”„λ‘œμ νŠΈλ₯Ό μ„€κ³„ν•˜κΈ° λΆˆκ°€λŠ₯ν•˜λ―€λ‘œ 상속과 객체 합성은 적절히 μ‘°ν•© !

 

-

 

λ§€κ°œλ³€μˆ˜ν™” : νƒ€μž…μ„ μ •μ˜ν•  λ•Œ νƒ€μž…μ΄ μ‚¬μš©ν•˜λŠ” λͺ¨λ“  νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šμ€ 채 μ •μ˜

 

κΈ°λŠ₯의 μž¬μ‚¬μš©μ— μ΄μš©ν•  수 μžˆλŠ” λ‹€λ₯Έ 방법은 λ§€κ°œλ³€μˆ˜ν™”λœ νƒ€μž…μ„ μ§€μ •ν•˜λŠ” 것

μŠ€μœ„ν”„νŠΈμ—μ„œλŠ” μ œλ„ˆλ¦­μ΄λΌλŠ” κΈ°λŠ₯을 톡해 κ°€λŠ₯ν•©λ‹ˆλ‹€. 

객체λ₯Ό 생성할 λ•Œ, νƒ€μž…μ„ λͺ…μ‹œν•˜λŠ” 것이 μ•„λ‹ˆλΌ λ‚˜μ€‘μ— μ§€μ •ν•˜λ„λ‘ν•΄μ„œ 쑰금 더 μœ μ—°ν•˜κ²Œ 

객체 섀계가 κ°€λŠ₯ν•©λ‹ˆλ‹€. 

 

struct Stack<T> {
	var items = [T]()
    mutating func push(item: T) {
    	items.append(item)
	}
    mutating func pop() -> T {
    	return items.removeLast()
	}
}

var stackOfAny = Stack<μ–΄λ–€ νƒ€μž…μ΄λ“  κ°€λŠ₯>()

 

6. λŸ°νƒ€μž„ vs 컴파일 

 

λ§Žμ€ λ””μžμΈ νŒ¨ν„΄λ“€μ€ 컴파일 μ‹œμ κ³Ό λŸ°νƒ€μž„ ꡬ쑰λ₯Ό λͺ…μ‹œμ μœΌλ‘œ κ΅¬λΆ„ν•˜κ³  있음

μ™œμΌκΉŒμš”

 

μ½”λ“œ ꡬ쑰의 κ²½μš°μ—λŠ” 컴파일 μ‹œμ μ—μ„œ 확정이 λ©λ‹ˆλ‹€ : μ˜μ†μ  κ°œλ…

ꡐλ₯˜ν•˜λŠ” 객체가 μ–΄λ–»κ²Œ ν˜‘λ ₯ν•˜λŠλƒμ— 따라 λ³€ν•˜λŠ” 것은 λŸ°νƒ€μž„ μ‹œμ μ— μΌμ–΄λ‚©λ‹ˆλ‹€ : μœ λ™μ  κ°œλ… 

=> μ–΄λ–€ κ°œλ…μ΄ λ³€ν•˜κ³  λ³€ν•˜μ§€ μ•ŠλŠ” λ‹€λŠ” 것을 λͺ…μ‹œν•΄μ„œ λŸ°νƒ€μž„ ꡬ쑰λ₯Ό 섀계해야함 !

 

μž¬μ‚¬μš©μ„ μ΅œλŒ€ν™”ν•˜κΈ° μœ„ν•΄μ„œλŠ”

μƒˆλ‘œμš΄ μš”κ΅¬ 사항과 μ•žμœΌλ‘œ λ°œμƒν•  변경을 μ˜ˆμΈ‘ν•΄ 

μ•žμœΌλ‘œμ˜ μ‹œμŠ€ν…œ 섀계가 진화할 수 μžˆλ„λ‘ 해야함 

 

κ²°κ΅­ 변화에 잘 λŒ€μ‘ν•˜κΈ° μœ„ν•œ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ”

μ–΄λ–€ λ³€ν™”λ₯Ό μ–΄λ–»κ²Œ μˆ˜μš©ν• μ§€λ₯Ό κ³ λ €ν•΄μ•Όν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€ !

 

결둠적으둜 λ””μžμΈνŒ¨ν„΄μ„ 톡해 

κ°μ²΄λ³„λ‘œ λ…λ¦½μ μœΌλ‘œ 변화에 적응 ν• μˆ˜ μžˆλŠ” ꡬ쑰λ₯Ό λ§Œλ“€μ–΄ λ‘¬μ„œ 

νŠΉμ • 변화에 μˆœμ‘ν•  수 있기 λ•Œλ¬Έμ— γ…‡μœ„μ™€ 같은 μœ„ν—˜λ„λ₯Ό 쀄일 수 있게 λ©λ‹ˆλ‹€.

 

Comments