[Java] 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)μ΄λž€?

2023. 8. 4. 16:29Β·πŸ’» Language/Java : μžλ°”
728x90
728x90

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)

  • 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ λͺ…λ Ήμ–΄μ˜ λͺ©λ‘μœΌλ‘œ λ³΄λŠ” μ‹œκ°μ—μ„œ λ²—μ–΄λ‚˜ μ—¬λŸ¬ 개의 λ…λ¦½λœ λ‹¨μœ„, 즉 “객체”λ“€μ˜ λͺ¨μž„μœΌλ‘œ νŒŒμ•…ν•˜κ³ μž ν•˜λŠ” 것.
  • 각각의 κ°μ²΄λŠ” λ©”μ‹œμ§€λ₯Ό μ£Όκ³ λ°›κ³  데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€. (ν˜‘λ ₯)
  • ν”„λ‘œκ·Έλž¨μ„ μœ μ—°ν•˜κ³  변경이 μš©μ΄ν•˜κ²Œ λ§Œλ“€κΈ° λ•Œλ¬Έμ— λŒ€κ·œλͺ¨ SW κ°œλ°œμ— 많이 μ‚¬μš©λœλ‹€.

πŸ’‘ μœ μ—°ν•˜κ³  변경이 용이? 레고 λΈ”λŸ­ μ‘°λ¦½ν•˜λ“―, 컴퓨터 λΆ€ν’ˆ κ°ˆμ•„ λΌμš°λ“―, ν‚€λ³΄λ“œ/마우슀 λ°”κΎΈλ“― μ»΄ν¬λ„ŒνŠΈλ₯Ό 쉽고 μœ μ—°ν•˜κ²Œ λ³€κ²½ν•˜λ©΄μ„œ κ°œλ°œν•  수 μžˆλŠ” 방법

 

 

μ—­ν• κ³Ό κ΅¬ν˜„μ˜ 뢄리

  • ν΄λΌμ΄μ–ΈνŠΈ
    • λŒ€μƒμ˜ μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)만 μ•Œλ©΄ 됨
    • κ΅¬ν˜„ λŒ€μƒμ˜ λ‚΄λΆ€ ꡬ쑰λ₯Ό λͺ°λΌλ„ 됨
    • κ΅¬ν˜„ λŒ€μƒμ˜ λ‚΄λΆ€ ꡬ쑰가 λ³€κ²½λ˜μ–΄λ„ 영ν–₯을 λ°›μ§€ μ•ŠμŒ
    • κ΅¬ν˜„ λŒ€μƒ 자체λ₯Ό 변경해도 영ν–₯을 λ°›μ§€ μ•ŠμŒ
  • μžλ°” μ–Έμ–΄μ˜ λ‹€ν˜•μ„±μ„ ν™œμš©
    객체λ₯Ό 섀계할 λ•Œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ λͺ…ν™•νžˆ 뢄리 → 역할을 λ¨Όμ € λΆ€μ—¬ν•˜κ³  역할을 μˆ˜ν–‰ν•˜λŠ” κ΅¬ν˜„ 객체 λ§Œλ“€κΈ°
    • μ—­ν•  : μΈν„°νŽ˜μ΄μŠ€ [κ΅¬ν˜„λ³΄λ‹€ μ€‘μš”]
    • κ΅¬ν˜„ : μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀, κ΅¬ν˜„ 객체
  • 객체λ₯Ό 섀계할 λ•Œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ λͺ…ν™•νžˆ 뢄리

 

λ‹€ν˜•μ„±μ˜ 본질

  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 객체 μΈμŠ€ν„΄μŠ€λ₯Ό μ‹€ν–‰ μ‹œμ μ— μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ‹€.
    → λ‹€ν˜•μ„±μ˜ λ³Έμ§ˆμ„ μ΄ν•΄ν•˜λ €λ©΄ ν˜‘λ ₯μ΄λΌλŠ” 객체 μ‚¬μ΄μ˜ κ΄€κ³„μ—μ„œ μ‹œμž‘ν•΄μ•Ό 함!
  • ν΄λΌμ΄μ–ΈνŠΈλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ , μ„œλ²„μ˜ κ΅¬ν˜„ κΈ°λŠ₯을 μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ‹€.

 

ν•œκ³„μ 

μ—­ν• (μΈν„°νŽ˜μ΄μŠ€) μžμ²΄κ°€ λ³€ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈ, μ„œλ²„ λͺ¨λ‘μ— 큰 변경이 λ°œμƒν•œλ‹€.

