πŸ“‚ ν”„λ‘œκ·Έλž˜λ°

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

Amenable 2023. 6. 17. 13:58

  객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°κ³Ό μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.

 

πŸ“™ 1. 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° (Object Oriented Programming, OOP)

πŸ“Œ 1. κ°œλ…

  객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λž€ 객체듀이 λͺ¨μ—¬μ„œ μƒν˜Έ ν˜‘λ ₯ν•˜λ©΄μ„œ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μ˜ ν”„λ‘œκ·Έλž˜λ° 섀계 방법을 λ§ν•œλ‹€.

πŸ“Œ 2. νŠΉμ§•

  객체지ν–₯μ–Έμ–΄μ˜ νŠΉμ§•μœΌλ‘œλŠ” μΊ‘μŠν™”(Encapsulation), 상속(Inheritance), λ‹€ν˜•μ„±(Polymorphism), 좔상화(Abstraction)κ°€ μžˆλ‹€.

πŸ”Ž 1. μΊ‘μŠν™”(Encapsulation)

  • λ‚΄λΆ€λ₯Ό 캑슐처럼 κ°μ‹Έμ„œ κ·Έ λ‚΄λΆ€λ₯Ό λ³΄ν˜Έν•˜κ³  λ³Ό 수 μ—†κ²Œ ν•˜λŠ” 것을 λ§ν•œλ‹€.
  • 데이터와 κΈ°λŠ₯을 ν•˜λ‚˜λ‘œ λ¬Άμ–΄μ„œ κ΄€λ¦¬ν•˜κ²Œ λœλ‹€.
  • μ‹€μ œλ‘œ κ΅¬ν˜„λ˜λŠ” 뢀뢄을 μ™ΈλΆ€λ‘œ λ“œλŸ¬λ‚˜μ§€ μ•Šλ„λ‘ ν•˜μ—¬ 정보λ₯Ό 은닉할 수 μžˆλ‹€.

πŸ”Ž 2. 상속(Inheritance)

  • μƒμœ„ 클래슀의 속성(λ³€μˆ˜)κ³Ό κΈ°λŠ₯(λ©”μ„œλ“œ)을 μž¬μ‚¬μš©ν•˜μ—¬(상속) ν•˜μœ„ ν΄λž˜μŠ€κ°€ μ „λΆ€ λ¬Όλ €λ°›λŠ” 것을 λ§ν•œλ‹€.
  • 상속은 μ½”λ“œμ˜ 쀑볡 μž‘μ„±μ„ λ°©μ§€ν•˜κ³ , μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•¨μœΌλ‘œμ¨ μ½”λ“œ μž‘μ„±μ— λ“œλŠ” μ‹œκ°„κ³Ό λΉ„μš©μ„ 쀄인닀.

πŸ”Ž 3. λ‹€ν˜•μ„±(Polymorphism)

  • 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œκ°€ 클래슀 ν˜Ήμ€ 객체에 따라 λ‹€λ₯΄κ²Œ κ΅¬ν˜„λ˜λŠ” 것을 λ§ν•œλ‹€.
  • κΈ°λŠ₯을 ν™•μž₯ν•˜κ±°λ‚˜ λ³€κ²½ν•˜λŠ” 것을 κ°€λŠ₯ν•˜κ²Œ ν•΄μ€€λ‹€.
  • Javaλ₯Ό 예둜 λ“€λ©΄, 상속받은 ν•˜μœ„ ν΄λž˜μŠ€κ°€ λ©”μ„œλ“œμ˜ λ‚΄μš©λ§Œ λ³€κ²½(μž¬μ •μ˜) ν•˜λŠ” μ˜€λ²„λΌμ΄λ”©(Overriding)κ³Ό λ©”μ„œλ“œμ˜ 이름은 κ°™κ³  λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜λ‚˜ νƒ€μž…μ΄ λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μž¬μ •μ˜ ν•˜λŠ” μ˜€λ²„λ‘œλ”©(Overloading)이 μžˆλ‹€.

πŸ”Ž 4. 좔상화(Abstraction)

  • 객체의 곡톡적인 속성과 κΈ°λŠ₯을 μΆ”μΆœν•˜μ—¬ μ •μ˜ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.
  • 클래슀λ₯Ό μ •μ˜ν•  λ•Œ λΆˆν•„μš”ν•œ 뢀뢄듀을 μƒλž΅ν•˜κ³  객체의 속성 쀑 μ€‘μš”ν•œ κ²ƒμ—λ§Œ 쀑점을 두어 κ°œλž΅ν™” ν•˜λŠ” 것을 λ§ν•œλ‹€.

