week11_jisoo - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

1. 동기 / 비동기 / λΈ”λ‘œν‚Ή / λ…ΌλΈ”λ‘œν‚Ή 비ꡐ

1.1 Blocking I/O와 Non-Blocking I/O

ν”„λ‘œκ·Έλž¨μ΄ 외뢀와 데이터λ₯Ό 주고받을 λ•Œ, μž…μΆœλ ₯을 κΈ°λ‹€λ¦¬λŠ” λ°©μ‹μ˜ λΆ„λ₯˜

Blocking-I/O : λ©ˆμΆ°μ„œ 기닀리기 μ™ΈλΆ€μ—μ„œ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ™μ•ˆ κ°€λ§Œνžˆ κΈ°λ‹€λ¦¬λŠ” 것. μ™ΈλΆ€μ˜ μž‘μ—… κ²°κ³Όλ₯Ό λ©ˆμΆ°μ„œ 기닀리기 λ•Œλ¬Έμ— κ²°κ³Όλ₯Ό κ·Έ μžλ¦¬μ—μ„œ λ°”λ‘œ 받을 수 있음.

호좜된 ν•¨μˆ˜κ°€ μžμ‹ μ˜ μž‘μ—…μ„ λͺ¨λ‘ 마칠 λ•ŒκΉŒμ§€ ν˜ΈμΆœν•œ ν•¨μˆ˜μ—κ²Œ μ œμ–΄κΆŒμ„ λ„˜κ²¨μ£Όμ§€ μ•Šκ³  λŒ€κΈ°ν•˜κ²Œ ν•˜λŠ” 방식.

Non-Blocking I/O : λ©ˆμΆ”μ§€ μ•Šκ³  λ‹€λ₯Έ μž‘μ—…μ„ ν•˜λ©΄μ„œ 기닀리기. μ™ΈλΆ€μ—μ„œ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ™μ•ˆ λ©ˆμΆ”μ§€ μ•Šκ³  λ‹€λ₯Έ 일을 ν•˜λ©΄μ„œ κΈ°λ‹€λ¦Ό.

즉 ν”„λ‘œκ·Έλž¨μ΄ κ²°κ³Όλ₯Ό μ–»μ–΄μ˜€κΈ°κΉŒμ§€ λ©ˆμΆ°μžˆμ§€ μ•Šκ³  λ‹€λ₯Έ 일을 ν•˜λ‹€κ°€ λ‚˜μ€‘μ— κ²°κ³Όλ₯Ό μ‚¬μš©ν•˜λŠ”κ²Œ κ°€λŠ₯ν•΄μ‘Œμ„ λ•Œ κ²°κ³Όλ₯Ό λ°›μ•„μ˜€λŠ” 방식. β†’ μžμ‹ μ˜ ν˜„μž¬ λ§₯락과 상관없이 μ™ΈλΆ€ μž‘μ—…κ³Ό 데이터λ₯Ό κ³΅μœ ν•  방법이 ν•„μš”ν•˜κ³  이λ₯Ό μœ„ν•œ μΆ”κ°€ κ΅¬ν˜„ ν•„μš”.

호좜된 ν•¨μˆ˜κ°€ 일단은 λ°”λ‘œ λ¦¬ν„΄ν•΄μ„œ ν˜ΈμΆœν•œ ν•¨μˆ˜μ—κ²Œ μ œμ–΄κΆŒμ„ λ„˜κ²¨μ£Όκ³ , ν˜ΈμΆœν•œ ν•¨μˆ˜κ°€ λ‹€λ₯Έ 일을 ν•  수 μžˆλŠ” 기회λ₯Ό μ£ΌλŠ” 방식.

동기와 비동기

  1. Sync와 Asyncλ₯Ό κ΅¬λΆ„ν•˜λŠ” 기쀀은 μž‘μ—… μˆœμ„œμ΄λ‹€.