→ μΈν„°νŽ˜μ΄μŠ€κ°€ λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ 잘 κ΅¬ν˜„ν•˜λŠ” 것이 μ‹€λ ₯ 쒋은 개발자.

  • Example
    • μžλ™μ°¨λ₯Ό λΉ„ν–‰κΈ°λ‘œ λ³€κ²½ν•œλ‹€λ©΄?
    • λŒ€λ³Έ μžμ²΄κ°€ λ³€κ²½λœλ‹€λ©΄?
    • USB μΈν„°νŽ˜μ΄μŠ€κ°€ λ³€κ²½λœλ‹€λ©΄?

 


 

SOLID

ν΄λ¦°μ½”λ“œλ‘œ 유λͺ…ν•œ λ‘œλ²„νŠΈ λ§ˆν‹΄μ΄ 쒋은 객체 μ§€ν–₯ μ„€κ³„μ˜ 5κ°€μ§€ 원칙을 μ •λ¦¬ν•œ 것

 

SRP(Single Responsibility Principle) : 단일 μ±…μž„ 원칙

  • ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Ό ν•œλ‹€.
    변경이 μžˆμ„ λ•Œ ν•˜λ‚˜μ˜ μ§€μ λ§Œ λ³€κ²½ν•  수 μžˆλ‹€λ©΄ SRPκ°€ 잘 μ§€μΌœμ§„ 것.

 

OCP(Open-Closed Principle) : 개방-폐쇄 원칙

  • μ†Œν”„νŠΈμ›¨μ–΄ μš”μ†ŒλŠ” ν™•μž₯μ—λŠ” μ—΄λ €μžˆμœΌλ‚˜, λ³€κ²½μ—λŠ” λ‹«ν˜€μžˆμ–΄μ•Ό ν•œλ‹€.
    ν™•μž₯을 ν•˜λ €λ©΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ μƒˆλ‘œμš΄ 클래슀λ₯Ό ν•˜λ‚˜ λ§Œλ“€μ–΄μ„œ μƒˆλ‘œμš΄ κΈ°λŠ₯을 κ΅¬ν˜„.
  • 문제점 : λ‹€ν˜•μ„±μ„ ν™œμš©ν•˜μ—¬ κ΅¬ν˜„ν•΄λ„ OCPκ°€ μ§€μΌœμ§€μ§€ μ•ŠλŠ” 문제 λ°œμƒ
    MemberRepository m = new MemoryMemberRepository(); //κΈ°μ‘΄ μ½”λ“œ
    MemberRepository m = new JdbcMemberRepository();   //λ³€κ²½ μ½”λ“œ
    
     → 객체λ₯Ό μƒμ„±ν•˜κ³  연관관계λ₯Ό λ§Ίμ–΄μ£ΌλŠ” λ³„λ„μ˜ 쑰립, μ„€μ •μžκ°€ ν•„μš”ν•¨ (Spring의 μ—­ν• )
  • MemberService ν΄λΌμ΄μ–ΈνŠΈκ°€ κ΅¬ν˜„ 클래슀λ₯Ό 직접 μ„ νƒν•¨μœΌλ‘œμ„œ κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν•˜λ €λ©΄ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό λ³€κ²½ν•΄μ•Ό ν•˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•œλ‹€. (변경에 λ‹«ν˜€μžˆμ§€ μ•ŠμŒ)

 

LSP(Liskov Substitution Principle) : λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙

  • κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ 정확성을 κΉ¨λœ¨λ¦¬μ§€ μ•ŠμœΌλ©΄μ„œ ν•˜μœ„ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ‘œ λ°”κΏ€ 수 μžˆμ–΄μ•Ό ν•œλ‹€.

λ‹€ν˜•μ„±μ—μ„œ ν•˜μœ„ ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€ κ·œμ•½μ„ λ‹€ μ§€μΌœμ•Ό ν•œλ‹€λŠ” 것, λ‹€ν˜•μ„±μ„ μ§€μ›ν•˜κΈ° μœ„ν•œ 원칙, μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ κ΅¬ν˜„μ²΄λŠ” λ―Ώκ³  μ‚¬μš©ν•˜λ €λ©΄ 이 원칙이 ν•„μš”ν•˜λ‹€. → λ‹¨μˆœνžˆ ‘μ»΄νŒŒμΌμ— μ„±κ³΅ν•˜λŠ” 것’을 λ„˜μ–΄μ„œλŠ” 이야기. μ»΄νŒŒμΌμ— μ„±κ³΅ν•˜κ³  λ§κ³ λŠ” 무관함

  • EX) μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€μ˜ 엑셀은 ‘μ•žμœΌλ‘œ 가라’λŠ” κΈ°λŠ₯. λ’€λ‘œ κ°€κ²Œ κ΅¬ν˜„ν•˜λ©΄ LSP μœ„λ°˜μ΄λ―€λ‘œ λŠλ¦¬λ”λΌλ„ μ•žμœΌλ‘œ 가야함.

 

