λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
λ…μ„œ

μŠ€ν”„λ§ μž…λ¬Έμ„ μœ„ν•œ μžλ°” 객체 지ν–₯의 원리와 이해

by moon101 2022. 12. 6.

챕터 1 μ‚¬λžŒμ„ μ‚¬λž‘ν•œ 기술

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ˜ κ°œλ…μ€ OOP ν”„λ ˆμž„μ›Œν¬μ΄λ‹€

μŠ€ν”„λ§ μ‚Όκ°ν˜• IoC/DI, AOP, PSA

 

μžλ°” μ•Œμ•„μ•Ό ν•  것

- OOP κ°œλ…

- μžλ°” μ–Έμ–΄μ˜ 문법

- μžλ°”κ°€ OOP κ°œλ…μ„ κ΅¬ν˜„ν•œ 방식

 


 

챕터 2 μžλ°”μ™€ 절차적/ꡬ쑰적 ν”„λ‘œκ·Έλž˜λ°

main() λ©”μ„œλ“œ(ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” μ‹œμž‘μ )κ°€ 싀행될 λ•Œ Tλ©”λͺ¨λ¦¬μ—λŠ” μ–΄λ–€ 일이 μΌμ–΄λ‚˜λŠ”μ§€?

  1. JREκ°€ ν”„λ‘œκ·Έλž¨ μ•ˆμ— main() λ©”μ„œλ“œ 확인
  2. μžˆμ„ 경우, JVM λΆ€νŒ…
  3. JVM은 λͺ©μ νŒŒμΌμ„ λ°›μ•„ μ‹€ν–‰
  4. JVM은 μ „μ²˜λ¦¬ κ³Όμ • μˆ˜ν–‰
    1. java.lang νŒ¨ν‚€μ§€λ₯Ό T λ©”λͺ¨λ¦¬μ˜ μŠ€νƒœν‹± μ˜μ—­μ— 배치
    2. κ°œλ°œμžκ°€ μž‘μ„±ν•œ λͺ¨λ“  ν΄λž˜μŠ€μ™€ μž„ν¬νŠΈ νŒ¨ν‚€μ§€λ₯Ό μŠ€νƒœν‹± μ˜μ—­μ— 배치

λ©€ν‹° μŠ€λ ˆλ“œμ™€ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λž€?

https://www.geekboots.com/story/multiprocessing-vs-multithreading

λ©€ν‹° μŠ€λ ˆλ“œ(Multi Thread)

- λ©€ν‹° μ“°λ ˆλ“œμ˜ Tλ©”λͺ¨λ¦¬ λͺ¨λΈμ€ μŠ€νƒ μ˜μ—­μ„ μŠ€λ ˆλ“œ 개수만큼 λΆ„ν• ν•΄μ„œ μ‚¬μš©

- 참고둜, μ„œλΈ”λ¦Ώμ€ μš”μ²­λ‹Ή μŠ€λ ˆλ“œλ₯Ό 생성

λ©€ν‹° ν”„λ‘œμ„ΈμŠ€(Multi Process)

- λ‹€μˆ˜μ˜ 데이터 μ €μž₯ μ˜μ—­, 즉 λ‹€μˆ˜μ˜ T λ©”λͺ¨λ¦¬λ₯Ό 가짐

 

μŠ€νƒœν‹± : ν΄λž˜μŠ€λ“€μ˜ 놀이터

μŠ€νƒ : λ©”μ„œλ“œμ˜ 놀이터

νž™ : 객체의 놀이터

 

 


 

챕터 3 μžλ°”μ™€ 객체 지ν–₯

객체지ν–₯의 4λŒ€ νŠΉμ„±

- μΊ‘μŠν™”(정보 은닉), 상속(μž¬μ‚¬μš©), 좔상화(λͺ¨λΈλ§), λ‹€ν˜•μ„±(μ‚¬μš©νŽΈμ˜)

 

UML ν‘œκΈ°λ²•μ—μ„œ 클래슀 멀버(static)λŠ” 밑쀄을 κ·Έμ–΄ ν‘œκΈ°

클래슀 멀버 = static  멀버 = 정적 멀버

->  JVM ꡬ동 μ‹œ T λ©”λͺ¨λ¦¬μ˜ μŠ€νƒœν‹± μ˜μ—­μ— λ°”λ‘œ 배치되기 λ•Œλ¬Έμ— 객체의 쑴재 여뢀에 관계없이 μ“Έ 수 있음

 

LSP(λ¦¬μŠ€μ½”ν”„μ˜ μΉ˜ν™˜ 원칙)

-> ν•˜μœ„ ν΄λž˜μŠ€λŠ” μƒμœ„ ν΄λž˜μŠ€λ‹€

 