동기식 λͺ¨λΈμ€ λͺ¨λ“  μž‘μ—…λ“€μ΄ 일련의 μˆœμ„œλ₯Ό λ”°λ₯΄λ©° κ·Έ μˆœμ„œμ— 맞게 λ™μž‘ν•œλ‹€. 즉, A,B,C μˆœμ„œλŒ€λ‘œ μž‘μ—…μ΄ μ‹œμž‘λ˜μ—ˆλ‹€λ©΄ A,B,C μˆœμ„œλ‘œ μž‘μ—…μ΄ λλ‚˜μ•Ό ν•œλ‹€.

μ„€λ Ή μ—¬λŸ¬ μž‘μ—…μ΄ λ™μ‹œμ— 처리되고 μžˆλ‹€κ³  해도, μž‘업이 μ²˜λ¦¬λ˜λŠ” λͺ¨λΈμ˜ μˆœμ„œκ°€ 보μž₯λœλ‹€λ©΄ μ΄λŠ” 동기식 처리 λͺ¨λΈμ΄λΌκ³  ν•  수 μžˆλ‹€.

반면 비동기식 λͺ¨λΈμ€ μž‘μ—…μ˜ μˆœμ„œκ°€ 보μž₯λ˜μ§€ μ•ŠλŠ”λ‹€.

λ§κ·ΈλŒ€λ‘œ 비동기(Asynchronous) 처리 λͺ¨λΈλ‘œ, A,B,C μˆœμ„œλ‘œ μž‘μ—…μ΄ μ‹œμž‘λ˜μ–΄λ„ A,B,C μˆœμ„œλ‘œ μž‘μ—…μ΄ λλ‚œλ‹€κ³  보μž₯ν•  수 μ—†λ‹€.

  1. Synchronous/AsynchronousλŠ” ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜μ˜ μž‘μ—… μ™„λ£Œ μ—¬λΆ€λ₯Ό λˆ„κ°€ 신경쓰냐가 관심사닀.

ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜μ—κ²Œ callback을 μ „λ‹¬ν•΄μ„œ, ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜μ˜ μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜κ°€ 전달받은 callback을 μ‹€ν–‰ν•˜κ³ , ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λŠ” μž‘μ—… μ™„λ£Œ μ—¬λΆ€λ₯Ό 신경쓰지 μ•ŠμœΌλ©΄ Asynchronousλ‹€.

반면, ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜μ˜ μž‘μ—… μ™„λ£Œ ν›„ 리턴을 κΈ°λ‹€λ¦¬κ±°λ‚˜, λ˜λŠ” ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ‘œλΆ€ν„° λ°”λ‘œ 리턴 받더라도 μž‘μ—… μ™„λ£Œ μ—¬λΆ€λ₯Ό ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜ 슀슀둜 계속 ν™•μΈν•˜λ©° μ‹ κ²½μ“°λ©΄ Synchronousλ‹€.

1.2 μ—¬λŸ¬κ°€μ§€ 일을 λ‹€λ£¨λŠ” 두 가지 방식, 병렬성(Parallelism)κ³Ό λ™μ‹œμ„±(Concurrency)

β‡’ 일꾼이 μΌν•˜λŠ” 방식

병렬성(Parallelism)은 μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” 일꾼을 물리적으둜 μ—¬λŸΏμ„ 두어 같은 μž‘μ—…μ„ λ™μ‹œμ— μˆ˜ν–‰ν•˜λŠ” 것을 λœ»ν•˜κ³ , λ™μ‹œμ„±(Concurrency)은 일꾼이 μ—¬λŸ¬κ°€μ§€ 일을 λ²ˆκ°ˆμ•„ κ°€λ©° μˆ˜ν–‰ν•˜λŠ” 것을 λœ»ν•œλ‹€. 병렬성은 일꾼이 μ—¬λŸΏμ΄μ–΄μ•Όλ§Œ μ„±λ¦½ν•˜λŠ” κ°œλ…μ΄μ§€λ§Œ, λ™μ‹œμ„±μ€ 일꾼의 수 μ™€λŠ” 상관 없이 μ˜€λ‘œμ§€ 일꾼이 μΌν•˜λŠ” 방식과 μ—°κ΄€ μžˆλ‹€.