ISP(Interface Segregation Principle) : μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙

  • νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€ μ—¬λŸ¬ κ°œκ°€ λ²”μš© μΈν„°νŽ˜μ΄μŠ€κ°€ ν•˜λ‚˜λ³΄λ‹€ λ‚«λ‹€.
  • μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€ : μš΄μ „/μ •λΉ„λ‘œ 뢄리
  • μ‚¬μš©μž ν΄λΌμ΄μ–ΈνŠΈ : μš΄μ „μž/μ •λΉ„μ‚¬λ‘œ 뢄리

λΆ„λ¦¬μ‹œ μ •λΉ„ μΈν„°νŽ˜μ΄μŠ€ μžμ²΄κ°€ 변해도 μš΄μ „μž ν΄λΌμ΄μ–ΈνŠΈμ— 영ν–₯을 μ£Όμ§€ μ•ŠμŒ.

→ μΈν„°νŽ˜μ΄μŠ€κ°€ λͺ…ν™•ν•΄μ§€κ³ , λŒ€μ²΄ κ°€λŠ₯성이 λ†’μ•„μ§„λ‹€.

 

DIP(Dependency Inversion Principle) : μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙

  • ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 좔상화에 μ˜μ‘΄ν•΄μ•Όμ§€, ꡬ체화에 μ˜μ‘΄ν•˜λ©΄ μ•ˆλœλ‹€.

κ΅¬ν˜„ ν΄λž˜μŠ€μ— μ˜μ‘΄ν•˜μ§€ 말고 μΈν„°νŽ˜μ΄μŠ€μ— 의쑴. (μ˜μ‘΄μ„± μ£Όμž…μ„ 톡해 원칙을 지킬 수 있음) → ‘역할에 μ˜μ‘΄ν•˜κ²Œ ν•΄μ•Ό ν•œλ‹€’와 같은 κ°œλ…. 객체 세상도 ν΄λΌμ΄μ–ΈνŠΈκ°€ μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•΄μ•Ό κ΅¬ν˜„μ²΄λ₯Ό μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ‹€. κ΅¬ν˜„μ²΄μ— μ˜μ‘΄ν•˜λ©΄ 변경이 μ–΄λ €μ›Œμ§€κΈ° λ•Œλ¬Έ

  • 문제점 : OCP와 λ™μΌν•˜κ²Œ MemberServiceλŠ” μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜μ§€λ§Œ κ΅¬ν˜„μ²΄μ—λ„ μ˜μ‘΄ν•¨
  • // MemberServiceλŠ” MemberRepository와 MemoryMemberRepository λͺ¨λ‘λ₯Ό μ•Œκ³  있음 MemberRepository m = new MemoryMemberRepository();

 


 

μŠ€ν”„λ§κ³Ό 객체 μ§€ν–₯

λ‹€ν˜•μ„±μ„ κ·ΉλŒ€ν™”ν•˜μ—¬ μ΄μš©ν•  수 있게 λ„μ™€μ£Όλ―€λ‘œ, λ‹€ν˜•μ„±μ΄ κ°€μž₯ μ€‘μš”ν•¨.

  • μ œμ–΄μ˜ μ—­μ „(IoC), μ˜μ‘΄κ΄€κ³„ μ£Όμž…(DI) : λ‹€ν˜•μ„±μ„ ν™œμš©ν•˜μ—¬ μ—­ν• κ³Ό κ΅¬ν˜„μ„ νŽΈλ¦¬ν•˜κ²Œ λ‹€λ£° 수 μžˆλ„λ‘ 지원
  • 레고 λΈ”λŸ­ μ‘°λ¦½ν•˜λ“― κ΅¬ν˜„μ„ νŽΈλ¦¬ν•˜κ²Œ λ³€κ²½ν•  수 있음