객체와 클래슀λ₯Ό 잘 λ‚˜νƒ€λ‚΄λ„λ‘ λ³€μˆ˜λͺ… μž‘μ„±

ex) Bird aBird λ˜λŠ” Bird theBird

 

μΈν„°νŽ˜μ΄μŠ€λŠ” be able to "무엇을 ν•  수 μžˆλŠ”" ν‘œν˜„ ν˜•νƒœλ‘œ λ§Œλ“ λ‹€

ex) Serializable, Cloneable, Comparable, Runnable

 

μƒμœ„ ν΄λž˜μŠ€λŠ” ν•˜μœ„ ν΄λž˜μŠ€μ— νŠΉμ„±(속성 + λ©”μ„œλ“œ)을 상속해 μ£Όκ³ , 

μΈν„°νŽ˜μ΄μŠ€λŠ” ν΄λž˜μŠ€κ°€ '무엇을 ν•  수 μžˆλ‹€' 라고 ν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λ„λ‘ κ°•μ œν•¨

-> μƒμœ„ ν΄λž˜μŠ€λŠ” 물렀쀄 νŠΉμ„±μ΄ λ§Žμ„ 수둝 μ’‹κ³  (LSP λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙)

-> μΈν„°νŽ˜μ΄μŠ€λŠ” κ΅¬ν˜„μ„ κ°•μ œν•  λ©”μ„œλ“œμ˜ κ°œμˆ˜κ°€ μ μ„μˆ˜λ‘ μ’‹μŒ (ISP μΈν„°νŽ˜μ΄μŠ€ λΆ„ν•  원칙)

 

ν•˜μœ„ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜λ©΄ μƒμœ„ 클래슀의 μΈμŠ€ν„΄μŠ€λ„ ν•¨κ»˜ 생성됨

 

// TODO

UML을 κ³΅λΆ€ν•˜λ €λ©΄ λ‘œλ²„νŠΈ λ§ˆν‹΄μ˜ 'UML μ‹€μ „μ—μ„œλŠ” μ΄κ²ƒλ§Œ μ“΄λ‹€/ UML for Java Programmers'와

λ§ˆν‹΄ 파울러의 'UML Distilled 2판' μΆ”μ²œ

 

 


 

챕터 4 μžλ°”κ°€ ν™•μž₯ν•œ 객체 지ν–₯

 

JUnit @BeforeClass

-> static 블둝 (p.157)

 

μΈν„°νŽ˜μ΄μŠ€λŠ” 좔상 λ©”μ†Œλ“œμ™€ 정적 μƒμˆ˜λ§Œ κ°€μ§ˆ 수 있음

-> public static final / public abstract

근데 μžλ°” 8λΆ€ν„° λžŒλ‹€ 생기고 이제 λ””ν΄νŠΈ λ©”μ†Œλ“œλΌκ³  ν•˜λŠ” ꡬ상 λ©”μ„œλ“œμ™€ 정적 좔상 λ©”μ„œλ“œ 지원함

 

// TODO

객체 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ, 객체λͺ….κ°μ²΄λ©”μ„œλ“œλͺ…() 이 μ•„λ‹ˆλΌ

클래슀λͺ….κ°μ²΄λ©”μ„œλ“œλͺ…() μ΄λ ‡κ²Œ ν˜ΈμΆœλ˜λŠ” 게 이해가 잘 μ•ˆ 됨(p.171)

 

 

 


 

챕터 5 객체 지ν–₯ 섀계 5원칙

 

