All :L

[Java] ๋‹คํ˜•์„ฑ (Polymorphism) ๋ณธ๋ฌธ

STUDY/Java

[Java] ๋‹คํ˜•์„ฑ (Polymorphism)

ofijwe 2024. 10. 24. 15:26
๋ฐ˜์‘ํ˜•

๐Ÿ“’ ์ ‘๊ทผ์ œํ•œ์ž ํ™œ์šฉ

1๏ธโƒฃ ๋ฐ์ดํ„ฐ ์€๋‹‰๊ณผ ๋ณดํ˜ธ (Encapsulation: OOP Is A PIE)

  • ์ •๋ณด ๋ณดํ˜ธ ๋Œ€์ฑ…
    • ๋ณ€์ˆ˜ private์œผ๋กœ ์ ‘๊ทผ ๋ง‰๊ธฐ
    • ๊ณต๊ฐœ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ํ†ต๋กœ ๋งˆ๋ จ (setter / getter) → ๋ฉ”์„œ๋“œ์— ์ •๋ณด ๋ณดํ˜ธ ๋กœ์ง ์ž‘์„ฑ

2๏ธโƒฃ ๊ฐ์ฒด ์ƒ์„ฑ ์ œ์–ด

  • ๊ฐ์ฒด ์ƒ์„ฑ ์ œํ•œ ์‹œ
    • ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ์ฒด ํ•„์š” X ๊ฒฝ์šฐ → like ๊ด€๋ฆฌ์ž ๊ฐ™์€ ๊ณ„์ •์ด ํ•„์š”ํ•  ๋•Œ
      • ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ X, ๊ธฐ๋Šฅ๋งŒ O
      • ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋ฅผ statelessํ•œ ๊ฐ์ฒด๋ผ๊ณ  ํ•จ.
    • ๊ฐ์ฒด๋ฅผ ๊ณ„์† ์ƒ์„ฑ / ์‚ญ์ œ ํ•˜๋Š”๋ฐ ๋งŽ์€ ๋น„์šฉ์ด ๋“ค์–ด ์žฌ์‚ฌ์šฉ์ด ์œ ๋ฆฌํ•œ ๊ฒฝ์šฐ

3๏ธโƒฃ Singleton ๋””์ž์ธ ํŒจํ„ด

  • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ํด๋ž˜์Šค๊ฐ€ ๋‹จ ํ•˜๋‚˜๋งŒ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ„ด
  • ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ์ž์— ์ ‘๊ทผ ๊ธˆ์ง€
    • ์ƒ์„ฑ์ž์˜ ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ private์œผ๋กœ ์„ค์ •
  • ๋‚ด๋ถ€์—์„œ private์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ง์ ‘ ๊ฐ์ฒด ์ƒ์„ฑ
    • ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ด๋ฏ€๋กœ private ์„ค์ •
  • ์™ธ๋ถ€์—์„œ private member์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ getter ์ƒ์„ฑ
    • setter๋Š” ๋ถˆํ•„์š”
  • ๊ฐ์ฒด ์—†์ด ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก getter์™€ ๋ณ€์ˆ˜์— static ์ถ”๊ฐ€
  • ์™ธ๋ถ€์—์„œ๋Š” ์–ธ์ œ๋‚˜ getter๋ฅผ ํ†ตํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ
    • ํ•˜๋‚˜์˜ ๊ฐ์ฒด ์‚ฌ์šฉ

๐Ÿ“’ ๋‹คํ˜•์„ฑ

1๏ธโƒฃ ๋‹คํ˜•์„ฑ (Polymorphism: OOP IS A PIE)

  • ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋งŽ์€ ํ˜•(ํƒ€์ž…)์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์„ฑ์งˆ
  • ์ƒ์† ๊ด€๊ณ„์— ์žˆ์„ ๋•Œ ์กฐ์ƒ ํด๋ž˜์Šค์˜ ํƒ€์ž…์œผ๋กœ ์ž์‹ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ๋ ˆํผ๋Ÿฐ์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • onlyOne์€ SpiderMan ํƒ€์ž…์ธ๊ฐ€? / SpiderMan ํƒ€์ž…์œผ๋กœ onlyOne์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? Y
    • onlyOne์€ Personํƒ€์ž…์ธ๊ฐ€? / Personํƒ€์ž…์œผ๋กœ onlyOne์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? Y
    • onlyOne์€ Objectํƒ€์ž…์ธ๊ฐ€? / Objectํƒ€์ž…์œผ๋กœ onlyOne์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? Y
    • onlyOne์€ Venomํƒ€์ž…์ธ๊ฐ€? / Venomํƒ€์ž…์œผ๋กœ onlyOne์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? N
  • Untitled