λ™μ‹œμ„±μ€ 일꾼이 μž‘μ—…μ„ μ°¨λ‘€λŒ€λ‘œ 끝내가며 μ§„ν–‰ν•˜λŠ” 것이 μ•„λ‹Œ, 맑은 일이 λλ‚˜μ§€ μ•Šμ•˜μŒμ—λ„ μ—¬λŸ¬ 일을 ν•„μš”μ— 따라 λ²ˆκ°ˆμ•„ κ°€λ©΄μ„œ μ§„ν–‰ν•˜λŠ” λ°©μ‹μœΌλ‘œ μΌν•˜λŠ” 것을 λœ»ν•œλ‹€. ν•˜λ‚˜μ˜ 일꾼 λ§ŒμœΌλ‘œλ„ λ™μ‹œμ„±μ„ 확보할 수 있으며,μ—¬λŸ¬ 일꾼을 μ‚¬μš©ν•˜μ—¬ 병렬성을 ν™•λ³΄ν•˜κ³  이에 더해 λ™μ‹œμ„±μ„ ν™•λ³΄ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€. λ™μ‹œμ„±μ€ 병렬성과 μ‹œλ„ˆμ§€ νš¨κ³Όκ°€ 있기 λ•Œλ¬Έμ— ν›„μž 방식을 톡해 λ™μ‹œμ„±μ„ ν™•λ³΄ν•˜λŠ” κ²½μš°κ°€ 쑰금 더 μΌλ°˜μ μ΄λ‹€. μ£Όμ˜ν•΄μ•Όν•˜λŠ” 점은 병렬성과 λ™μ‹œμ„±μ„ 같이 ν™•λ³΄ν•˜λŠ” 경우 μ‹œλ„ˆμ§€ 효과λ₯Ό λ‚Ό 수 μžˆμ§€λ§Œ, λ‘˜ 사이에 μ˜μ‘΄μ„±μ€ μ „ν˜€ μ—†λ‹€λŠ” 것이닀.

λ™μ‹œμ„±μ€ μžμ›μ„ 효율적으둜 μ‚¬μš©ν•˜λŠ” 것이 λͺ©μ μ΄κ³ , 병렬성은 λ§Žμ€ μžμ›μ„ νˆ¬μžν•΄μ„œ 일의 μ²˜λ¦¬λŸ‰μ„ λŠ˜λ¦¬λŠ” 것이 λͺ©μ μ΄λ‹€.

2. μžλ°”μ—μ„œ μΆ”μƒν΄λž˜μŠ€λ³΄λ‹€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ”?

μΆ”μƒν΄λž˜μŠ€ & μΆ”μƒλ©”μ†Œλ“œ

μΆ”μƒν΄λž˜μŠ€λŠ” abstract λΌλŠ” ν‚€μ›Œλ“œμ™€ ν•¨κ»˜ μ„ μ–Έλœ ν΄λž˜μŠ€μ΄λ‹€ (좔상 λ©”μ†Œλ“œλ₯Ό 포함할 μˆ˜λ„ 있고 ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€). μΆ”μƒν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€ν™” 될 수 μ—†μ§€λ§Œ 상속될 수 μžˆλ‹€.

μΆ”μƒλ©”μ†Œλ“œλŠ” μ•„λž˜μ™€ 같이 λ©”μ†Œλ“œ κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” λ©”μ†Œλ“œμ΄λ‹€.

abstract void moveTo(double deltaX, double deltaY); μ–΄λ–€ ν΄λž˜μŠ€κ°€ μΆ”μƒλ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•œλ‹€λ©΄ μΆ”μƒν΄λž˜μŠ€λ‘œ μ„ μ–Έλ˜μ–΄μ•Ό ν•œλ‹€.

public abstract class GraphicObject {
   // declare fields
   // declare nonabstract methods
   abstract void draw();
}

