λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Android & Kotlin

Overloading / Overriding

Overloading

의미

κ³Όμ ν•˜λ‹€, κ³ΌλΆ€ν•˜λΌλŠ” overload의 λœ»μ—μ„œ μœ μΆ”ν•΄λ³΄λ©΄ 무언가λ₯Ό 더 μ‹£λŠ”, μ–ΉλŠ” 그림이 그렀진닀. λΉ„μŠ·ν•˜κ²Œ μ˜€λ²„λ‘œλ”©λ„ ν•œ 클래슀 내에 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬ 개 μ •μ˜ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. λ©”μ„œλ“œλ“€μ΄ λͺ¨λ‘ 같은 일을 ν•˜μ§€λ§Œ λ§€κ°œλ³€μˆ˜λ₯Ό λ‹¬λ¦¬ν•΄μ•Όν•˜λŠ” 경우 λ©”μ„œλ“œ 이름은 κ°™κ³  λ§€κ°œλ³€μˆ˜λ₯Ό λ‹€λ₯΄κ²Œ ν•˜μ—¬ μ˜€λ²„λ‘œλ”©μ„ κ΅¬ν˜„ν•œλ‹€. 

쑰건

μ˜€λ²„λ‘œλ”©μ΄ μ„±λ¦½ν•˜κΈ° μœ„ν•œ 쑰건은 μ•„λž˜μ™€ κ°™λ‹€. 

  1. λ©”μ„œλ“œ 이름이 κ°™μ•„μ•Ό ν•œλ‹€.
  2. λ§€κ°œλ³€μˆ˜μ˜ 개수 λ˜λŠ” νƒ€μž…μ΄ 달라야 ν•œλ‹€.
  3. λ§€κ°œλ³€μˆ˜λŠ” κ°™κ³  λ¦¬ν„΄νƒ€μž…μ΄ λ‹€λ₯Έ κ²½μš°λŠ” μ˜€λ²„λ‘œλ”©μ΄ μ„±λ¦½λ˜μ§€ μ•ŠλŠ”λ‹€.
    (λ¦¬ν„΄νƒ€μž…μ€ μ˜€λ²„λ‘œλ”©μ„ κ΅¬ν˜„ν•˜λŠ”λ° μ•„λ¬΄λŸ° 영ν–₯을 주지 λͺ»ν•œλ‹€.)

μœ„μ˜ 쑰건듀을 λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•˜λ©΄ μ˜€λ²„λ‘œλ”©μ΄ μ•„λ‹Œ μ€‘λ³΅μ •μ˜λœ κ²ƒμœΌλ‘œ κ°„μ£Όλ˜μ–΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. 

μ˜ˆμ‹œ

int add(int a, int b) { return a+b; }
int add(int x, int y) { return a+b; }

μš°μ„  두 λ©”μ„œλ“œμ˜ 이름은 λͺ¨λ‘ add둜 성립 쑰건 1λ²ˆμ— λΆ€ν•©ν•œλ‹€. ν•˜μ§€λ§Œ 성립 쑰건 2λ²ˆμ„ 보면 λͺ¨λ‘ intν˜• λ³€μˆ˜ 2개λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›κ³ , intν˜•μœΌλ‘œ λ°˜ν™˜λ°›κΈ° λ•Œλ¬Έμ— λΆ€ν•©ν•˜μ§€ μ•ŠλŠ”λ‹€. 

int add(int a, int b) { return a+b; }
long add(int a, int b) { return (long)(a+b); }

μœ„μ™€ λΉ„μŠ·ν•˜κ²Œ 1번 μ‘°κ±΄μ—λŠ” λ§žμ§€λ§Œ 2번, 3번 쑰건 λͺ¨λ‘ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€. intν˜• 맀개 λ³€μˆ˜ 2개λ₯Ό λ°›κΈ° λ•Œλ¬Έμ— add(3,3)λ₯Ό ν˜ΈμΆœν•˜μ˜€μ„ λ•Œ μ–΄λ–€ λ©”μ„œλ“œκ°€ 호좜된 것인지 κ²°μ •ν•  수 μ—†λ‹€.

long add(int a, long b) { return a+b; }
long add(long a, int b) { return a+b; }

μ΄λ²ˆμ—” 1번 쑰건에 μΌμΉ˜ν•˜κ³  2λ²ˆμ€? λ§€κ°œλ³€μˆ˜μ˜ κ°―μˆ˜λŠ” 2개, νƒ€μž…μ€ λ‘˜λ‹€ int ν•˜λ‚˜, long ν•˜λ‚˜μ΄λ‹€. ν•˜μ§€λ§Œ μ„œλ‘œ μˆœμ„œκ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 호좜 μ‹œμ— λ§€κ°œλ³€μˆ˜μ˜ κ°’μœΌλ‘œ 호좜될 λ©”μ„œλ“œκ°€ ꡬ뢄이 λœλ‹€. 

