[Java] ๋คํ์ฑ(Polymorphism)์ ๋ํด
by rlaehddnd0422๋คํ์ฑ์ ๋ง์ ๋ค, ๋ชจ์ ํ์ ์จ์ ์ฌ๋ฌ ๊ฐ์ง ํํ๊ฐ ๋ ์ ์๋ ์ฑ์ง์ ๋งํฉ๋๋ค.
์๋ฐ์ ๋คํ์ฑ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์์ ๋ค์์ ๋งํฉ๋๋ค.
- ํ๋์ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ๋ฌ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ ์ฑ์ง
- ํ๋์ ์ฐธ์กฐ๋ณ์๋ก ์ฌ๋ฌ ํ์ ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋ ์ฑ์ง
์๋ฐ์์ ๋คํ์ฑ์ด ์ค์ํ ์ด์
- ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ : ๋คํ์ฑ์ ํตํด ํ๋์ ์ธํฐํ์ด์ค๋ ํด๋์ค๋ฅผ ์ฌ๋ฌ ๋ค๋ฅธ ํด๋์ค๋ก ๊ตฌํํ ์ ์์ผ๋ฏ๋ก ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ์ต๋๋ค.
- ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ : ์๋ก์ด ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์์คํ ์ ์ฝ๊ฒ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์ธํฐํ์ด์ค์ ์ถ์ ํด๋์ค ํ์ฉ : ๋คํ์ฑ์ ์ธํฐํ์ด์ค์ ์ถ์ ํด๋์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ฌ ์ค๊ณ ํจํด์ ์ ์ฉํ๊ณ ์ฝ๋์ ์ถ์ํ ์์ค์ ๋์ผ ์ ์์ต๋๋ค.
- ๋ค์ํ ๊ฐ์ฒด ์ฒ๋ฆฌ : ๋คํ์ฑ์ ํตํด ๊ฐ์ฒด๋ค์ ํต์ผ๋ ๋ฐฉ์์ผ๋ก ๋ค๋ฃฐ ์ ์์ผ๋ฏ๋ก, ์ฝ๋๊ฐ ๋ณด๋ค ์ผ๋ฐํ๋๊ณ ๊ฐ์ฒด ๊ฐ์ ์ํธ์์ฉ์ด ๋จ์ํ๋ฉ๋๋ค.
- ๋ค์ค ์์ ๋์ฒด : ์๋ฐ์์๋ ๋ค์ค ์์์ ์ง์ํ์ง ์์ง๋ง ๋คํ์ฑ์ ํตํด ์ฌ๋ฌ ํด๋์ค๋ก๋ถํฐ ์์๋ฐ์ ๊ฒ์ฒ๋ผ ๋์ํ ์ ์์ด์ ๋ค์ค ์์์ ์ผ๋ถ ๋จ์ ์ ๊ทน๋ณตํ ์ ์์ต๋๋ค.
- ๋์ ๋ฐ์ธ๋ฉ : ๋คํ์ฑ์ ์ด์ฉํ๋ฉด ์คํ ์๊ฐ์ ๊ฐ์ฒด์ ์ค์ ํ์ ์ ๋ฐ๋ผ ๋ฉ์๋๊ฐ ๋์ ์ผ๋ก ๋ฐ์ธ๋ฉ๋๋ฏ๋ก ์คํ ์ค์ ์ ์ฐํ ๋์์ ๊ตฌํํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ด์ ๋ก ๋คํ์ฑ์ ์๋ฐ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ํต์ฌ ๊ฐ๋ ์ค ํ๋์ด๋ฉฐ, ์ฝ๋์ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ํฅ์์ํค๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
์ด ์ ์์์ ๋ํด ์ค๋ช ํ๋ฉด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ์คํด์ค ํ์ ๊ณผ ์ฐธ์กฐ ํ์ ์ ์ผ์น์์ผ ์ฌ์ฉํ์ต๋๋ค.
Parent p = new Parent();
Child c = new Child();
์ด๋ ๊ฒ ์ธ์คํด์ค ํ์ ๊ณผ ์ฐธ์กฐ ๋ณ์ ํ์ ์ ์ผ์น์์ผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด์ง๋ง, ์์๊ด๊ณ์ ์์ ๊ฒฝ์ฐ์ ์กฐ์ ํด๋์ค ํ์ ์ ์ฐธ์กฐ๋ณ์๊ฐ ์์ ํ์ ์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋๋ก ํ๋๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
Child c = new Child();
// ์ฐธ์กฐ๋ณ์ - Child
// ์ธ์คํด์ค ํ์
Child
// ์ด๋ ๊ฒ ์ผ์น์์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์
Parent p = new Child();
// ์ฐธ์กฐ๋ณ์ - Parent : ๋ถ๋ชจ ํด๋์ค
// ์ธ์คํด์ค ํ์
- Child : ์์ ํด๋์ค
ํ์ ์ ์ผ์น์์ผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋ถ๋ชจ ํ์ ์ผ๋ก ์ฐธ์กฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ฐจ์ด๋ ๋ฌด์์ผ๊น?
์์๊ด๊ณ๋ฅผ ๊ฐ๋ Tv (Parent) ํด๋์ค์ CaptionTv (Child) ํด๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
์ด ๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ด๋ ๊ฒ ์ ์ธํ ์ ์์ต๋๋ค.
Tv t = new CaptionTv(); // (1)
CaptionTv s = new CaptionTv(); // (2)
(1)์ ๊ฒฝ์ฐ์๋ ์ธ์คํด์ค ํ์ ์ด ์์ ํด๋์ค CaptionTv๋ผ๊ณ ํด๋ ๋ชจ๋ ๋ฉค๋ฒ๋ฅผ ์ฌ์ฉํ ์๋ ์๊ณ , ์ค์ง ๋ถ๋ชจ ํด๋์ค์ ๋ํ ๋ฉค๋ฒ์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
+ ์์ ํด๋์ค์ ๋ฉค๋ฒ์ธ caption() ๋ฉ์๋์ text์ ๋ํด ์ ๊ทผ ๋ฐ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
+ ํ์ง๋ง ๋ง์ฝ ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์ฌ์ ์(Override)ํ๋ค๋ฉด ์์ ํด๋์ค์ ๋ฉ์๋๊ฐ ์คํ๋ฉ๋๋ค.
+ ์์ ํด๋์ค์๋ ๋ถ๋ชจ ํด๋์ค์ ๋ฉค๋ฒ๋ณ์๊ฐ ์์ด๋, ๋ถ๋ชจ ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
(2)์ ๊ฒฝ์ฐ์๋ ๋น์ฐํ ์์ ํด๋์ค ๋ฟ๋ง ์๋๋ผ ๋ถ๋ชจ ํด๋์ค์ ๋ฉค๋ฒ๊น์ง ๋ชจ๋ ์ฌ์ฉ ๋ฐ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋คํ์ฑ์ ์ฌ์ฉํ ์์
List<String> lists = new ArrayList<String>;
Map<String, String> m = new HashMap<String,String>();
๋คํ์ฑ์ ํ์ฉํ์ฌ ์ฐธ์กฐ ํ์ ์ ๋ถ๋ชจ ํ์ ์ผ๋ก ์ค์ ํ์ต๋๋ค. ์ด ๋ ์์กด๋๋ฅผ ๋ฎ์ถ๊ณ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
๋ง์ฝ HashMap์ ์ฌ์ฉํ๋ค๊ฐ ConcurrentHashMap์ผ๋ก ๋ฐ๊พธ์ด์ผ ํ๋ ๊ฒฝ์ฐ์ ์๋์ ๊ฐ์ด ๋คํ์ฑ์ ํ์ฉํ์ง ์๊ณ ์ฝ๋๋ฅผ ์ง ๋ค๋ฉด,
HashMap์๋ง ์ง์ํ๊ณ ConcurrentHashMap์ ์ง์ํ์ง ์๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ถ๋ถ์ ๊ฐ์์์ด์ผ ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
HashMap<String, String> m = new HashMap<String,String>(); // ๋ณ๊ฒฝ ์
ConcurrentHashMap<String, String> m = new ConcurrentHashMap<String,String>(); // ๋ณ๊ฒฝ ํ
ํ์ง๋ง ์ฐธ์กฐ๋ณ์๋ฅผ ๋ถ๋ชจ ํด๋์ค์ ์์กดํ์ฌ ์์ฑํ ๊ฒฝ์ฐ ๋ถ๋ชจ ํด๋์ค๊ฐ ์ ๊ณตํ๋ ๋ฉค๋ฒ์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์
1) ์ ์ฐํ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๊ณ , 2) HashMap์๋ง ์ง์ํ๊ณ ConcurrentHashMap์๋ ์ง์ํ์ง ์๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์ํฉ ์์ฒด๋ฅผ ๋ง์์ค๋๋ค.
+ ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ ๋ฉ์๋๋ ์์ ํด๋์ค์ ๋ฉ์๋๊ฐ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ๊ฑฑ์ ํ ํ์ X
์ด๋ฐ ์ด์ ๋ก ๋คํ์ฑ์ ์ด์ฉํด ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ ธ, ์ ์ง๋ณด์์ ์ฅ์ ์ ์ป์๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
Map<String, String> m = new HashMap<String,String>(); // ๋ณ๊ฒฝ ์
Map<String, String> m = new ConcurrentHashMap<String,String>(); // ๋ณ๊ฒฝ ํ
์์ ํ์ ์ ์ฐธ์กฐ๋ณ์๋ก ๋ถ๋ชจ ํ์ ์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ
CaptionTv s = new Tv(); // error
์์ ํ์ ์ ์ฐธ์กฐ๋ณ์๋ก, ๋ถ๋ชจ ํ์ ์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ์ฌ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์๋ํ๋ฉด ์์ ํ์ ์ ์ฐธ์กฐ๋ณ์๊ฐ ๋ถ๋ชจ ํ์ ๋ณด๋ค ๋ฉค๋ฒ ๊ฐ์๊ฐ ๋ ๋ง๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํ์ฉํ์ง ์๋ ๊ฒ์ ๋๋ค.
์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ถ๋ชจ๊ฐ ์์๋ณด๋ค ๋ฉค๋ฒ๊ฐ ๋ ์ ๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ๋ ์์์ ์ฐธ์กฐํ ์ ์์ง๋ง (๋ฌผ๋ก ์์ ๋ฉค๋ฒ๋ฅผ ์ฌ์ฉ ๋ฐ ์ ๊ทผํ์ง ๋ชปํจ),
์์์ ๋ถ๋ชจ๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ( ์์ ํ์ ์ ์ฐธ์กฐ๋ณ์๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๋๋ฐ ์์ ํ์ ์ ๋ฉค๋ฒ๋ฅผ ์ ๊ทผ/์ฌ์ฉ ํ์ง ๋ชปํ๋ ๋ง๋ ์๋๋ ์ํฉ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์๋ฌ๋ก ์ด๋ฐ ์ํฉ์ ๋ง์ ๋ฏ ํฉ๋๋ค )
<์์ฝ>
- ๋ถ๋ชจ ํ์
์ ์ฐธ์กฐ ๋ณ์๋ก ์์ ํ์
์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
- ์ด ์ฑ์ง์ ์ด์ฉํด ๊ฐ์ฒด๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ , ์์กด์ฑ์ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์์ ์ฅ์ ๊ณผ ๋ค๋ฅธ ์ฝ๋์ ๋ณํ๋ฅผ ๋ง๋ค์ด๋ด์ง ์์๋ ๋์ด ์์ฐ์ฑ์ด ๋์์ง๋๊ฑธ ๋ณผ ์ ์์์ต๋๋ค.
- ์ด ๊ฒฝ์ฐ ๋ง์ฝ ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ ๊ฒฝ์ฐ, ์์ ํด๋์ค์ ๋ฉ์๋๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ด ๊ฒฝ์ฐ ๋ง์ฝ ์์ ํด๋์ค์๋ ๋ถ๋ชจ ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ, ๋ถ๋ชจ ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์์ ํ์ ์ ์ฐธ์กฐ ๋ณ์๋ก ๋ถ๋ชจ ํ์ ์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์๋ ์์ต๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ ๋คํ์ฑ๊ณผ ํ์ฉ (1) | 2023.10.02 |
---|---|
[Java] ์ธํฐํ์ด์ค์ ์ฉ๋(usage)์ ๋ํด (0) | 2023.10.02 |
[Java] ์์(Inheritance)์ ๋ํด (1) | 2023.09.27 |
[Java] String Constant pool๊ณผ Heap ์์ญ์ ๋ํด (0) | 2023.09.26 |
[Java] ์ถ์ ํด๋์ค(abstract class)์ ๋ํด (2) | 2023.09.26 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422