πŸ“Œ 3. μž₯점

  • μž¬μ‚¬μš©μ„±
    상속을 톡해 ν”„λ‘œκ·Έλž˜λ° μ‹œ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„ 높일 수 μžˆλ‹€. 
  • 생산성 ν–₯상
    잘 μ„€κ³„λœ 클래슀λ₯Ό λ§Œλ“€μ–΄μ„œ 독립적인 객체λ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ 개발의 생산성을 ν–₯상할 수 μžˆλ‹€.
    μžμ—°μ μΈ λͺ¨λΈλ§
    우리 μΌμƒμƒν™œμ˜ λͺ¨μŠ΅μ˜ ꡬ쑰가 객체에 μžμ—°μŠ€λŸ½κ²Œ λ…Ήμ•„λ“€μ–΄ 있기 λ•Œλ¬Έμ— μƒκ°ν•˜κ³  μžˆλŠ” 것을 κ·ΈλŒ€λ‘œ μžμ—°μŠ€λŸ½κ²Œ κ΅¬ν˜„ κ°€λŠ₯ν•˜λ‹€.
  • μœ μ§€λ³΄μˆ˜μ˜ μš°μˆ˜μ„±
    ν”„λ‘œκ·Έλž¨ μˆ˜μ • μ‹œ μΆ”κ°€, μˆ˜μ •μ„ ν•˜λ”λΌλ„ μΊ‘μŠν™”λ₯Ό 톡해 μ£Όλ³€ 영ν–₯이 적기 λ•Œλ¬Έμ— μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ„œ 맀우 경제적이라 ν•  수 μžˆλ‹€.

πŸ“Œ 4. 단점

  • 느린 개발 속도
    λͺ¨λ“  객체의 μ—­ν• κ³Ό κΈ°λŠ₯을 이해해야 ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž˜λ°μ— λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λœλ‹€.
  • 느린 μ‹€ν–‰ 속도
    객체지ν–₯μ–Έμ–΄μ˜ 처리 μ†λ„λŠ” μ ˆμ°¨μ§€ν–₯언어보닀 λŠλ¦½λ‹ˆλ‹€.

πŸ“Œ 5. μ’…λ₯˜

  C++, Java, Python, C#, Swift, Kotlin,...

 

 

πŸ“™ 2. μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° (Procedural Programming, PP)

πŸ“Œ 1. κ°œλ…

  μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λž€ 순차적인 μ²˜λ¦¬κ°€ μ€‘μš”μ‹œλ˜λ©° ν”„λ‘œκ·Έλž¨ 전체가 유기적으둜 μ—°κ²°λ˜λ„λ‘ λ§Œλ“œλŠ” ν”„λ‘œκ·Έλž˜λ° 기법을 λ§ν•œλ‹€.

πŸ“Œ 2. νŠΉμ§•

  • ν”„λ‘œκ·Έλž¨μ˜ μˆœμ„œμ™€ 흐름을 λ¨Όμ € μ„Έμš°κ³  ν•„μš”ν•œ μžλ£Œκ΅¬μ‘°μ™€ ν•¨μˆ˜λ“€μ„ μ„€κ³„ν•œλ‹€.

πŸ“Œ 3. μž₯점

  • λΉ λ₯Έ μ‹€ν–‰ 속도
    초기 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ 컴퓨터 μ²˜λ¦¬κ΅¬μ‘°μ™€ λΉ„μŠ·ν•˜μ—¬ μ‹€ν–‰ 속도가 빠름

πŸ“Œ 4. 단점

  • μœ μ§€λ³΄μˆ˜μ™€ λ””λ²„κΉ…μ˜ 어렀움
    λͺ¨λ“  κ΅¬μ„±μš”μ†Œκ°€ 유기적으둜 μ—°κ²°λ˜μ–΄ μžˆλ‹€λŠ” 말은, ν•˜λ‚˜κ°€ κ³ μž₯ 났을 λ•Œ μ‹œμŠ€ν…œ 전체가 κ³ μž₯λ‚œλ‹€λŠ” λœ»μ΄λ‹€.
    λ˜ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 일뢀뢄이 μ•„λ‹Œ μ‹œμŠ€ν…œ 전체λ₯Ό μˆ˜λ¦¬ν•΄μ•Ό ν•œλ‹€λŠ” 말이기도 ν•˜λ‹€.
    κ·Έλž˜μ„œ μ ˆμ°¨μ§€ν–₯μ–Έμ–΄λŠ” μ΄λŸ¬ν•œ μœ μ§€ λ³΄μˆ˜κ°€ 맀우 κΉŒλ‹€λ‘œμš΄ 편이며, 특히 디버깅 과정이 μ–΄λ ΅λ‹€.
  • μ—„κ²©ν•œ μˆœμ„œκ°€ μ •ν•΄μ Έ μžˆμ–΄ λΉ„νš¨μœ¨μ 
    μ‹€ν–‰ μˆœμ„œκ°€ μ •ν•΄μ Έ μžˆμœΌλ―€λ‘œ μ½”λ“œμ˜ μˆœμ„œκ°€ λ°”λ€Œλ©΄ λ™μΌν•œ κ²°κ³Όλ₯Ό 보μž₯ν•˜κΈ° μ–΄λ ΅λ‹€.
    즉, μ–Έμ–΄μ˜ μœ΅ν†΅μ„±μ΄ λΆ€μ‘±ν•˜μ—¬ 생상 효율이 λ–¨μ–΄μ§„λ‹€.

πŸ“Œ 5. μ’…λ₯˜

  C, Visual Basic, Fortran, Pascal, ...

 

 

