All :L
[Java] ๋คํ์ฑ (Polymorphism) ๋ณธ๋ฌธ
๋ฐ์ํ
๐ ์ ๊ทผ์ ํ์ ํ์ฉ
1๏ธโฃ ๋ฐ์ดํฐ ์๋๊ณผ ๋ณดํธ (Encapsulation: OOP Is A PIE)
- ์ ๋ณด ๋ณดํธ ๋์ฑ
- ๋ณ์ private์ผ๋ก ์ ๊ทผ ๋ง๊ธฐ
- ๊ณต๊ฐ๋๋ ๋ฉ์๋๋ฅผ ํตํด ์ ๊ทผ ํต๋ก ๋ง๋ จ (setter / getter) → ๋ฉ์๋์ ์ ๋ณด ๋ณดํธ ๋ก์ง ์์ฑ
2๏ธโฃ ๊ฐ์ฒด ์์ฑ ์ ์ด
- ๊ฐ์ฒด ์์ฑ ์ ํ ์
- ์ฌ๋ฌ ๊ฐ ๊ฐ์ฒด ํ์ X ๊ฒฝ์ฐ → like ๊ด๋ฆฌ์ ๊ฐ์ ๊ณ์ ์ด ํ์ํ ๋
- ์์ ๊ฐ๋ฅํ ๋ฉค๋ฒ ๋ณ์ X, ๊ธฐ๋ฅ๋ง O
- ์ด๋ฌํ ๊ฐ์ฒด๋ฅผ statelessํ ๊ฐ์ฒด๋ผ๊ณ ํจ.
- ๊ฐ์ฒด๋ฅผ ๊ณ์ ์์ฑ / ์ญ์ ํ๋๋ฐ ๋ง์ ๋น์ฉ์ด ๋ค์ด ์ฌ์ฌ์ฉ์ด ์ ๋ฆฌํ ๊ฒฝ์ฐ
- ์ฌ๋ฌ ๊ฐ ๊ฐ์ฒด ํ์ X ๊ฒฝ์ฐ → like ๊ด๋ฆฌ์ ๊ฐ์ ๊ณ์ ์ด ํ์ํ ๋
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
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