์์(Inheritance)์ด๋ ?
์๋ฐ์์๋ ํ๋์ ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์์ ํ๋(๋ณ์)์ ๋ฉ์๋(๊ธฐ๋ฅ)์ ์์๋ฐ์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ ์ด๋ฅผ ์์์ด๋ผ๊ณ ํ๋ค.
๋ถ๋ชจ ํด๋์ค(base class, parent class)์ ์์ ํด๋์ค(derived class, extended class, child class)๋ก ๋๋ ์ ธ ์๋ค.
- ๋ถ๋ชจ ํด๋์ค(์ํผ ํด๋์ค, Superclass) → ๊ธฐ์กด์ ํด๋์ค๋ก, ๊ณตํต ๊ธฐ๋ฅ์ ์ ์ํจ.
- ์์ ํด๋์ค(์๋ธ ํด๋์ค, Subclass) → ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์๋ฐ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํจ.
์ด๋ฏธ ์กด์ฌํ๋ ํด๋์ค๋ฅผ ์ฌ์ฌ์ฉํด์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ง๋ค ์ ์๋๋ก ํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
๋ํ ์๋ฐ์์๋ ๋ชจ๋ ํด๋์ค๊ฐ Object ํด๋์ค๋ฅผ ์ง์ , ๋๋ ๊ฐ์ ์ ์ผ๋ก ์์ ๋ฐ๋๋ค.
( ์๋ฐ์์ ๋ง๋๋ ๋ชจ๋ ํด๋์ค์ ์ํผ ํด๋์ค๋ Object ํด๋์ค ์ธ๊ฒ. )
์๋ฐ์์ ํด๋์ค๋ ๋จ์ผ ์์( Single Inheritance ) ๋ง ํ์ฉํ๋ค. (but ์ธํฐํ์ด์ค๋ ๊ฐ๋ฅํ๋ค)
์ฌ๊ธฐ์ ํท๊ฐ๋ฆฌ์ง ๋ง์์ผ ํ ๊ฒ์
ํ๋์ ์์ ํด๋์ค๊ฐ ๋ ๊ฐ ์ด์์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ๊ฐ๋ ๊ฒ์ ์๋์ง๋ง, ์์์ ๋ฐ์ ํด๋์ค๊ฐ ๋๊ตฐ๊ฐ์ ๋ถ๋ชจ๊ฐ ๋๋ ๊ฒ์ ๊ฐ๋ฅํ๋ค !!
์ด๊ฑธ ๋๊ตฐ๊ฐ๋ ์ด์ค์์ ํน์ ๋ค์ค์์์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ ๊ฒ ๊ฐ์๋ฐ ์ ํํ ๋ช ์นญ์ '๋ค๋จ๊ณ ์์' ์ด๋ผ๊ณ ํ๋ค.
(๊ทธ๋ ๋ค๊ณ ๊ณต์์ ์ธ ๋ช ์นญ์ ๋ ์๋. ๋ฌธ์์ ๊ด๋ จ ๋ด์ฉ์ด ์ธ๊ธ๋์ง๋ง ๋ฐ๋ก ๋ค๋ฃฐ ์ ๋๋ก ๋น์ค ์๋ ๋ด์ฉ์ ์๋ ๊ฒ ๊ฐ๋ค)
์์์ ์ฌ์ฉํ๋ฉด ์ข์ ์
1. ์ฝ๋ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค -> ๊ธฐ์กด ํด๋์ค์ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ๊ฐ์ ธ์์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ
2. ์ ์ง ๋ณด์ ํธ๋ฆฌํ๋ค -> ๊ณตํต๋ ์ฝ๋๊ฐ ํ ๊ณณ (๋ถ๋ชจ ํด๋์ค) ์ ์๊ธฐ ๋๋ฌธ์ ์์ ํ๊ธฐ ํธํ๋ค.
3. ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ (OOP) ์์น์ ์ถฉ์กฑํ๋ค. -> ์์์ ํตํด ์ฝ๋์ ํ์ฅ์ฑ์ ๋์ผ ์ ์๋ค.
์๋ฐ ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ
์๋ฐ์์๋ ๋ชจ~๋ ํด๋์ค๊ฐ Object ๋ฅผ ์์ ๋ฐ๋๋ค.
๊ฐ๋ฐํ๋ฉด์ ์ง์ ๋ง๋๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ณด์ด์ง ์์ง๋ง ๋ด๋ถ์ ์ผ๋ก ํฌํจ๋์ด ์์!!
์์ ์์
๋ถ๋ชจ ํด๋์ค์ธ '์์ ๊ฑฐ ํด๋์ค' ๋ ์์ ๊ฑฐ์ ๊ธฐ๋ณธ์ ์ธ ์์ฑ์ ๊ฐ์ง๋ค. ๊ธฐ์ด, ์๋ ๋ฑ๋ฑ
๊ทธ๋ฆฌ๊ณ ์์ ํด๋์ค์ธ '๋ง์ดํด ๋ฐ์ดํฌ'๋ ๋ถ๋ชจ ์์ ๊ฑฐ ํด๋์ค๋ฅผ ์์ ๋ฐ์ ์์ ๊ฑฐ์ ์์ฑ์ ๋ถ์ฌ๋ฐ๊ณ ๋ง์ดํด๋ง์ ์๋ก์ด ๋ฉ์๋(๊ธฐ๋ฅ)์ ์ถ๊ฐํ๋ค !!
// ๋ถ๋ชจ ํด๋์ค (Superclass)
public class Bicycle {
public int cadence;
public int gear;
public int speed;
// ์์ฑ์
public Bicycle(int startCadence, int startSpeed, int startGear) {
cadence = startCadence;
speed = startSpeed;
gear = startGear;
}
// ๋ฉ์๋
public void setCadence(int newValue) { cadence = newValue; }
public void setGear(int newValue) { gear = newValue; }
public void applyBrake(int decrement) { speed -= decrement; }
public void speedUp(int increment) { speed += increment; }
}
// ์์ ํด๋์ค (Subclass)
public class MountainBike extends Bicycle {
public int seatHeight;
// MountainBike ํด๋์ค์ ์์ฑ์
public MountainBike(int startHeight, int startCadence, int startSpeed, int startGear) {
super(startCadence, startSpeed, startGear); // ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์ ํธ์ถ
seatHeight = startHeight;
}
// ์๋ก์ด ๋ฉ์๋ ์ถ๊ฐ
public void setHeight(int newValue) { seatHeight = newValue; }
}
์์ ๋ฅผ ํตํด ๋ณผ ์ ์๋ฏ์ด ๋ ผ๋ฆฌ์ ์ผ๋ก๋ ๋ถ๋ชจ-์์ ๊ด๊ณ๊ฐ ์ฑ๋ฆฝํด์ผํ๋ค.
์ฆ, ๋ถ๋ฅ๋ฅผ ์ํด์ผํจ...
์๋ฐ๋ก ๊ฒ์์ ๋ง๋ค ๋ ํฌ๊ฒ ๋๊ผ๋๋ฐ ์์ ๊ด๊ณ๊ฐ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ฑ๋ฆฝ๋์ง ์์ผ๋ฉด ๋์ค์ ์ ์ง๋ณด์ํ ๋
์์ฒญ ๊ณ ์ํ๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ชฌ์คํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํด๋์ค๋ฅผ ์ธ๊ฐ์ธ ์ผ๋ฐ ์ ์ ๊ฐ ์์ ๋ฐ๊ฒ ํ๋ค๋์ง..
์์ง๋ ์๊ฐ ๋๋ ํผ๋๋ฐฑ "๋ชฌ์คํฐ๊ฐ ์ธ๊ฐ์ ๋ณ๋?" ใ ใ ใ ใ ใ ใ ใ
์ด๋ป๊ฒ ๊ทธ๋ฐ๊ฑธ ํท๊ฐ๋ฆด ์ ์์ง ? ์ถ์ง๋ง ๋ง์ ๊ธฐํํ๊ณ ๋ง๋ค๋ค๋ณด๋ฉด
๋ด ์๊ฐ์ด ๋ค ๋ง๋ ๊ฒ ๊ฐ๊ณ ๋ ผ๋ฆฌ์ ์ธ ์ค๋ฅ๋ฅผ ๋ฒํ๋ ๋ ์์ ๊ฐ๊ดํ๊ฐ ์ ์๋จ ใ ใ ใ
๋๋ ๋ด๊ฐ ์๋ชปํ๊ณ ์๋ ๊ฒ์ ๋ชจ๋ฅผ ๋๊ฐ ๋ง์ ๊ฒ ๊ฐ๋ค
์ค๋ฒ๋ผ์ด๋ฉ ํ๊ธฐ
๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค์์ ์๋กญ๊ฒ ์ ์ํ ์๋ ์๋ค !!
// ๋ถ๋ชจ ํด๋์ค
public class Bicycle {
public void printInfo() {
System.out.println("์ด๊ฒ์ ์์ ๊ฑฐ์
๋๋ค.");
}
}
// ์์ ํด๋์ค
public class MountainBike extends Bicycle {
// ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋ ์ฌ์ ์ (Overriding)
@Override
public void printInfo() {
System.out.println("์ด๊ฒ์ ์ฐ์
์์ ๊ฑฐ์
๋๋ค.");
}
}
// ์คํ ์ฝ๋
MountainBike myBike = new MountainBike();
myBike.printInfo(); // ์ถ๋ ฅ: "์ด๊ฒ์ ์ฐ์
์์ ๊ฑฐ์
๋๋ค."
โ @Override๋ฅผ ๋ถ์ด๋ฉด ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ๋ฎ์ด์ฐ๊ธฐ(์ฌ์ ์)ํ ์ ์์.
โ super.printInfo(); ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ๋ชจ ํด๋์ค์ ์๋ ๋ฉ์๋๋ ํธ์ถ ๊ฐ๋ฅ. (ํ ๋ฒ๋ ์จ๋ณธ ์ ์ด ์๋ค)
์์๊ณผ ์์ฑ์ (feat. super ๋? )
์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ฅผ ์๋์ผ๋ก ํธ์ถํ์ง๋ง, ์ง์ ํธ์ถํ ์๋ ์๋ค.
** ์๋์ผ๋ก ํธ์ถํ๋ค๋ ๊ฒ์? extend ํ๊ฒ ๋๋ฉด ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๊ฐ ๋ฌด์กฐ๊ฑด ํธ์ถ๋จ.
** ์๋ฐ์์ ๋ชจ๋ ๊ฐ์ฒด๋ ์์ฑ๋ ๋ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ถํฐ ์คํ๋๋ค.
super() ๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ถ๋ชจ ํด๋์ค์ ํน์ ์์ฑ์๋ฅผ ํธ์ถํ ์ ์๊ฒ ๋๋ค.
public class Parent {
public Parent() {
System.out.println("๋ถ๋ชจ ์์ฑ์ ํธ์ถ");
}
}
public class Child extends Parent {
public Child() {
super(); // ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์ ํธ์ถ
System.out.println("์์ ์์ฑ์ ํธ์ถ");
}
}
public class Main {
public static void main(String[] args) {
Child obj = new Child();
}
}
// ์ถ๋ ฅ
๋ถ๋ชจ ์์ฑ์ ํธ์ถ
์์ ์์ฑ์ ํธ์ถ
super () ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ญ๊น?
๊ทธ ์ ์ ๋จผ์ ๊ธฐ๋ณธ ์์ฑ์ Default Constructor ๋?
๋งค๊ฐ๋ณ์๊ฐ ์๋ ์์ฑ์๋ฅผ ์๋ฏธํ๋ค.
ํน์ง์ผ๋ก๋, ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑ์๋ฅผ ๋ง๋ค๋ฉด, ๊ธฐ๋ณธ์์ฑ์๋ ์๊ธฐ์ง ์์ง๋ง
์์ฑ์๋ฅผ ํ๋๋ ์์ฑํ์ง ์์ผ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ์ถ๊ฐํด์ค !!!!!
์ฆ, '์์ฑ์'๊ฐ ๋ฌด์กฐ๊ฑด ์์ด์ผํ๊ธฐ ๋๋ฌธ์, ๋ง์ฝ์ ์์ ๋ ์๋์ผ๋ก ์๊ธฐ๋ ์์ฑ์.
๋ณดํต ๋งค๊ฐ๋ณ์ ์์ด ์์ฑํ ์ผ์ด ๋ง์๋, ๊ธฐ๋ณธ๊ฐ์ด ์ ํด์ ธ์์๋? ๊ธฐ๋ณธ์์ฑ์๋ฅผ ๋ง๋ค์ด๋์.
super(); ๋ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํ ๋ ์ฌ์ฉํ๋ ํค์๋
์๋๋ super() ํค์๋๋ฅผ ์ฌ์ฉํ๋ ์ํฉ 3๊ฐ์ง์ ๋ํด ์ ๋ฆฌํ ๊ฒ !!
1. ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ณธ์์ฑ์๊ฐ ์์ ๋์๋ super() ๊ฐ ํ์์ด๋ค.
์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๋ํ super() ์์ด ์์์ ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด ์ค๋ฅ ์๊ธด๋ค. (๋งจ ์์ค์ ์จ์ค์ผํจ)
class Parent {
public Parent(int x) { // ๊ธฐ๋ณธ ์์ฑ์ ์์
System.out.println("๋ถ๋ชจ ํด๋์ค ์์ฑ์ ํธ์ถ! x = " + x);
}
}
class Child extends Parent {
public Child() {
// super(); // โ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์์ผ๋ฏ๋ก ์๋ ํธ์ถ ๋ถ๊ฐ → ์๋ฌ ๋ฐ์!
super(10); // โ
๋ฐ๋์ ๋ถ๋ชจ ์์ฑ์ ํธ์ถํด์ผ ํจ
System.out.println("์์ ํด๋์ค ์์ฑ์ ํธ์ถ!");
}
}
public class Main {
public static void main(String[] args) {
Child obj = new Child();
}
}
// ์ถ๋ ฅ๊ฐ
๋ถ๋ชจ ํด๋์ค ์์ฑ์ ํธ์ถ! x = 10
์์ ํด๋์ค ์์ฑ์ ํธ์ถ!
main ํด๋์ค๋ฅผ ๋ณด๋ฉด, ์์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ฐ ๋ถ๋ชจ ์์ฑ์๊ฐ ๋จผ์ ํธ์ถ๋ผ์ super(10)
์ถ๋ ฅ๊ฐ์ ๋ถ๋ชจ ํด๋์ค ๋ด์ฉ ๋จผ์ ๋์ด.
2. ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์์์ ์ค์ํ ์ด๊ธฐํ๋ฅผ ์ํํ ๋
์ 10๊ฐ ๋จผ์ ์ถ๋ ฅ๋ ๊ฒ ์ฒ๋ผ, ๋ถ๋ชจ ํด๋์ค์์ ์ค์ํ ๋ด์ฉ์ ๋จผ์ ์ด๊ธฐํํด์ผ ํ ๊ฒฝ์ฐ!!!super ๋ฅผ ๋จผ์ ์ฌ์ฉํด์ค๋ค.
3. ๋ถ๋ชจ ํด๋์ค์์ ์ค์ํ ๋ก์ง์ ์คํํด์ผ ํ ๋
์ ๋ด์ฉ๊ณผ ๋น์ทํจ.
์ฆ !! super(); ๋ ๋ถ๋ชจ ์์ฑ์๊ฐ ์๊ฑฐ๋, ๋ถ๋ชจ์ ํน์ ์ด๊ธฐํ๊ฐ ํ์ํ ๋ ์ฌ์ฉ๋๋ค.
๊ฐ์ฒด ํ๋ณํ (์ ์บ์คํ & ๋ค์ด์บ์คํ )
์๋ฐ๋ ์์๊ด๊ณ์์ ํ์ ๋ณํ(ํ๋ณํ, Casting) ์ด ๊ฐ๋ฅํ๋ค.
1. ์ ์บ์คํ (Upcasting) - ์์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋ถ๋ชจ ํ์ ์ผ๋ก ๋ณํ
MountainBike myBike = new MountainBike(10, 1, 10, 3);
Bicycle bike = myBike; // ์
์บ์คํ
(์๋ ๋ณํ)
๋ถ๋ชจ์ธ ์์ ๊ฑฐ ํด๋์ค์ ๊ฐ์ฒด์ ์ ๋ค์ด๊ฐ.
๋ค๋ฅธ๊ฑฐ ๋ญ ์ํด์ค๋ ์๋์ผ๋ก ๋ณํ๋๋ค.
2. ๋ค์ด์บ์คํ (Downcasting) - ๋ถ๋ชจ ํ์ ์ ์์ ํ์ ์ผ๋ก ๋ณํ
Bicycle bike = new MountainBike(10, 1, 10, 3);
MountainBike myBike = (MountainBike) bike; // ๋ค์ด์บ์คํ
(๋ช
์์ ๋ณํ)
(๊ดํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ด์ค์ผ ํ๋ค !! )
์ ์์(Inheritance) ๊ฐ๋
์ Java Tutorials ๋ฌธ์ ์ค "Inheritance" ๊ด๋ จ ํ์ด์ง์ธ
๐ Lesson: Object-Oriented Programming Concepts → Subclasses ์์ ๊ฐ์ ธ์๋ค. (๊ฐ์ฒด์งํฅ๊ด๋ จ)
์๋ฐ ๊ณต์ ๋ฌธ์๋ ํ ๊ณณ์ ์ ๋ฆฌ๋ ๊ฒ ์๋๋ผ ์ฌ๋ฌ ์นดํ ๊ณ ๋ฆฌ๋ก ๋๋์ด ์์ด์ ์ฐพ๊ธฐ ์ด๋ ต๋ค.
- Java SE Specification → ์๋ฐ ๋ฌธ๋ฒ์ ์ ์ํ๋ ์คํ ๋ฌธ์
- Java Tutorials → ๊ฐ๋ ์ค๋ช & ์์ ์ ๊ณต (๋ด๊ฐ ์ฐธ๊ณ ํ ๋ฌธ์)
- Java API Documentation → ๋ผ์ด๋ธ๋ฌ๋ฆฌ(API) ์ค๋ช
์ ๋งํฌ์์ ์ ๊ณตํ๋ ๋ด์ฉ์ ๊ฐ์ฒด์งํฅ ๊ฐ๋ ๊ณผ ์์์ ๊ธฐ์ด๋ฅผ ์ค๋ช ํ๋ ์๋ฐ ํํ ๋ฆฌ์ผ ๋ฌธ์๋ก, ์์ ์ฝ๋๋ ํฌํจ๋์ด ์์ด ๊ฐ๋ ์ ์ตํ๊ธฐ์ ์ข๋ค. ํ์ง๋ง ๋ฌธ์ฅ ๊ตฌ์กฐ๊ฐ ๋ฑ๋ฑํ๊ณ ๊ธฐ์ ์ฉ์ด๊ฐ ๋ง์ ์ด๋ณด์๊ฐ ์ฝ๊ธฐ์ ์ฝ์ง ์๋ค. ๐ญ
ํํ ๋ฆฌ์ผ ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฆฌํ์ฌ ์์ฑ๋ ๋ด์ฉ์ ๋๋ค.
ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ๋ง์ํด์ฃผ์ธ์
์๋ฐ ๊ณต๋ถํ์๋ ๋ชจ๋ ๋ถ๋ค ํ์ดํ ์ ๋๋ค !!
์ถ๊ฐํ ๊ฒ
- ๋ค์ค์์ ๊ฐ๋
- interface