Home > CS > 2024 > πŸ’Ύ [CS] ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 원리에 λŒ€ν•œ 이해도가 κ°œλ°œμžμ—κ²Œ μ€‘μš”ν•œ μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒμš”?

πŸ’Ύ [CS] ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 원리에 λŒ€ν•œ 이해도가 κ°œλ°œμžμ—κ²Œ μ€‘μš”ν•œ μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒμš”?
CS

πŸ’Ύ [CS] ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 원리에 λŒ€ν•œ 이해도가 κ°œλ°œμžμ—κ²Œ μ€‘μš”ν•œ μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒμš”?

  • ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 원리에 λŒ€ν•œ μ΄ν•΄λ„λŠ” κ°œλ°œμžμ—κ²Œ 맀우 μ€‘μš”ν•œλ°, μ΄λŠ” μ†Œν”„νŠΈμ›¨μ–΄ 개발의 기초적인 λΆ€λΆ„μ΄μž, 효율적인 문제 ν•΄κ²°κ³Ό μ΅œμ ν™”λœ μ½”λ“œ μž‘μ„±μ„ κ°€λŠ₯ν•˜κ²Œ ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
  • ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 원리λ₯Ό μ΄ν•΄ν•˜λ©΄, κ°œλ°œμžλŠ” λ‹¨μˆœνžˆ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것을 λ„˜μ–΄, ν”„λ‘œκ·Έλž¨μ΄ μ–΄λ–»κ²Œ λ™μž‘ν•˜κ³ , μ–΄λ””μ—μ„œ μ„±λŠ₯ λ¬Έμ œλ‚˜ 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλŠ”μ§€ μ˜ˆμΈ‘ν•˜κ³  ν•΄κ²°ν•  수 μžˆκ²Œλ©λ‹ˆλ‹€.

1️⃣ 효율적인 문제 ν•΄κ²°.

  • ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” 방식에 λŒ€ν•œ μ΄ν•΄λŠ” 버그λ₯Ό μ°Ύκ³  ν•΄κ²°ν•˜λŠ” 데 맀우 μ€‘μš”ν•©λ‹ˆλ‹€.
    • μ‹€ν–‰ 흐름을 μ΄ν•΄ν•˜λ©΄, ν”„λ‘œκ·Έλž¨μ—μ„œ μ–΄λ–€ 뢀뢄이 잘λͺ»λ˜μ—ˆλŠ”지, μ˜ˆμƒμΉ˜ λͺ»ν•œ λ™μž‘μ΄ μ™œ λ°œμƒν•˜λŠ”μ§€λ₯Ό 더 μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, λ©”λͺ¨λ¦¬ 관리, μŠ€νƒκ³Ό νž™μ˜ λ™μž‘ 원리, ν•¨μˆ˜ 호좜 방식 등을 μ•Œκ³  있으면 λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ‚˜ μŠ€νƒ μ˜€λ²„ν”Œλ‘œμ™€ 같은 문제λ₯Ό μ‹ μ†ν•˜κ²Œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ μŠ€νƒ μ˜€λ²„ν”Œλ‘œ(Stack Overflow)

ν”„λ‘œκ·Έλž¨μ΄ μ‚¬μš© κ°€λŠ₯ν•œ μŠ€νƒ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ΄ˆκ³Όν•˜μ—¬ 더 이상 데이터λ₯Ό μŒ“μ„ 수 μ—†κ²Œ λ˜λŠ” ν˜„μƒμ„ λ§ν•©λ‹ˆλ‹€.
이둜 인해 ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜κ±°λ‚˜ μ‹œμŠ€ν…œ μ—λŸ¬κ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.

πŸ“ μŠ€νƒ(Stack)

ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ ν•¨μˆ˜ 호좜, 둜컬 λ³€μˆ˜ 등을 μ €μž₯ν•˜λŠ” λ©”λͺ¨λ¦¬ μ—¬μ—­μž…λ‹ˆλ‹€.
μŠ€νƒμ€ ν›„μž…μ„ μΆœ(LIFO: Last In, First Out) λ°©μ‹μœΌλ‘œ μž‘λ™ν•˜λ©°, ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ ν•΄λ‹Ή ν•¨μˆ˜μ˜ 정보(예: λ§€κ°œλ³€μˆ˜, 둜컬 λ³€μˆ˜, λ°˜ν™˜ μ£Όμ†Œ λ“±)κ°€ μŠ€νƒμ— β€œμŒ“μ΄κ³ (push)”, ν•¨μˆ˜κ°€ μ’…λ£Œλ˜λ©΄ μŠ€νƒμ—μ„œ β€œμ œκ±°(pop)β€λ©λ‹ˆλ‹€.

