1. ์์: ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ ์ ์๋ค.
2. ๋คํ์ฑ: ๋ถ๋ชจ ํ์ ์ผ๋ก ์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
3. ์ ์ฝ:
- ๋ถ๋ชจ ํ์ ๋ณ์๋ก๋ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ง ํธ์ถ ๊ฐ๋ฅํ๋ค.
- ์ค์ ์คํ๋๋ ๋ฉ์๋๋ ์์ ํด๋์ค์์ ์ฌ์ ์๋ ๋ฉ์๋์ด๋ค.
4. ํ๋ณํ:
- ๋ถ๋ชจ ํ์ ์ ์์ ํ์ ์ผ๋ก ๋ณํํ๋ฉด ์์ ํด๋์ค์ ๋ฉ์๋๋ ์ฌ์ฉํ ์ ์๋ค.
- ๋ถ๋ชจ ๊ฐ์ฒด๋ฅผ ์์ ํ์ ์ผ๋ก ๋ณํํ๋ ค ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.

1. ๋ถ๋ชจ์ ์์ ํด๋์ค ๊ด๊ณ
๋ถ๋ชจ ํด๋์ค๋ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ(์์ฑ ๋ฐ ๋ฉ์๋)์ ์ ์ํ๋ค.
์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ฅ์ ์์๋ฐ์ ํ์ฅํ๋ค.
class Parent {
public void parentMethod() {
System.out.println("๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋");
}
}
class Child extends Parent {
public void childMethod() {
System.out.println("์์ ํด๋์ค์ ๋ฉ์๋");
}
}
์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ๋ชจ๋ public ๋ฉ์๋์ ํ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Child child = new Child();
child.parentMethod(); // ๋ถ๋ชจ ๋ฉ์๋ ์ฌ์ฉ ๊ฐ๋ฅ
child.childMethod(); // ์์ ๋ฉ์๋ ์ฌ์ฉ ๊ฐ๋ฅ
2. ๋คํ์ฑ(Polymorphism): ๋ถ๋ชจ ํ์ ์ผ๋ก ์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ
๋คํ์ฑ์ “๋ถ๋ชจ ํ์ ๋ณ์๋ก ์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋ ๋ฅ๋ ฅ”์ด๋ค.
์ฝ๋ ์์ :
Parent poly = new Child(); // ๋ถ๋ชจ ํ์
์ผ๋ก ์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ
poly.parentMethod(); // ๋ถ๋ชจ์ ๋ฉ์๋ ํธ์ถ ๊ฐ๋ฅ
์ค์ํ ํน์ง:
• ๋ถ๋ชจ ํ์ ๋ณ์๋ก๋ ๋ถ๋ชจ ํด๋์ค์ ์ ์๋ ๋ฉ์๋๋ง ํธ์ถ ๊ฐ๋ฅํ๋ค.
• ์ค์ ์คํ๋๋ ๋ฉ์๋๋ ์์ ํด๋์ค์์ ์ฌ์ ์๋ ๋ฉ์๋์ด๋ค.
์ด ํน์ง์ “๋์ ๋ฐ์ธ๋ฉ(Dynamic Binding)”์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
class Child extends Parent {
@Override
public void parentMethod() {
System.out.println("์์ ํด๋์ค์์ ์ฌ์ ์๋ ๋ฉ์๋");
}
}
Parent poly = new Child();
poly.parentMethod(); // ์ถ๋ ฅ: ์์ ํด๋์ค์์ ์ฌ์ ์๋ ๋ฉ์๋
์ ๋ถ๋ชจ ํ์ ์ผ๋ก ์ฐธ์กฐํ ๊น?
• ์ ์ฐ์ฑ: ์ฝ๋๋ ๋ถ๋ชจ ํ์ ์ผ๋ก ์์ฑ๋์ด ์์ง๋ง, ์ค์ ์คํ์ ์์ ํด๋์ค์ ๊ตฌํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ์ข ๋ฅ์ ์์ ํด๋์ค๋ฅผ ํ๋์ ๋ถ๋ชจ ํ์ ์ผ๋ก ๋ค๋ฃฐ ์ ์๋ค.
3. “๋ถ๋ชจ๋ ์์์ ๋ด์ ์ ์๋ค”๋ ์๋ฏธ
๋ถ๋ชจ ํด๋์ค ํ์ ๋ณ์์ ์์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ด๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
์ด ๊ฒฝ์ฐ ๋ถ๋ชจ์ ๋ฉ์๋๋ง ํธ์ถ ๊ฐ๋ฅํ๋ฉฐ, ์์ ํด๋์ค์ ๋ฉ์๋๋ ์ ๊ทผํ ์ ์๋ค.
Parent poly = new Child(); // OK
poly.parentMethod(); // OK
poly.childMethod(); // ์ค๋ฅ! ๋ถ๋ชจ ํ์
์๋ childMethod()๊ฐ ์์
๋ถ๋ชจ ํ์ ๋ณ์๋ก ์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด?
• ํ๋ณํ(Casting)์ด ํ์ํ๋ค.
Child child = (Child) poly; // ๋ถ๋ชจ ํ์
์ ์์ ํ์
์ผ๋ก ๋ณํ
child.childMethod(); // ์ด์ ์์ ๋ฉ์๋ ํธ์ถ ๊ฐ๋ฅ
์ฃผ์:
• ๋ถ๋ชจ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์์ ํด๋์ค ํ์ ์ผ๋ก ๋ณํํ๋ฉด ClassCastException ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
Parent parent = new Parent();
Child child = (Child) parent; // ์ค๋ฅ ๋ฐ์: ๋ถ๋ชจ ๊ฐ์ฒด๋ ์์ ํด๋์ค๊ฐ ์๋
4. ์ ํท๊ฐ๋ฆฌ๋์ง ์ดํดํ๊ธฐ
“๋ถ๋ชจ๋ ์์์ ๋ด์ ์ ์๋ค.“๋ ๋ง์ ๋ค์์ ์๋ฏธํ๋ค:
• ๋ถ๋ชจ ํ์ ๋ณ์์ ์์ ๊ฐ์ฒด๋ฅผ ๋ฃ์ ์ ์๋ค.
์ด ๊ฒฝ์ฐ, ๋ถ๋ชจ ํ์ ์ผ๋ก ์ ์๋ ๋ฉ์๋๋ง ์ฌ์ฉํ ์ ์๋ค.
ํ์ง๋ง ์ค์ ์คํ๋๋ ๋ฉ์๋๋ ์์ ํด๋์ค์ ์ฌ์ ์๋ ๋ฉ์๋์ด๋ค.
๋ฐ๋๋ก, ์์ ํ์ ๋ณ์์ ๋ถ๋ชจ ๊ฐ์ฒด๋ฅผ ๋ฃ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
์ด๋ ๋ถ๋ชจ๋ ์์๋ณด๋ค ๊ธฐ๋ฅ์ด ์ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
5. ์ฌ์ด ๋น์
์๋์ฐจ(๋ถ๋ชจ)์ ์คํฌ์ธ ์นด(์์)์ ๊ด๊ณ๋ก ์๊ฐํด ๋ณด์.
1. ๋ถ๋ชจ ํด๋์ค: ์๋์ฐจ
class Car {
public void drive() {
System.out.println("์๋์ฐจ๊ฐ ๋ฌ๋ฆฝ๋๋ค.");
}
}
2. ์์ ํด๋์ค: ์คํฌ์ธ ์นด
class SportsCar extends Car {
public void turbo() {
System.out.println("์คํฌ์ธ ์นด๊ฐ ํฐ๋ณด๋ฅผ ์ฌ์ฉํฉ๋๋ค!");
}
}
3. ๋ถ๋ชจ ํ์ ์ผ๋ก ์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ
Car car = new SportsCar(); // ์๋์ฐจ๋ ์คํฌ์ธ ์นด๋ฅผ ๋ด์ ์ ์๋ค.
car.drive(); // ์ถ๋ ฅ: ์๋์ฐจ๊ฐ ๋ฌ๋ฆฝ๋๋ค.
car.turbo(); // ์ค๋ฅ! ๋ถ๋ชจ ํ์
์๋ turbo()๊ฐ ์์
4. ์์ ํ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ํ๋ณํ ํ์
SportsCar sportsCar = (SportsCar) car;
sportsCar.turbo(); // ์ถ๋ ฅ: ์คํฌ์ธ ์นด๊ฐ ํฐ๋ณด๋ฅผ ์ฌ์ฉํฉ๋๋ค!