πŸ“™ 3. κ°μ²΄μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°κ³Ό μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° λΉ„ꡐ

  객체지ν–₯의 λ°˜λŒ€λŠ” μ ˆμ°¨μ§€ν–₯이 μ•„λ‹ˆκ³ , μ ˆμ°¨μ§€ν–₯의 λ°˜λŒ€λŠ” 객체지ν–₯이 μ•„λ‹ˆλ‹€.

  객체지ν–₯ μ–Έμ–΄λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄, ν•„μš”ν•œ κ°μ²΄λ“€μ˜ μ’…λ₯˜μ™€ 속성 등이 더 쀑점이 λ˜λŠ” 것이고, μ ˆμ°¨μ§€ν–₯ μ–Έμ–΄λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄, μ ˆμ°¨κ°€ 더 쀑점이 λ˜λŠ” 것이닀.

 

  κ°μ²΄λŠ” λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό 좔상화 과정을 톡해 μ’€ 더 λͺ¨λ“ˆν™” ν•œ 도ꡬ에 λΆˆκ³Όν•˜λ‹€. λͺ¨λ“ˆν™” ν•¨μœΌλ‘œμ¨ 객체지ν–₯이 지닐 수 μžˆλŠ” 강점인 정보은닉화, 상속 및 λ‹€ν˜•μ„±μ„ ν†΅ν•œ ν™•μž₯μ„±κ³Ό μž¬μ‚¬μš©, 이λ₯Ό κΈ°λ°˜ν•œ 생산성과 μœ μ§€λ³΄μˆ˜μ˜ μš©μ΄μ„±μ΄ OOP의 μ§„μ •ν•œ νŠΉμ§•μ΄μž 정체성일지도 λͺ¨λ₯Έλ‹€.

  ν•˜μ§€λ§Œ, 객체지ν–₯ 섀계도 λ§ˆμ΄λ„ˆμŠ€κ°€ λ˜λŠ” κ²½μš°κ°€ μžˆλ‹€.

  객체지ν–₯도 ν”„λ‘œμ νŠΈκ°€ 컀지면 λ‹€λ₯Έ λ©΄μ—μ„œ λ³΅μž‘ν•΄μ§€λ©°, μ»΄ν“¨ν„°μ˜ 관점이 μ•„λ‹ˆκΈ°μ— μƒλŒ€μ μœΌλ‘œ 느린 κ²½μš°κ°€ μžˆλ‹€. 객체지ν–₯적 κΈ°λŠ₯듀은 λ§ˆλ²•μ΄ μ•„λ‹ˆλΌ 컴퓨터 상에 미리 κ΅¬ν˜„λ˜μ–΄ μžˆλŠ” μ½”λ“œ λ­‰μΉ˜μ— λΆˆκ³Όν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. λ‹€λ§Œ λΌμ΄λΈŒλŸ¬λ¦¬ν™”λ˜μ–΄ κΈ°λŠ₯으둜써 μ œκ³΅λ˜κΈ°μ— κ·Έκ±Έ μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ¨Έ μž…μž₯μ—μ„œ νŽΈν•  뿐이닀.

 

  λ˜ν•œ, 객체 μ§€ν–₯ 섀계 μ „λž΅μ€ λ°˜λ“œμ‹œ 객체 μ§€ν–₯ μ–Έμ–΄(Java, kotlin λ“±)μ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” 것은 μ•„λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 객체 μ§€ν–₯ μ–Έμ–΄λŠ” μ•„λ‹ˆμ§€λ§Œ, λ”°λ‘œ 클래슀(class) 문법을 μ§€μ›ν•˜λŠ” κ²ƒμ²˜λŸΌ λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” 객체 μ§€ν–₯ μ–Έμ–΄ 방식을 μ§€μ›ν•˜κ³  μžˆλ‹€.

  즉, 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° κ°œλ…μ„ 배우면, κ·Έ κΈ°μˆ μ„ λ‹€μ–‘ν•œ λ§Žμ€ 언어에 μ μš©ν•  수 μžˆλ‹€λŠ” λœ»μ΄κΈ°λ„ ν•˜λ‹€.

 

ν•΄λ‹Ή 글은
TechYeon λ‹˜μ˜ '객체지ν–₯(OOP) VS μ ˆμ°¨μ§€ν–₯(PP) ν”„λ‘œκ·Έλž˜λ°',
HP_Factory λ‹˜μ˜ 'μ ˆμ°¨μ§€ν–₯(Procedural Programming), 객체지ν–₯(Object Oriented Programming) μž₯단점 및 차이점',
Blackvill λ‹˜μ˜ '[CS] 절차 μ§€ν–₯ vs 객체 μ§€ν–₯',
Incheol λ‹˜μ˜ '객체지ν–₯κ³Ό μ ˆμ°¨μ§€ν–₯',
Inpa λ‹˜μ˜ '객체 μ§€ν–₯ κ°œλ…κ³Ό 좔상화 μ™„λ²½ μ΄ν•΄ν•˜κΈ°'
λ₯Ό μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.