2️⃣ μ„±λŠ₯ μ΅œμ ν™”.

  • ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 원리λ₯Ό 잘 μ•Œλ©΄, μ–΄λ””μ—μ„œ μ„±λŠ₯ λ¬Έμ œκ°€ λ°œμƒν•˜λŠ”μ§€ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, CPU μ‚¬μš©λ₯ , λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰, μž…μΆœλ ₯(I/O) μ„±λŠ₯κ³Ό 같은 λΆ€λΆ„μ—μ„œ 병λͺ© ν˜„μƒμ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” 원리λ₯Ό μ•Œλ©΄, 이런 μ„±λŠ₯ 문제λ₯Ό λΆ„μ„ν•˜κ³ , 더 λ‚˜μ€ μ„±λŠ₯을 μ–»κΈ° μœ„ν•΄ μ½”λ“œλ₯Ό μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„μ™€ 곡간 λ³΅μž‘λ„λ₯Ό κ³ λ €ν•˜κ³ , λ©”λͺ¨λ¦¬ ν• λ‹Ήκ³Ό ν•΄μ œκ°€ ν”„λ‘œκ·Έλž¨ μ„±λŠ₯에 λ―ΈμΉ˜λŠ” 영ν–₯을 μ΄ν•΄ν•˜λ©΄, 더 효율적인 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)

μ•Œκ³ λ¦¬μ¦˜μ΄ μž…λ ₯ 크기에 따라 μ‹€ν–‰ν•˜λŠ” μ—°μ‚°μ˜ 수λ₯Ό μΈ‘μ •ν•˜λŠ” μ§€ν‘œλ‘œ, μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„±μ„ ν‰κ°€ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)λŠ” 주둜 μž…λ ₯ 크기(n)κ°€ 컀질수둝 μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ μ‹œκ°„μ΄ μ–Όλ§ˆλ‚˜ 빨리 μ¦κ°€ν•˜λŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λ©°, λΉ…-였 ν‘œκΈ°λ²•(Big-O Notaiton)으둜 ν‘œν˜„λ©λ‹ˆλ‹€.

πŸ“ 곡간 λ³΅μž‘λ„(Space Complexity)

μ•Œκ³ λ¦¬μ¦˜μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ μ‚¬μš©ν•˜λŠ” λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 양을 μΈ‘μ •ν•˜λŠ” μ§€ν‘œμž…λ‹ˆλ‹€.
μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)κ°€ μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ μ‹œκ°„μ„ ν‰κ°€ν•˜λŠ” 것이라면, 곡간 λ³΅μž‘λ„(Space Complexity)λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄ μ–Όλ§ˆλ‚˜ λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜λŠ”μ§€λ₯Ό ν‰κ°€ν•˜λŠ” κ°œλ…μž…λ‹ˆλ‹€.

3️⃣ 디버깅과 였λ₯˜ 처리 λŠ₯λ ₯ ν–₯상.

  • ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” 원리λ₯Ό μ΄ν•΄ν•˜λ©΄ 디버깅이 훨씬 μ‰¬μ›Œμ§‘λ‹ˆλ‹€.
  • ν”„λ‘œκ·Έλž¨μ—μ„œ μ˜ˆμ™Έ(Exception)λ‚˜ μ—λŸ¬(Error)κ°€ λ°œμƒν•  λ•Œ, μ—λŸ¬ λ©”μ‹œμ§€λ‚˜ μŠ€νƒ 트레이슀λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ΄ μ–΄λ–»κ²Œ μ‹€ν–‰λ˜λ‹€κ°€ λ©ˆμ·„λŠ”μ§€ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • κ°œλ°œμžλŠ” 이 정보λ₯Ό 기반으둜 문제의 원인을 μ •ν™•νžˆ μ°Ύκ³  ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, λ©€ν‹°μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž¨μ—μ„œ λ™μ‹œμ„± 문제(λ°λ“œλ½, 레이슀 μ»¨λ””μ…˜ λ“±)κ°€ λ°œμƒν•˜λŠ” μ΄μœ μ™€ 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 락(Lock)μ΄λ‚˜ 동기화(Synchronization)λ₯Ό μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€λ₯Ό μ΄ν•΄ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