SOLID

  • SRP(Single Responsibility Principle): 단일 μ±…μž„μ˜ 원칙
    • μ–΄λ–€ 클래슀λ₯Ό λ³€κ²½ν•΄μ•Ό ν•˜λŠ” μ΄μœ λŠ” 였직 ν•˜λ‚˜λΏμ΄μ–΄μ•Ό ν•œλ‹€. 
    • λΆ„κΈ°μ²˜λ¦¬λ₯Ό μœ„ν•œ if문이 λ©”μ†Œλ“œμ—μ„œ 보이면 SRPλ₯Ό μœ„λ°˜ν•œ 것이 μ•„λ‹Œμ§€ μ˜μ‹¬ν•΄λ΄μ•Ό 함
  • OCP(Open Closed Principle): 개방 폐쇄 원칙
    • μžμ‹ μ˜ ν™•μž₯μ—λŠ” μ—΄λ € 있고, μ£Όλ³€μ˜ λ³€ν™”μ—λŠ” λ‹«ν˜€μžˆμ–΄μ•Ό ν•œλ‹€. 
    • 쒋은 예: JDBC, μŠ€ν”„λ§ ν”„λ ˆμž„ μ›Œν¬
  • LSP(Liskov Substitution Principle): λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙
    • μ„œλΈŒ νƒ€μž…μ€ μ–Έμ œλ‚˜ μžμ‹ μ˜ 기반 νƒ€μž…μœΌλ‘œ ꡐ체할 수 μžˆμ–΄μ•Ό ν•œλ‹€.
  • ISP(Interface Segregation Principle): μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” μžμ‹ μ΄ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œμ— 의쑴 관계λ₯Ό 맺으면 μ•ˆ λœλ‹€. 
  • DIP(Dependency Inversion Principle): 의쑴 μ—­μ „ 원칙
    • μžμ‹ λ³΄λ‹€ λ³€ν•˜κΈ° μ‰¬μš΄ 것에 μ˜μ‘΄ν•˜μ§€ 마라.  
    • λ³€ν•˜κΈ° μ‰¬μš΄ 것에 μ˜μ‘΄ν•˜λ˜ 것을 μΆ”μƒν™”λœ μΈν„°νŽ˜μ΄μŠ€λ‚˜ μƒμœ„ 클래슀λ₯Ό λ§Œλ“€μ–΄ λ³€ν•˜κΈ° μ‰¬μš΄ κ²ƒμ˜ 변화에 영ν–₯받지 μ•Šκ²Œ ν•˜λŠ” 것

 SRP와 ISPλŠ” 같은 λ¬Έμ œμ— λŒ€ν•œ λ‹€λ₯Έ 해결방법이라고 λ³Ό 수 μžˆλŠ”λ° νŠΉλ³„ν•œ κ²½μš°κ°€ μ•„λ‹ˆλ©΄ 단일 μ±…μž„ 원칙을 μ μš©ν•˜λŠ” 것이 μ’‹λ‹€. 

 

 


 

챕터 6  μŠ€ν”„λ§μ΄ μ‚¬λž‘ν•œ λ””μžμΈ νŒ¨ν„΄

λ””μžμΈ νŒ¨ν„΄μ€ 객체 지ν–₯의 νŠΉμ„± 쀑 상속(extends), μΈν„°νŽ˜μ΄μŠ€(interface/implements), ν•©μ„±(객체λ₯Ό μ†μ„±μœΌλ‘œ 이용)을 μ΄μš©ν•¨.

 

총 8κ°€μ§€μ˜ νŒ¨ν„΄

1. Adapter Pattern

- μ„œλ‘œ λ‹€λ₯Έ 두 μΈν„°νŽ˜μ΄μŠ€ 사이에 톡신이 κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 것

- ODBC/JDBCκ°€ μ–΄λŒ‘ν„° νŒ¨ν„΄μ„ μ΄μš©ν•΄ λ‹€μ–‘ν•œ λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ„ λ‹¨μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ‘œ μ‘°μž‘ν•  수 μžˆλ„λ‘ ν•΄μ€Œ

- SOLID 쀑 OCP ν™œμš©ν•œ 섀계 νŒ¨ν„΄

- 합성을 μ‚¬μš© 

2. Proxy Pattern

- μ œμ–΄ 흐름을 μ‘°μ •ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ 쀑간에 λŒ€λ¦¬μžλ₯Ό λ‘λŠ” νŒ¨ν„΄

- λŒ€λ¦¬μžλŠ” μ‹€μ œ μ„œλΉ„μŠ€μ™€ 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œ κ΅¬ν˜„. μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©

- λŒ€λ¦¬μžλŠ” μ‹€μ œ μ„œλΉ„μŠ€μ— λŒ€ν•œ μ°Έμ‘° λ³€μˆ˜λ₯Ό 가짐(ν•©μ„±)

- λŒ€λ¦¬μžλŠ” μ‹€μ œ μ„œλΉ„μŠ€μ˜ 같은 이름을 가진 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³ , κ·Έ 값을 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 돌렀쀌

- λŒ€λ¦¬μžλŠ” μ‹€μ œ μ„œλΉ„μŠ€μ˜ λ©”μ„œλ“œ 호좜 전후에 λ³„λ„μ˜ 둜직 μˆ˜ν–‰ κ°€λŠ₯

- SOLID 쀑 OCP 및 DIP μ‚¬μš©

3. Decorator Pattern

- ν”„λ‘μ‹œ νŒ¨ν„΄κ³Ό κ΅¬ν˜„ 방법 동일. 단, λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ€ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ°›λŠ” λ°˜ν™˜κ°’μ— μž₯식을 λ§μž…νž˜

4. Singleton Pattern

- 클래슀의 μΈμŠ€ν„΄μŠ€(객체)λ₯Ό ν•˜λ‚˜λ§Œ λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•  수 있게 함

- ν•„μš”ν•œ 쑰건 

