Java๋ ๊ฐ์ฒด์งํฅ ์ธ์ด๋ค.
๊ฐ์ฒด์งํฅ์ ํต์ฌ ๊ฐ๋
์ค ๊ฐ์ฅ ์ค์ํ ๋ ๊ฐ์ง๊ฐ ์์(Inheritance)๊ณผ ๋คํ์ฑ(Polymorphism)์ด๋ค.
์ด ๋ ๊ฐ๋
์ ํจ๊ป ์ดํดํด์ผ ํ๋ค.
1. ์์(Inheritance)
์์์ ๊ธฐ์กด ํด๋์ค์ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ ๋ฌผ๋ ค ๋ฐ์ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
class Animal {
void sound() {
System.out.printIn("์๋ฆฌ๋ฅผ ๋ธ๋ค");
}
}
class Dog extends Animal{
}
- Animal → ๋ถ๋ชจ ํด๋์ค(Super Class)
- Dog → ์์ ํด๋์ค(Sub Class)
- extends → ์์ ํค์๋
Dog๋ Animal์ ๋ฉ์๋๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
1) ์์์ ๋ชฉ์
- ์ฝ๋ ์ฌ์ฌ์ฉ
- ๊ณ์ธต ๊ตฌ์กฐ ํํ
- ์ ์ง๋ณด์ ์ฉ์ด
2. ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ(Overriding)
์์ ํด๋์ค์์ ๋ถ๋ชจ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ
class Dog extends Animal {
@Override
void sound() {
System.out.printIn("๋ฉ๋ฉ");
}
}
์กฐ๊ฑด
- ๋ฉ์๋ ์ด๋ฆ ๋์ผ
- ๋งค๊ฐ ๋ณ์ ๋์ผ
- ๋ฐํ ํ์
๋์ผ
3. ๋คํ์ฑ(Polymorphism)
๋คํ์ฑ์ ํ๋์ ํ์
์ผ๋ก ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃฐ ์ ์๋ ์ฑ์ง์ด๋ค.
Animal a = new Dog();
- ์ฐธ์กฐ ํ์
→ Animal
- ์ค์ ๊ฐ์ฒด → Dog
์ด๊ฒ ๋คํ์ฑ์ ํต์ฌ์ด๋ค.
4. ์
์บ์คํ
(Upcasting)
์์ ๊ฐ์ฒด๋ฅผ ๋ถ๋ชจ ํ์
์ผ๋ก ์ฐธ์กฐํ๋ ๊ฒ
Animal a = new Dog();
์๋์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
ํน์ง
- ๋ถ๋ชจ ํ์
์ ๋ฉ์๋๋ง ์ ๊ทผ ๊ฐ๋ฅ
- ์ค์ ์คํ์ ์์ ๋ฉ์๋
5. ๋์ ๋ฐ์ธ๋ฉ(Dynamic Binding)
๋ฉ์๋ ํธ์ถ์ ์ฐธ์กฐ ํ์
์ด ์๋๋ผ ์ค์ ๊ฐ์ฒด ๊ธฐ์ค์ผ๋ก ๊ฒฐ์ ๋๋ค.
Animal a = new Dog();
a.sound(); //"๋ฉ๋ฉ" ์ถ๋ ฅ
์ปดํ์ผ ์์ → Animal ํ์
์คํ ์์ → Dog ๊ฐ์ฒด
์ด๊ฒ์ด ๋คํ์ฑ์ ํต์ฌ ์๋ฆฌ๋ค.
6. ๋ค์ด์บ์คํ
(Downcasting)
๋ถ๋ชจ ํ์
์ ๋ค์ ์์ ํ์
์ผ๋ก ๋ณํํ๋ ๊ฒ
Dog a = (Dog) a;
๋ช
์์ ํ๋ณํ์ด ํ์ํ๋ค.
์ค์ ๊ฐ์ฒด๊ฐ ํด๋น ํ์
์ด ์๋ ๊ฒฝ์ฐ ์์ธ๊ฐ ๋ฐ์ํ๋ค.
if (a instanceof Dog) {
Dog d = (Dog) a;
}
7. ์์๊ณผ ๋คํ์ฑ์ ๊ด๊ณ
์์์ด ์์ด์ผ ๋คํ์ฑ์ด ๊ฐ๋ฅํ๋ค.
- ์์ → ํ์
๊ณ์ธต ํ์ฑ
- ๋คํ์ฑ → ๋ถ๋ชจ ํ์
์ผ๋ก ์์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃธ
- ์ค๋ฒ๋ผ์ด๋ฉ → ๋์ ๋ฐ์ธ๋ฉ ๋ฐ์
8. ์ ์ค์ํ๊ฐ?
์ค๋ฌด์์ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๊ตฌ์กฐ
List<Animal> animals = new ArrayList<>();
๋ถ๋ชจ ํ์
์ผ๋ก ์ปฌ๋ ์
์ ๋ง๋ค๊ณ , ์ฌ๋ฌ ์์ ๊ฐ์ฒด๋ฅผ ๋ฃ๋๋ค.
์ด๊ฒ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ๊ธฐ๋ณธ ํจํด์ด๋ค.