πŸ“ μŠ€νƒ 트레이슀(Stack Trace)

ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 μ˜ˆμ™Έ(Exception)κ°€ λ°œμƒν–ˆμ„ λ•Œ, μ˜ˆμ™Έκ°€ λ°œμƒν•œ 지점과 κ·Έ μ˜ˆμ™Έλ‘œ 이어진 ν•¨μˆ˜ 호좜 경둜λ₯Ό λ³΄μ—¬μ£ΌλŠ” 디버깅 μ •λ³΄μž…λ‹ˆλ‹€.
이λ₯Ό 톡해 κ°œλ°œμžλŠ” μ–΄λ–€ μ˜ˆμ™Έκ°€ μ–΄λ””μ„œ λ°œμƒν–ˆλŠ”μ§€, 그리고 κ·Έ μ˜ˆμ™Έκ°€ μ–΄λ–»κ²Œ λ°œμƒν–ˆλŠ”μ§€λ₯Ό νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4️⃣ μ΅œμ ν™”λœ λ©”λͺ¨λ¦¬ 관리.

  • λ©”λͺ¨λ¦¬ ꡬ쑰와 ν”„λ‘œκ·Έλž¨μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš© 방식을 μ΄ν•΄ν•˜λŠ” 것은 λ©”λͺ¨λ¦¬ νš¨μœ¨μ„ 높이고, λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ€‘μš”ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, μŠ€νƒ(Stack)κ³Ό νž™(Heap)의 차이, 객체의 생성과 μ†Œλ©Έ κ³Όμ •, 가비지 μ»¬λ ‰μ…˜(Garbage Collection)의 λ™μž‘ 방식 등을 μ•Œκ³  있으면, λ©”λͺ¨λ¦¬ μ‚¬μš©ν–₯을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 특히, μ–Έμ–΄λ§ˆλ‹€ λ©”λͺ¨λ¦¬ 관리 방식이 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ—, 각 μ–Έμ–΄μ˜ λ©”λͺ¨λ¦¬ 관리 νŠΉμ„±μ„ μ΄ν•΄ν•˜κ³  효율적으둜 ν™œμš©ν•˜λŠ” 것이 ν•„μš”ν•©λ‹ˆλ‹€.

πŸ“ 가비지 μ»¬λ ‰μ…˜(Garbage Collection)

더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό λ©”λͺ¨λ¦¬μ—μ„œ μžλ™μœΌλ‘œ ν•΄μ œν•˜λŠ” λ©”λͺ¨λ¦¬ 관리 κΈ°λ²•μž…λ‹ˆλ‹€.
μžλ°”(Java)와 같은 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ, κ°œλ°œμžκ°€ μˆ˜λ™μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•˜μ§€ μ•Šμ•„λ„ 가비지 컬렉터(Garbage Collector)κ°€ μžλ™μœΌλ‘œ λΆˆν•„μš”ν•œ 객체λ₯Ό κ°μ§€ν•˜κ³  λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•˜μ—¬ λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leak)λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.

5️⃣ ν”„λ‘œκ·Έλž¨ 섀계와 ꡬ쑰화.

  • ν”„λ‘œκ·Έλž¨μ΄ μ–΄λ–»κ²Œ μ‹€ν–‰λ˜λŠ”μ§€μ— λŒ€ν•œ μ΄ν•΄λŠ” 쒋은 섀계와 κ΅¬μ‘°ν™”λœ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λŠ” 데 ν•„μˆ˜μ μž…λ‹ˆλ‹€.
  • ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•ŒλŠ” λͺ¨λ“ˆν™”, 객체지ν–₯ 섀계, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° λ“±μ˜ κ°œλ…μ„ μ‚¬μš©ν•΄ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ²Œ λ˜λŠ”λ°, μ΄λŸ¬ν•œ κ°œλ…μ΄ μ‹€μ œ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ μ–΄λ–»κ²Œ 적용되고, νš¨μœ¨μ„±μ— μ–΄λ–€ 영ν–₯을 λ―ΈμΉ˜λŠ”μ§€ μ΄ν•΄ν•˜λ©΄ 더 λ‚˜μ€ ν”„λ‘œκ·Έλž¨μ„ 섀계할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 데이터 흐름, μ˜μ‘΄μ„± 관리, μΊ‘μŠν™” λ“±μ˜ κ°œλ…μ„ 잘 ν™œμš©ν•˜λ©΄ μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ‰¬μš΄ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ λͺ¨λ“ˆν™”(Modularization)

μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ—μ„œ ν”„λ‘œκ·Έλž¨μ„ 독립적이고 μž¬μ‚¬μš© κ°€λŠ₯ν•œ μž‘μ€ λ‹¨μœ„(λͺ¨λ“ˆ, Module)둜 λ‚˜λˆ„λŠ” 섀계 κΈ°λ²•μž…λ‹ˆλ‹€.
각 λͺ¨λ“ˆ(Module)λŠ” νŠΉμ • κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λ©°, λ‹€λ₯Έ λͺ¨λ“ˆ(Module)κ³Ό λͺ…ν™•ν•˜κ²Œ μ •μ˜λœ μΈν„°νŽ˜μ΄μŠ€(Interface)λ₯Ό 톡해 μƒν˜Έμž‘μš©ν•©λ‹ˆλ‹€.
λͺ¨λ“ˆν™”(Modularization)의 λͺ©μ μ€ μ½”λ“œμ˜ 가독성, μœ μ§€λ³΄μˆ˜μ„±, μž¬μ‚¬μš©μ„±μ„ 높이고, λ³΅μž‘ν•œ μ‹œμŠ€ν…œμ„ 더 μ‰½κ²Œ 관리할 수 μžˆλ„λ‘ ν•˜λŠ” 것 μž…λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ λͺ¨λ“ˆκ³Ό μ»΄ν¬λ„ŒνŠΈλ₯Ό 레고 블둝에 λΉ„μœ ν•΄λ³΄λ©΄?!
πŸ™‹β€β™‚οΈ μ†Œν”„νŠΈμ›¨μ–΄ κ³΅ν•™μ—μ„œμ˜ λͺ¨λ“ˆ.

πŸ“ 객체지ν–₯ 섀계(Object-Oriented Design, OOD)

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object-Oriented Programming, OOP)의 원칙과 κ°œλ…μ„ λ°”νƒ•μœΌλ‘œ, ν”„λ‘œκ·Έλž¨μ„ κ°μ²΄λΌλŠ” 독립적인 λ‹¨μœ„λ‘œ μ„€κ³„ν•˜λŠ” 방법을 μ˜λ―Έν•©λ‹ˆλ‹€.
객체지ν–₯ 섀계(Object-Oriented Design, OOD)λŠ” ν”„λ‘œκ·Έλž¨μ˜ ꡬ성 μš”μ†Œλ₯Ό ν΄λž˜μŠ€μ™€ 객체둜 λ‚˜λˆ„κ³ , 이듀 κ°„μ˜ 관계λ₯Ό μ •μ˜ν•˜μ—¬ 효율적이고 μž¬μ‚¬μš© κ°€λŠ₯ν•˜λ©° μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ‰¬μš΄ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ§Œλ“œλŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.

πŸ“ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP)

ν•¨μˆ˜λ₯Ό κΈ°λ³Έ ꡬ성 μš”μ†Œλ‘œ μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μž…λ‹ˆλ‹€.
ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” 순수 ν•¨μˆ˜μ™€ λ°μ΄ν„°μ˜ λΆˆλ³€μ„±μ„ κ°•μ‘°ν•˜λ©°, λΆ€μž‘μš©(Side Effect)을 ν”Όν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.
이λ₯Ό 톡해 μ½”λ“œμ˜ 가독성, μœ μ§€λ³΄μˆ˜μ„±, μž¬μ‚¬μš©μ„±μ„ 높이고, 병렬 μ²˜λ¦¬μ™€ 같은 μƒν™©μ—μ„œλ„ μ•ˆμ •μ μ΄κ³  예츑 κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

6️⃣ 컴퓨터 μ‹œμŠ€ν…œμ˜ 이해.

  • ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 원리λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” 컴퓨터 μ‹œμŠ€ν…œ 자체의 λ™μž‘ 방식에 λŒ€ν•œ 이해도 μ€‘μš”ν•©λ‹ˆλ‹€.
  • CPU μ—°μ‚°, λ©”λͺ¨λ¦¬ μ ‘κ·Ό, μΊμ‹œ λ©”λͺ¨λ¦¬, 파일 μ‹œμŠ€ν…œ, λ„€νŠΈμ›Œν¬ 톡신 λ“±μ˜ κ°œλ…μ„ 잘 μ΄ν•΄ν•˜κ³  있으면, ν”„λ‘œκ·Έλž¨μ΄ 컴퓨터 μ‹œμŠ€ν…œμ—μ„œ μ–΄λ–»κ²Œ μ‹€ν–‰λ˜κ³ , μ–΄λ–€ λΆ€λΆ„μ—μ„œ μ„±λŠ₯ λ¬Έμ œλ‚˜ μ˜€μœ κ°€ λ°œμƒν•  수 μžˆλŠ”μ§€λ₯Ό νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, I/O λ°”μš΄λ“œ μž‘μ—…(μž…μΆœλ ₯)κ³Ό CPU λ°”μš΄λ“œ μž‘μ—…(μ—°μ‚°)의 차이λ₯Ό μ΄ν•΄ν•˜λ©΄, 각기 λ‹€λ₯Έ μƒν™©μ—μ„œ μ–΄λ–€ μ΅œμ ν™”κ°€ ν•„μš”ν•œμ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ I/O λ°”μš΄λ“œ μž‘μ—…(I/O-Bound Task)