2๏ธโƒฃ ๋‹คํ˜•์„ฑ ํ™œ์šฉ1 - ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฐ์—ด

  • ๋ฐฐ์—ด์˜ ํŠน์ง•์€ ๊ฐ™์€ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌถ์Œ์œผ๋กœ ๋‹ค๋ฃธ.
  • ๋‹คํ˜•์„ฑ์œผ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌ
  • Object๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์กฐ์ƒ → ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ์ฒด๋ผ๋„ ์ €์žฅ ๊ฐ€๋Šฅ
  • ์ž๋ฐ”์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
    • Collection API ๋“ฑ์žฅ
  • ๊ธฐ๋ณธํ˜•์€ ๋‹ด์„ ์ˆ˜ X / but, wrapper class๋กœ ๋ณ€ํ™˜์ด ๋ผ์„œ ๋‹ด๊ธฐ๋Š” ๊ฒƒ์ž„.

3๏ธโƒฃ ๋‹คํ˜•์„ฑ ํ™œ์šฉ2 - ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋‹คํ˜•์„ฑ

  • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์œ„ํ•ด์„œ๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ผ์น˜ํ•ด์•ผํ•จ.
  • public void println(Person p) {...} public void println(SpiderMan sp) {...}
  • println์€ ์‚ฌ์‹ค Object๋ฅผ ๋ฐ›๋„๋ก ๋˜์–ด์žˆ์Œ.
  • if ์กฐ์ƒ์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฒ˜๋ฆฌ, ๊ฐ์ฒด ํƒ€์ž…์— ๋”ฐ๋ผ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค ํ•„์š” X
  • API์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ Object๋ฅผ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ → ์ฆ‰, ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ

๐Ÿ“’ ๊ฐ์ฒด์˜ ํ˜•๋ณ€ํ™˜

1๏ธโƒฃ ๋‹คํ˜•์„ฑ๊ณผ ์ฐธ์กฐํ˜• ๊ฐ์ฒด์˜ ํ˜•๋ณ€ํ™˜

  • ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๊ฒƒ๊ณผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์˜ ์ฐจ์ด
    • ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋”๋ผ๋„ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜ ํƒ€์ž…์— ๋”ฐ๋ผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ ์ œํ•œ
  • ์ฐธ์กฐํ˜• ๊ฐ์ฒด์˜ ํ˜• ๋ณ€ํ™˜
    • ํ•˜์œ„ ํƒ€์ž…์„ ์ƒ์œ„ ํƒ€์ž…์œผ๋กœ ํ˜• ๋ณ€ํ™˜ → ๋ฌต์‹œ์  ์ผ€์ŠคํŒ…
      • ์ž์† ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์กฐ์ƒ ํƒ€์ž…์œผ๋กœ ์ฐธ์กฐ → ํ˜• ๋ณ€ํ™˜ ์ƒ๋žต ๊ฐ€๋Šฅ
        • ์กฐ์ƒ์˜ ๋ชจ๋“  ๋‚ด์šฉ์ด ์ž์‹์— ์žˆ๊ธฐ ๋•Œ๋ฌธ
    • ์ƒ์œ„ ํƒ€์ž…์„ ํ•˜์œ„ ํƒ€์ž…์œผ๋กœ ํ˜• ๋ณ€ํ™˜ → ๋ช…์‹œ์  ์ผ€์ŠคํŒ…
      • ์กฐ์ƒ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ž์† ํƒ€์ž…์œผ๋กœ ์ฐธ์กฐ → ํ˜• ๋ณ€ํ™˜ ์ƒ๋žต ๋ถˆ๊ฐ€๋Šฅ
    • ๋ฌด๋Šฌ๋งŒ SpiderMan์ธ Person → ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์ฒด๋Š” fireWeb์ด ์—†์Œ.
    • ์กฐ์ƒ์„ ๋ฌด์ž‘์ • ์ž์†์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ X → instanceof ์—ฐ์‚ฐ์ž