μΆ”μƒν΄λž˜μŠ€λ₯Ό μƒμ†λ°›λŠ” ν΄λž˜μŠ€μ—μ„œλŠ” 일반적으둜 λΆ€λͺ¨ν΄λž˜μŠ€μ— μžˆλŠ” λͺ¨λ“  μΆ”μƒλ©”μ†Œλ“œλ“€μ„ κ΅¬ν˜„ν•œλ‹€. 그렇지 μ•Šμ€κ²½μš° ν•΄λ‹Ή μ„œλΈŒν΄λž˜μŠ€ λ˜ν•œ abstract 둜 μ„ μ–Έλ˜μ–΄μ•Ό ν•œλ‹€.

μΆ”μƒν΄λž˜μŠ€ vs μΈν„°νŽ˜μ΄μŠ€ (Java 8 κΈ°μ€€)

μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€λŠ” μΈμŠ€ν„΄μŠ€ν™” ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•˜λ©°, κ΅¬ν˜„λΆ€κ°€ μžˆλŠ” λ©”μ†Œλ“œμ™€ μ—†λŠ” λ©”μ†Œλ“œ λͺ¨λ‘ κ°€μ§ˆ 수 μžˆλ‹€λŠ” μ μ—μ„œ μœ μ‚¬ν•˜λ‹€. μΈν„°νŽ˜μ΄μŠ€μ—μ„œ λͺ¨λ“  λ³€μˆ˜λŠ” 기본적으둜 public static final 이며, λͺ¨λ“  λ©”μ†Œλ“œλŠ” public abstract 인 반면 μΆ”μƒν΄λž˜μŠ€μ—μ„œλŠ” static μ΄λ‚˜ final 이 μ•„λ‹Œ ν•„λ“œλ₯Ό 지정할 수 있고, public, protected, private λ©”μ†Œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” μ–΄λ–€ ν΄λž˜μŠ€λŠ”, λ‹€λ₯Έ μ—¬λŸ¬κ°œμ˜ μΈν„°νŽ˜μ΄μŠ€λ“€μ„ ν•¨κ»˜ κ΅¬ν˜„ν•  수 μžˆλ‹€. μΆ”μƒν΄λž˜μŠ€λŠ” 상속을 톡해 κ΅¬ν˜„λ˜λŠ”λ°, μžλ°”μ—μ„œλŠ” 닀쀑상속을 μ§€μ›ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μΆ”μƒν΄λž˜μŠ€λ₯Ό 상속받은 μ„œλΈŒν΄λž˜μŠ€λŠ” λ‹€λ₯Έ 클래슀λ₯Ό 상속받을 수 μ—†λ‹€.

μΆ”μƒν΄λž˜μŠ€, μΈν„°νŽ˜μ΄μŠ€μ˜ μ μ ˆν•œ μ‚¬μš© μΌ€μ΄μŠ€

μΆ”μƒν΄λž˜μŠ€

  • 관련성이 높은 클래슀 간에 μ½”λ“œλ₯Ό κ³΅μœ ν•˜κ³  싢은 경우
  • μΆ”μƒν΄λž˜μŠ€λ₯Ό 상속받은 ν΄λž˜μŠ€λ“€μ΄ κ³΅ν†΅μœΌλ‘œ κ°€μ§€λŠ” λ©”μ†Œλ“œμ™€ ν•„λ“œκ°€ λ§Žκ±°λ‚˜, public μ΄μ™Έμ˜ μ ‘κ·Όμ œμ–΄μž(protected, private) μ‚¬μš©μ΄ ν•„μš”ν•œ 경우
  • non-static, non-final ν•„λ“œ 선언이 ν•„μš”ν•œ 경우. 즉, 각 μΈμŠ€ν„΄μŠ€μ—μ„œ state 변경을 μœ„ν•œ λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•  수 μžˆλ‹€.