μž…μΆœλ ₯(Input/Output) μž‘μ—…μ˜ 속도에 μ˜ν•΄ 전체 μž‘μ—…μ˜ μ„±λŠ₯이 μ œν•œλ˜λŠ” μž‘μ—…μ„ μ˜λ―Έν•©λ‹ˆλ‹€.
즉, ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ CPUκ°€ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” 것보닀, 데이터λ₯Ό 읽고 μ“°λŠ” μž‘μ—…(I/O)μ—μ„œ 더 λ§Žμ€ μ‹œκ°„μ΄ μ†ŒλΉ„λ˜λŠ” 상황을 λ§ν•©λ‹ˆλ‹€

πŸ“ CPU λ°”μš΄λ“œ μž‘μ—…(CPU-Bound Task)

ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 속도가 CPU의 처리 속도에 μ˜ν•΄ μ œν•œλ˜λŠ” μž‘μ—…μ„ μ˜λ―Έν•©λ‹ˆλ‹€.
즉, μ—°μ‚°μ΄λ‚˜ 계산 μž‘μ—…μ΄ λ§Žμ•„μ„œ CPUκ°€ λŒ€λΆ€λΆ„μ˜ μ‹œκ°„μ„ 계산 μ²˜λ¦¬μ— μ‚¬μš©ν•˜λ©°, CPU의 μ„±λŠ₯이 전체 μž‘μ—…μ˜ μ„±λŠ₯을 κ²°μ •μ§“λŠ” μƒν™©μž…λ‹ˆλ‹€.

7️⃣ 더 λ‚˜μ€ μ†Œν”„νŠΈμ›¨μ–΄ 섀계.

  • ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 원리λ₯Ό μ΄ν•΄ν•˜λ©΄, 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object-Oriented Programming, OOP), ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Function Programming, FP), λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ°(Concurrency Programming) λ“± λ‹€μ–‘ν•œ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ„ μ΄ν•΄ν•˜κ³  이λ₯Ό μ μ ˆν•˜κ²Œ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈκ°μ²΄ 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object-Oriented Programming, OOP)λŠ” λ¬΄μ—‡μΌκΉŒμš”?

πŸ“ λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ°(Concurrency Programming)

μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν”„λ‘œκ·Έλž¨μ„ μ„€κ³„ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.
λ™μ‹œμ„±(Concurrency)은 μž‘μ—…μ˜ μ‹€ν–‰ 흐름을 겹치게 ν•˜κ±°λ‚˜ λ³‘λ ¬λ‘œ μ²˜λ¦¬ν•˜μ—¬, μ‹œμŠ€ν…œμ˜ νš¨μœ¨μ„±μ„ 높이고 처리 μ‹œκ°„μ„ μ€„μ΄λŠ”λ° 쀑점을 λ‘‘λ‹ˆλ‹€

λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ°(Concurrency Programming)은 λ©…ν‹°μŠ€λ ˆλ”©, λ©€ν‹°ν”„λ‘œμ„Έμ‹±μ„ ν¬ν•¨ν•˜μ—¬, 비동기 ν”„λ‘œκ·Έλž˜λ°κ³Ό 같은 λ‹€μ–‘ν•œ 기법을 μ‚¬μš©ν•˜μ—¬ μ‹œμŠ€ν…œ μžμ›μ„ μ΅œλŒ€ν•œ ν™œμš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

πŸ“ λ©€ν‹°μŠ€λ ˆλ”©(Multithreading)

ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ—¬λŸ¬ μŠ€λ ˆλ“œ(Thread)λ₯Ό λ™μ‹œμ— μ‹€ν–‰ν•˜μ—¬, λ³‘λ ¬λ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μž…λ‹ˆλ‹€.
μŠ€λ ˆλ“œ(Thread)λŠ” ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ μ‹€ν–‰ λ‹¨μœ„λ‘œ, 각 μŠ€λ ˆλ“œ(Thread)λŠ” λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜λ©°, 같은 λ©”λͺ¨λ¦¬ 곡간을 κ³΅μœ ν•©λ‹ˆλ‹€.
λ©€ν‹°μŠ€λ ˆλ”©(MultiThreading)을 톡해 ν”„λ‘œκ·Έλž¨μ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€κ³ , λ™μ‹œμ„± μž‘μ—…μ„ 효율적으둜 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ λ™μ‹œμ„± μž‘μ—…(Concurrency)