μž₯점

λ©”μ„œλ“œκ°€ λ³€μˆ˜μ²˜λŸΌ λ©”μ„œλ“œμ˜ μ΄λ¦„λ§ŒμœΌλ‘œ κ΅¬λ³„λœλ‹€λ©΄ 근본적으둜 같은 κΈ°λŠ₯을 ν•˜λŠ” λ©”μ„œλ“œλ“€μ΄μ§€λ§Œ μ„œλ‘œ λ‹€λ₯Έ 이름을 κ°€μ Έμ•Ό ν•œλ‹€. λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•  λ•Œ μž‘λͺ…ν•˜κΈ°λ„ μ–΄λ ΅κ³  λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  λ•Œλ„ 이름을 일일이 κΈ°μ–΅ν•˜κΈ° μ–΄λ €μšΈ 것이닀. ν•˜μ§€λ§Œ 같은 κΈ°λŠ₯을 ν•˜λŠ” λ©”μ„œλ“œλ“€μ— λŒ€ν•΄ λ™μΌν•œ 이름을 μ“°κ²Œ ν•˜λ©΄ κΈ°μ–΅ν•˜κΈ°λ„ μš©μ΄ν•˜κ³  μ΄λ¦„λ§Œ 보고도 같은 κΈ°λŠ₯을 ν•  것이라고 μ˜ˆμΈ‘ν•˜κΈ°λ„ 쉽닀. 

 

Overriding

의미

쑰상 ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 λ©”μ„œλ“œμ˜ λ‚΄μš©μ„ λ³€κ²½ν•˜λŠ” 것이닀. 

쑰건

μžμ† ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©ν•˜λŠ” λ©”μ„œλ“œλŠ” 쑰상 클래슀의 λ©”μ„œλ“œμ™€ μ•„λž˜μ˜ 3가지 쑰건을 λ§Œμ‘±ν•΄μ•Όν•œλ‹€. 

  1. 이름이 κ°™μ•„μ•Ό ν•œλ‹€.
  2. λ§€κ°œλ³€μˆ˜κ°€ κ°™μ•„μ•Ό ν•œλ‹€.
  3. λ¦¬ν„΄νƒ€μž…μ΄ κ°™μ•„μ•Ό ν•œλ‹€.

즉, λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€κ°€ μ„œλ‘œ μΌμΉ˜ν•΄μ•Όν•œλ‹€. λ‹€λ§Œ μ ‘κ·Ό μ œμ–΄μžμ™€ μ˜ˆμ™ΈλŠ” μ œν•œλœ 쑰건 ν•˜μ—μ„œλ§Œ λ‹€λ₯΄κ²Œ λ³€κ²½ν•  수 μžˆλ‹€. μ•„λž˜λŠ” μ œν•œλœ 쑰건이닀.

  1. μ ‘κ·Ό μ œμ–΄μžλŠ” 쑰상 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ 쒁은 λ²”μœ„λ‘œ λ³€κ²½ν•  수 μ—†λ‹€.
    (쒁은 -> 넓은: private -> (default) -> protected -> pubilc)
  2. 쑰상 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ λ§Žμ€ 수의 μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•  수 μ—†λ‹€. 
  3. μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό static λ©”μ„œλ“œλ‘œ, static λ©”μ„œλ“œλ₯Ό μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ‘œ λ³€κ²½ν•  수 μ—†λ‹€. 
Class Parent {
	void parentMethod() throws IOException, SQLException {
    	// ..
    }
}

Class Child extends Parent {
	void parentMethod() throws Exception {
    	// ..
    }
}

Childμ—μ„œ Parent보닀 적은 수의 μ˜ˆμ™Έλ₯Ό μ„ μ–Έν–ˆμ§€λ§Œ Exception은 λͺ¨λ“  μ˜ˆμ™Έμ˜ 졜고 μ‘°μƒμœΌλ‘œ κ°€μž₯ λ§Žμ€ 개수의 μ˜ˆμ™Έλ₯Ό 던질 수 μžˆλ‹€. 
이것은 2번의 쑰건에 μœ„λ°°λœλ‹€. λ”°λΌμ„œ 단지 μ„ μ–Έν•œ μ˜ˆμ™Έμ˜ κ°―μˆ˜κ°€ 적으면 λ˜λŠ” 것이 μ•„λ‹ˆλ‹€. 

 

참고 자료

Java의 정석 (2nd Edition) - 남ꢁ μ„±

'Android & Kotlin' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[λ‚΄λ³΄λ‚΄λ²ˆ] Classes | Kotlin  (0) 2022.03.03
[λ‚΄λ³΄λ‚΄λ²ˆ] Inheritance | Kotlin  (0) 2022.03.02
Lesson 6: App Architecture (Persistence)  (0) 2022.02.23
Lesson 5: App Architecture(UI Layer)  (0) 2022.02.22
곡뢀 주제  (0) 2022.02.19