그런데, λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” OCP, DIPλ₯Ό 지킬 수 μ—†λ‹€. (κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν•  λ•Œ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ„ ν•¨κ»˜ λ³€κ²½λ˜κΈ° λ•Œλ¬Έ)
μŠ€ν”„λ§μ€ μ•„λž˜ 기술둜 λ‹€ν˜•μ„± + OCP, DIPλ₯Ό κ°€λŠ₯ν•˜κ²Œ μ§€μ›ν•œλ‹€.
  • DI(Dependency Injection) : μ˜μ‘΄κ΄€κ³„, μ˜μ‘΄μ„± μ£Όμž…
  • DI μ»¨ν…Œμ΄λ„ˆ 제곡

→ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ˜ λ³€κ²½ 없이 κΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆλ‹€. (마치 λΆ€ν’ˆμ„ κ΅μ²΄ν•˜λ“―μ΄ 개발 κ°€λŠ₯)

 

⚠️ μΈν„°νŽ˜μ΄μŠ€μ˜ μ‚¬μš©μ΄ 무쑰건 쒋은 κ²ƒλ§Œμ€ μ•„λ‹ˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ„μž…ν•˜λ©΄ μΆ”μƒν™”λΌλŠ” λΉ„μš©μ΄ λ°œμƒν•œλ‹€. (κ°œλ°œμžκ°€ λŸ°νƒ€μž„ > μΈν„°νŽ˜μ΄μŠ€ > κ΅¬ν˜„μ²΄λ₯Ό μˆœμ„œλŒ€λ‘œ μ°Ύμ•„ ν™•μΈν•˜λŠ” λ“±) λ•Œλ¬Έμ— κΈ°λŠ₯을 ν™•μž₯ν•  κ°€λŠ₯성이 μ—†λ‹€λ©΄ ꡬ체 클래슀λ₯Ό 직접 μ‚¬μš©ν•˜κ³  ν–₯ν›„ κΌ­ ν•„μš”ν•  λ•Œ λ¦¬νŒ©ν† λ§μ„ 톡해 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ„μž…ν•˜λŠ” 것도 방법이닀.

728x90
320x100
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)

'πŸ’» Language > Java : μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Java] μ½”λ”© ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ Java μž…μΆœλ ₯ ν•¨μˆ˜  (0) 2024.11.15
[Java] 자료ꡬ쑰 - λ°°μ—΄, μ—°κ²°λ¦¬μŠ€νŠΈ, μŠ€νƒ, 큐, νž™, 트리, κ·Έλž˜ν”„, ν•΄μ‹œ  (0) 2024.11.12
[Java] Java Platform(Java SE/EE/ME/FX)μ΄λž€?  (0) 2023.07.28
[Java] EJB(Enterprise Java Beans)λž€?  (0) 2023.07.27
[E] org.eclipse.swt.SWTError: No more handles  (0) 2023.06.09
'πŸ’» Language/Java : μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Java] μ½”λ”© ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ Java μž…μΆœλ ₯ ν•¨μˆ˜
  • [Java] 자료ꡬ쑰 - λ°°μ—΄, μ—°κ²°λ¦¬μŠ€νŠΈ, μŠ€νƒ, 큐, νž™, 트리, κ·Έλž˜ν”„, ν•΄μ‹œ
  • [Java] Java Platform(Java SE/EE/ME/FX)μ΄λž€?
  • [Java] EJB(Enterprise Java Beans)λž€?
mxnxeonx
mxnxeonx
"μ•„, 이거 λ­μ˜€λ”λΌ"λ₯Ό ν•˜μ§€ μ•ŠκΈ°μœ„ν•œ 일기μž₯.
  • mxnxeonx
    MJ's Development Diary
    mxnxeonx
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (154)
      • πŸ’» Language (43)
        • Java : μžλ°” (18)
        • Python : 파이썬 (9)
        • ROS : λ‘œλ΄‡μ‹œμŠ€ν…œ (9)
        • Android : μ•ˆλ“œλ‘œμ΄λ“œ (4)
        • JavaScript : μžλ°”μŠ€ν¬λ¦½νŠΈ (2)
      • 🌐 Environment (19)
        • IDE : ν†΅ν•©κ°œλ°œν™˜κ²½ (9)
        • Virtual : κ°€μƒν™˜κ²½ (10)
      • βš™ Framework (12)
        • Vue-λ·° (3)
        • Spring-μŠ€ν”„λ§ (7)
      • πŸ’Ύ DataBase (18)
      • 🌌 OS (36)
        • Linux-λ¦¬λˆ…μŠ€ (36)
      • πŸ’¬ CI · CD (7)
        • Git : κΉƒ (7)
      • πŸ“ƒ ETC (3)
      • πŸ€– AI (4)
  • 링크

    • GitHub
  • 인기 κΈ€

  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
mxnxeonx
[Java] 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)μ΄λž€?
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”