μ—¬λŸ¬ μž‘μ—…μ΄ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ 보이도둝 μ²˜λ¦¬ν•˜λŠ” 방식을 λ§ν•©λ‹ˆλ‹€.
μ‹€μ œλ‘œλŠ” μž‘μ—…λ“€μ΄ μ‹œκ°„μ„ λ‚˜λˆ κ°€λ©΄μ„œ λ²ˆκ°ˆμ•„ κ°€λ©° μ‹€ν–‰λ˜μ§€λ§Œ, μ‚¬μš©μžλŠ” 마치 μ—¬λŸ¬ μž‘μ—…μ΄ λ™μ‹œμ— μˆ˜ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ λŠλ‚„ 수 μžˆμŠ΅λ‹ˆλ‹€.
λ™μ‹œμ„±(Concurrency)은 μ‹œμŠ€ν…œμ˜ μžμ›μ„ 효율적으둜 μ‚¬μš©ν•˜κ³ , μž‘μ—…μ˜ 처리 속도λ₯Ό λ†’μ΄λŠ” 데 μ€‘μš”ν•œ κ°œλ…μž…λ‹ˆλ‹€.

πŸ“ λ©€ν‹° ν”„λ‘œμ„Έμ‹±(Multiprocessing)

μ—¬λŸ¬ 개의 ν”„λ‘œμ„ΈμŠ€λ₯Ό λ™μ‹œμ— μ‹€ν–‰ν•˜μ—¬ μž‘μ—…μ„ λ³‘λ ¬λ‘œ μ²˜λ¦¬ν•˜λŠ” 방식을 λ§ν•©λ‹ˆλ‹€.
λ©€ν‹° ν”„λ‘œμ„Έμ‹±μ€ λ©€ν‹°μ½”μ–΄ CPU ν™˜κ²½μ—μ„œ 각 ν”„λ‘œμ„ΈμŠ€κ°€ 독립적인 λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•˜λ©΄μ„œ, μ‹€μ œλ‘œ λ™μ‹œμ— μž‘μ—…μ„ μˆ˜ν–‰ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.
이 방식은 병렬성(Parallelism)을 ν™œμš©ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ˜ μ„±λŠ₯을 κ·ΉλŒ€ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ 비동기 ν”„λ‘œκ·Έλž˜λ°(Asynchornous Programming)

μž‘μ—…μ„ μ‹€ν–‰ν•  λ•Œ κ·Έ μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ 기닀리지 μ•Šκ³ , λ‹€λ₯Έ μž‘μ—…μ„ 계속 μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μž…λ‹ˆλ‹€.
비동기 ν”„λ‘œκ·Έλž˜λ°(Asynchornous Programming)을 톡해 I/O μž‘μ—…, λ„€νŠΈμ›Œν¬ μš”μ²­, 파일 읽기/μ“°κΈ°, λ°μ΄ν„°λ² μ΄μŠ€ 쑰회 λ“±μ˜ λŒ€κΈ° μ‹œκ°„μ΄ κΈ΄ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” λ™μ•ˆ ν”„λ‘œκ·Έλž¨μ΄ λ©ˆμΆ”μ§€ μ•Šκ³  λ‹€λ₯Έ μž‘μ—…μ„ λ³‘λ ¬λ‘œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
이λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ˜ 응닡성을 높이고 μžμ› νš¨μœ¨μ„±μ„ κ·ΉλŒ€ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ ν”„λ‘œμ„ΈμŠ€(Process)

μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨μ˜ μΈμŠ€ν„΄μŠ€(Instance)둜, 운영체제(Operating System, OS)κ°€ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  λ•Œ μƒμ„±λ˜λŠ” 독립적인 μž‘μ—… λ‹¨μœ„μž…λ‹ˆλ‹€.
ν”„λ‘œμ„ΈμŠ€(Process)λŠ” μ½”λ“œ(Code), 데이터(Data), λ©”λͺ¨λ¦¬(Memory), CPU μžμ›(CPU Resource)을 ν• λ‹Ήλ°›μ•„ ν”„λ‘œκ·Έλž¨μ˜ λͺ…령을 μˆ˜ν–‰ν•˜λ©°, 각각의 ν”„λ‘œμ„ΈμŠ€(Process)λŠ” μ„œλ‘œ 독립적인 λ©”λͺ¨λ¦¬ 곡간을 가지고 μ‹€ν–‰λ©λ‹ˆλ‹€.