μΈν„°νŽ˜μ΄μŠ€

  • μ„œλ‘œ 관련성이 μ—†λŠ” ν΄λž˜μŠ€λ“€μ΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ²Œ λ˜λŠ” κ²½μš°μ— μ‚¬μš©ν•œλ‹€. 예λ₯Ό λ“€μ–΄, Comparable, Cloneable μΈν„°νŽ˜μ΄μŠ€λŠ” μ—¬λŸ¬ ν΄λž˜μŠ€λ“€μ—μ„œ κ΅¬ν˜„λ˜λŠ”λ°, κ΅¬ν˜„ν΄λž˜μŠ€λ“€ 간에 관련성이 μ—†λŠ” κ²½μš°κ°€ λŒ€λΆ€λΆ„μ΄λ‹€.
  • νŠΉμ • 데이터 νƒ€μž…μ˜ 행동을 λͺ…μ‹œν•˜κ³  싢은데, μ–΄λ””μ„œ κ·Έ 행동이 κ΅¬ν˜„λ˜λŠ”μ§€λŠ” 신경쓰지 μ•ŠλŠ” 경우.
  • 닀쀑상속을 ν—ˆμš©ν•˜κ³  싢은 경우

JDK μ—μ„œ μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ μ‚¬μš© μ˜ˆμ‹œ

JDK μ—μ„œ μΆ”μƒν΄λž˜μŠ€μ˜ λŒ€ν‘œμ μΈ μ˜ˆμ‹œλŠ” Collections Framework 의 일뢀인 AbstractMap 이닀. AbstractMap 의 μ„œλΈŒν΄λž˜μŠ€μΈ HashMap, TreeMap, ConcurrentHashMap μ—μ„œλŠ” AbstractMap 에 μ •μ˜λ˜μ–΄ μžˆλŠ” get, put, isEmpty, containsKey, containsValue λ“±μ˜ λ©”μ†Œλ“œλ₯Ό κ³΅μœ ν•œλ‹€.

μ—¬λŸ¬κ°œμ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” JDK 의 클래슀 μ˜ˆμ‹œλ‘œλŠ” HashMap 이 μžˆλ‹€. HashMap 은 Serializable, Cloneable, Map<K,V> λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ΄λ‹€. μœ„ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 HashMap 의 μΈμŠ€ν„΄μŠ€λŠ” λ³΅μ œκ°€λŠ₯ν•˜λ©°, 직렬화(byte stream 으둜 μ»¨λ²„νŒ…)κ°€ κ°€λŠ₯ν•˜λ©°, map 으둜써의 κΈ°λŠ₯을 κ°€μ§„λ‹€λŠ” 것을 μΆ”λ‘ ν•  수 μžˆλ‹€.

마무리

Java 8 μ΄μ „μ—λŠ” μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ μ°¨μ΄μ—μ„œ κ°€μž₯ 크게 느껴쑌던 뢀뢄은 μΈν„°νŽ˜μ΄μŠ€λŠ” λ©”μ†Œλ“œ κ΅¬ν˜„λΆ€λ₯Ό κ°€μ§ˆ 수 μ—†μ§€λ§Œ, μΆ”μƒν΄λž˜μŠ€μ—μ„œλŠ” κ°€μ§ˆ 수 μžˆλ‹€ λŠ” κ²ƒμ΄μ—ˆλ‹€. 이 큰 차이점 λ•Œλ¬Έμ— λ‹€λ₯Έ μ€‘μš”ν•œ 뢀뢄듀이 λˆˆμ— 띄지 μ•Šμ•˜λ‹€. ν•˜μ§€λ§Œ Java 8 λΆ€ν„° μΈν„°νŽ˜μ΄μŠ€λ„ default ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ λ©”μ†Œλ“œ κ΅¬ν˜„λΆ€λ₯Ό κ°€μ§ˆ 수 있게 λ˜λ©΄μ„œ μƒλ‹Ήνžˆ λΉ„μŠ·ν•΄μ‘Œλ‹€κ³  ν•  수 μžˆκ² μœΌλ‚˜, 기쑴에도 μžˆμ—ˆμ§€λ§Œ 크게 신경쓰지 μ•Šμ•˜λ˜(?) λ‘˜μ˜ 차이점이 λΆ„λͺ…ν•˜κ²Œ λ“œλŸ¬λ‚˜κ²Œ 된 것 κ°™λ‹€.

https://yaboong.github.io/java/2018/09/25/interface-vs-abstract-in-java8/

⚠️ **GitHub.com Fallback** ⚠️