2๏ธโƒฃ ์ฐธ์กฐ ๋ณ€์ˆ˜์˜ ๋ ˆ๋ฒจ์— ๋”ฐ๋ฅธ ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„ ์—ฐ๊ฒฐ

  • ์ •์  ๋ฐ”์ธ๋”ฉ(static binding)
    • ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ฐธ์กฐ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ์—ฐ๊ฒฐ์ด ๋‹ฌ๋ผ์ง
    • ์ƒ์† ๊ด€๊ณ„์—์„œ ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜(static/instance)๊ฐ€ ์ค‘๋ณต๋  ๋•Œ ๋˜๋Š” static method
  • ๋™์  ๋ฐ”์ธ๋”ฉ(dynamic binding)
    • ๋‹คํ˜•์„ฑ์„ ์ด์šฉํ•ด ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•  ๋•Œ runtime์— ๋ฉ”๋ชจ๋ฆฌ์˜ ์‹ค์ œ ๊ฐ์ฒด์˜ ํƒ€์ž…์œผ๋กœ ๊ฒฐ์ •
    • ์ƒ์† ๊ด€๊ณ„์—์„œ ๊ฐ์ฒด์˜ instance method๊ฐ€ ์žฌ์ •์˜ ๋˜์—ˆ์„ ๋•Œ ๋งˆ์ง€๋ง‰์— ์žฌ์ •์˜ ๋œ ์ž์‹ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋จ.
      • ์ตœ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ๋œ ์‹ค์ œ ๊ฐ์ฒด์˜ ์ตœ์ ํ™” ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ๋™์ž‘
        ์ •์ ๋ฐ”์ธ๋”ฉ ๋™์  ๋ฐ”์ธ๋”ฉ
      ์ˆ˜ํ–‰ ์†๋„ ์ƒ๋Œ€์ ์œผ๋กœ ๋น ๋ฆ„ ์ƒ๋Œ€์ ์œผ๋กœ ๋Š๋ฆผ
      ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ™œ์šฉ ํšจ์œจ ์ƒ๋Œ€์ ์œผ๋กœ ๋†’์Œ ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์Œ
      ๊ฐ์ฒด์ง€ํ–ฅ์    ๋‹คํ˜•์„ฑ์œผ๋กœ ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์šฉ๋„์— ๋”ฐ๋ฅธ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฉ”์„œ๋“œ ๊ตฌ์„ฑ
    • ์ƒ์œ„ ํƒ€์ž…์œผ๋กœ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜๋ก ํ™œ์šฉ๋„ ์ฆ๊ฐ€
    • but, ์ฝ”๋“œ ๋ณต์žก์„ฑ๋„ ์ฆ๊ฐ€

๐Ÿ“’ Object ๋ฉ”์„œ๋“œ ์žฌ์ •์˜

1๏ธโƒฃ Object ํด๋ž˜์Šค

  • ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค๋กœ ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์กฐ์ƒ
    • Object ๋ฉค๋ฒ„๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„

2๏ธโƒฃ toString()

  • ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }

3๏ธโƒฃ equals()

  • ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • public boolean equals(Object obj) { return (this == obj); }

4๏ธโƒฃ hashCode()

  • ๊ฐ์ฒด์˜ ํ•ด์‹œ ์ฝ”๋“œ : ์‹œ์Šคํ…œ์—์„œ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ •์ˆ˜ ๊ฐ’
  • equals ๋ฉ”์„œ๋“œ ์ •์˜ ์‹œ ๋ฐ˜๋“œ์‹œ hashCode ์žฌ์ •์˜ ํ•„์š”
  • HashSet, HashMap ๋“ฑ์—์„œ ๊ฐ์ฒด์˜ ๋™์ผ์„ฑ ํ™•์ธ์„ ์œ„ํ•ด ์‚ฌ์šฉ
  • Object class์— ์ •์˜๋œ hashCode
    • ๋ฏธ๋ฆฌ ์ž‘์„ฑ๋œ String or Number ๋“ฑ์— ์žฌ์ •์˜๋œ hashCode ํ™œ์šฉ ๊ถŒ์žฅ
    • public native int hashCode();
๋ฐ˜์‘ํ˜•

'STUDY > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] ์ œ๋„ค๋ฆญ (Generic)  (2) 2024.10.28
[Java] ์ธํ„ฐํŽ˜์ด์Šค (Interface)  (0) 2024.10.26
[Java] ์ƒ์† (Inheritance)  (0) 2024.10.20
[Java] ์ถ”์ƒํ™” (Abstraction)  (0) 2024.10.18
[Java] ์ž๋ฐ” ๊ธฐ๋ณธ  (0) 2024.10.16
Comments