8️⃣ μ˜ˆμ‹œ: Java ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 원리 μ΄ν•΄μ˜ μ€‘μš”μ„±.

  • Java ν”„λ‘œκ·Έλž¨μ„ 예둜 λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
    • Java의 λ©”λͺ¨λ¦¬ 관리.
      • JavaλŠ” 가비지 μ»¬λ ‰μ…˜(Garbage Collection)을 톡해 λ©”λͺ¨λ¦¬λ₯Ό μžλ™γ…‡λ‘œ κ΄€λ¦¬ν•˜μ§€λ§Œ, 가비지 μ»¬λ ‰μ…˜(Garbage Collection)의 λ™μž‘ 방식과 λ©”λͺ¨λ¦¬ μ˜μ—­(Heap, Stack, Metaspace λ“±)에 λŒ€ν•œ 이해가 μžˆμ–΄μ•Ό λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

        πŸ“ Metaspace

        Java 8λΆ€ν„° λ„μž…λœ λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ, 클래슀 메타데이터(Class Metadata)λ₯Ό μ €μž₯ν•˜λŠ” κ³΅κ°„μž…λ‹ˆλ‹€.
        Java 8 μ΄μ „μ—λŠ” Permanent Generation(영ꡬ μ˜μ—­, PermGen)μ΄λΌλŠ” 곡간에 클래슀 메타데이터λ₯Ό μ €μž₯ν–ˆμ§€λ§Œ, 이λ₯Ό κ°œμ„ ν•˜κΈ° μœ„ν•΄ Metaspace둜 λŒ€μ²΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

    • λ©€ν‹°μŠ€λ ˆλ“œμ™€ λ™μ‹œμ„±(Multithread and Concurrency)
      • Javaμ—μ„œ λ©€ν‹°μŠ€λ ˆλ“œ(Multithread) ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ, μŠ€λ ˆλ“œ(Thread)의 μ‹€ν–‰ μˆœμ„œ, 동기화, μŠ€λ ˆλ“œ ν’€ λ“±μ˜ κ°œλ…μ„ μ΄ν•΄ν•˜μ§€ λͺ»ν•˜λ©΄ λ°λ“œλ½(Deadlock)μ΄λ‚˜ 레이슀 μ»¨λ””μ…˜(Race Condition) 같은 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

        πŸ“ μŠ€λ ˆλ“œ ν’€(Thread Pool)

        미리 μƒμ„±λœ μŠ€λ ˆλ“œλ“€μ˜ λͺ¨μŒμœΌλ‘œ, ν•„μš”ν•  λ•Œλ§ˆλ‹€ μž‘μ—…(task)을 ν• λ‹Ήν•  수 μžˆλ„λ‘ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μŠ€λ ˆλ“œλ₯Ό κ΄€λ¦¬ν•˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.
        μŠ€λ ˆλ“œ ν’€(Thread Pool)을 μ‚¬μš©ν•˜λ©΄ μŠ€λ ˆλ“œ 생성과 μ†Œλ©Έμ— λ“œλŠ” λΉ„μš©μ„ 쀄이고, μ‹œμŠ€ν…œ μžμ›μ„ 효율적으둜 μ‚¬μš©ν•  수 있게 ν•©λ‹ˆλ‹€.

      πŸ“ λ°λ“œλ½(Deadlock)

      두 개 μ΄μƒμ˜ ν”„λ‘œμ„ΈμŠ€(Process)λ‚˜ μŠ€λ ˆλ“œ(Thread)κ°€ μ„œλ‘œ λ‹€λ₯Έ μžμ›μ„ 기닀리며 λ¬΄ν•œνžˆ λŒ€κΈ°ν•˜λŠ” μƒνƒœλ₯Ό λ§ν•©λ‹ˆλ‹€.
      λ°λ“œλ½(Deadlock)이 λ°œμƒν•˜λ©΄ κ΄€λ ¨λœ ν”„λ‘œμ„ΈμŠ€(Process)λ‚˜ μŠ€λ ˆλ“œ(Thread)듀은 λͺ¨λ‘ μ •μ§€λ˜λ©°, μž‘μ—…μ„ 진행할 수 μ—†λŠ” μƒνƒœμ— λΉ μ§€κ²Œ λ©λ‹ˆλ‹€.

      λ°λ“œλ½(Deadlock)은 λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ°(Concurrency Programming)μ—μ„œ λ°œμƒν•  수 μžˆλŠ” μ‹¬κ°ν•œ 문제둜, 특히 λ©€ν‹°μŠ€λ ˆλ”©(Multithreading) ν™˜κ²½μ—μ„œ 자주 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.
      예λ₯Ό λ“€μ–΄, 두 μŠ€λ ˆλ“œκ°€ μ„œλ‘œ μƒλŒ€λ°©μ΄ λ³΄μœ ν•œ μžμ›μ„ ν•„μš”λ‘œ ν•  λ•Œ, 두 μŠ€λ ˆλ“œλŠ” μ˜μ›νžˆ μžμ›μ„ 얻지 λͺ»ν•œ 채 λŒ€κΈ°ν•˜κ²Œ λ©λ‹ˆλ‹€.

      πŸ“ 레이슀 μ»¨λ””μ…˜(Race Condition)

      두 개 μ΄μƒμ˜ μŠ€λ ˆλ“œ λ˜λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— 곡유 μžμ›μ— μ ‘κ·Όν•˜κ³ , κ·Έ κ²°κ³Όκ°€ μ‹€ν–‰ μˆœμ„œμ— 따라 λ‹¬λΌμ§€λŠ” 상황을 λ§ν•©λ‹ˆλ‹€.
      즉, λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ°(Concurrency Programming)μ—μ„œ μŠ€λ ˆλ“œ(Thread)듀이 경쟁적으둜 μžμ›μ— μ ‘κ·Όν•  λ•Œ λ°œμƒν•˜λŠ” 문제둜, ν”„λ‘œκ·Έλž¨μ˜ μ˜λ„μΉ˜ μ•Šμ€ κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

      레이슀 μ»¨λ””μ…˜μ€ 특히 곡유 μžμ›(λ³€μˆ˜, 데이터 ꡬ쑰, 파일 λ“±)에 λŒ€ν•΄ 읽기와 μ“°κΈ° μž‘μ—…μ΄ λ™μ‹œμ— μ΄λ£¨μ–΄μ§€λŠ” κ²½μš°μ— λ°œμƒν•˜λ©°, 동기화가 μ œλŒ€λ‘œ 이루어지지 μ•ŠμœΌλ©΄ λ°μ΄ν„°μ˜ 일관성이 κΉ¨μ§€κ²Œ λ©λ‹ˆλ‹€.

    • JVM(Java Virtual Machine)의 μž‘λ™ 방식
      • JVM(Java Virtual Machine) 의 μ‹€ν–‰ 원리λ₯Ό μ΄ν•΄ν•˜λ©΄, ν”„λ‘œκ·Έλž¨μ˜ μ„±λŠ₯을 νŠœλ‹ν•˜κ³ , λ©”λͺ¨λ¦¬ 문제λ₯Ό ν•΄κ²°ν•˜λ©°, μ‹€ν–‰ ν™˜κ²½μ„ μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