- 1. newλ₯Ό μ‹€ν–‰ν•  수 없도둝 μƒμ •μžμ— private μ ‘κ·Ό μ œμ–΄μž 지정

- 2. μœ μΌν•œ 단일 객체λ₯Ό λ°˜ν™˜ν•  수 μžˆλŠ” 정적 λ©”μ„œλ“œκ°€ ν•„μš”ν•¨

- 3. μœ μΌν•œ 단일 객체λ₯Ό μ°Έμ‘°ν•  정적 μ°Έμ‘° λ³€μˆ˜κ°€ ν•„μš”ν•¨ -> μ°Έμ‘°ν•˜λŠ” 단일 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” getInstance() 정적 λ©”μ„œλ“œλ₯Ό 가짐

- 4. 단일 κ°μ²΄λŠ” μ“°κΈ° κ°€λŠ₯ν•œ 속성을 갖지 μ•ŠλŠ” 것이 μ’‹μŒ

5. Template Method Pattern

- μƒμœ„ 클래슀의 견본 λ©”μ„œλ“œμ—μ„œ ν•˜μœ„ ν΄λž˜μŠ€κ°€ μ˜€λ²„λΌμ΄λ”©ν•œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” νŒ¨ν„΄

6. Factory Method Pattern

- μ˜€λ²„λΌμ΄λ“œλœ λ©”μ„œλ“œκ°€ 객체λ₯Ό μƒμ„±ν•΄μ„œ λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œ

7. Strategy Pattern

- μ „λž΅ νŒ¨ν„΄μ„ κ΅¬μ„±ν•˜λŠ” μš”μ†Œ

- 1. μ „λž΅ λ©”μ„œλ“œλ₯Ό 가진 μ „λž΅ 객체

- 2. μ „λž΅ 객체λ₯Ό μ‚¬μš©ν•˜λŠ” μ»¨ν…μŠ€νŠΈ(μ „λž΅ 객체의 μ‚¬μš©μž/μ†ŒλΉ„μž)

- 3. μ „λž΅ 객체λ₯Ό 생성해 μ»¨ν…μŠ€νŠΈμ— μ£Όμž…ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ(제3자, μ „λž΅ 객체의 κ³΅κΈ‰μž)

- ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄κ³Ό μœ μ‚¬ν•œλ°, 같은 λ¬Έμ œμ— λŒ€ν•΄ 상속을 μ΄μš©ν•˜λŠ” ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄κ³Ό, 객체 μ£Όμž…μ„ ν†΅ν•œ μ „λž΅ νŒ¨ν„΄ μ€‘μ—μ„œ μ„ νƒν•˜μ—¬ 적용 κ°€λŠ₯. ν•˜μ§€λ§Œ, μžλ°”μ˜ 경우, 단일 μƒμ†λ§Œμ΄ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— 상속에 μ œν•œμ΄ μžˆμ–΄ μ „λž΅ νŒ¨ν„΄μ΄ 더 많이 μ‚¬μš©λ¨ 

8. Template Callback Pattern

- μ „λž΅ νŒ¨ν„΄μ˜ λ³€ν˜•

- μŠ€ν”„λ§ DIμ—μ„œ μ‚¬μš©

- μ „λž΅μ„ 읡λͺ… λ‚΄λΆ€ 클래슀둜 μ •μ˜ν•΄μ„œ μ‚¬μš©

 

 

// TODO

읡λͺ… λ‚΄λΆ€ 클래슀

쀑첩 클래슀

 

λ‚΄λΆ€ν΄λž˜μŠ€λŠ” outer class μ•ˆμ— κ΅¬ν˜„λ¨. λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 λ‚΄μš©μ„ μ‚¬μš©ν•  수 μžˆλ‹€. 심지어 private ν•œ λ©”μ†Œλ“œλž‘ λ³€μˆ˜λ„ μ‚¬μš© κ°€λŠ₯. λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” outer class에 μƒμ„±ν•œλ‹€. ν•˜μ§€λ§Œ 이젠 λžŒλ‹€κ°€ λ‚΄λΆ€ν΄λž˜μŠ€μ˜ 역할을 더 읽기 쉽고 더 κ°„κ²°ν•œ λ°©λ²•μœΌλ‘œ λŒ€μ²΄ν•  수 μžˆλ‹€. 

 


 

 

 

 

 

참고자료

https://zdnet.co.kr/view/?no=00000039134727

https://www.nextree.co.kr/p6960/

 

 

// TODO

μΆ”μ²œν•˜λŠ” μ±… : Taeyo's ASP, MS-SQL, ν† λΉ„μ˜ μŠ€ν”„λ§

뢀둝B λžŒλ‹€ 곡뢀 

 

λŒ“κΈ€