9️⃣ μš”μ•½.

  • ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 원리에 λŒ€ν•œ μ΄ν•΄λŠ” 효율적인 문제 ν•΄κ²°, μ„±λŠ₯ μ΅œμ ν™”, 디버깅 λŠ₯λ ₯ ν–₯상, 섀계 λŠ₯λ ₯ ν–₯상 λ“± μ—¬λŸ¬ μΈ‘λ©΄μ—μ„œ κ°œλ°œμžμ—κ²Œ ν•„μˆ˜μ μž…λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 더 λ‚˜μ€ ν’ˆμ§ˆμ˜ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ°œλ°œν•  수 있으며, λ³΅μž‘ν•œ 문제λ₯Ό ν•΄κ²°ν•  λ•Œ 더 λ‚˜μ€ μ ‘κ·Ό 방식을 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν”„λ‘œκ·Έλž¨μ΄ μ–΄λ–»κ²Œ μ‹€ν–‰λ˜κ³ , λ©”λͺ¨λ¦¬μ™€ CPU μžμ›μ„ μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€λ₯Ό μ΄ν•΄ν•˜λŠ” 것은 λ‹¨μˆœνžˆ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것을 λ„˜μ–΄μ„œ, 전방적인 μ†Œν”„νŠΈμ›¨μ–΄ ν’ˆμ§ˆμ„ λ†’μ΄λŠ” 데 핡심적인 역할을 ν•©λ‹ˆλ‹€.