๐จ์์๊ด๊ณ์์ ์์์์ฑ์์๋ ๋ฌด์กฐ๊ฑด ๋ถ๋ชจ์์ฑ์ ํธ์ถ์ ํด์ค์ผ ํ๋ค!
๐จ์์์์ฑ์๋ฅผ ํ๋ผ๊ณ ํ์๋ ๋ถ๋ชจ์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ์์๋ ์์์์ฑ์ ์์ super();๊ฐ ์๋ต ๋์ด ์๋ค!
๋งค๊ฐ๋ณ์์๋ ๋ถ๋ชจ์์ฑ์ super();๋ถํฐ ํ์ผํ๋น
class SuperClass {
public SuperClass() { // ๋ถ๋ชจ ์์ฑ์
System.out.println("๋ถ๋ชจ ์์ฑ์ ํธ์ถ");
}
}
class SubClass extends SuperClass{
public SubClass() { // ์์ ์์ฑ์
System.out.println("์์ ์์ฑ์ ํธ์ถ");
}
}
public class InheritanceConstructorEx01 {
public static void main(String[] args) {
SubClass sc = new SubClass(); // ์์ ์ธ์คํด์ค ์์ฑ
}
}
๐ป
๋ถ๋ชจ ์์ฑ์ ํธ์ถ
์์ ์์ฑ์ ํธ์ถ
=>
class SubClass extends SuperClass{
public SubClass() { // ์์ ์์ฑ์
System.out.println("์์ ์์ฑ์ ํธ์ถ");
}
}
=> ์์ ์์ฑ์ ์์ super();๊ฐ ์๋ต ๋์ด์๋ ์ํ! ๊ทธ๋์ ๋ถ๋ชจ ์์ฑ์ ๋ถํฐ ํ๋ค!
๐จ์์ ํด๋์ค๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ์๋์ ์ผ๋ก ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํธ์ถ๋๋ค.
๋ค๋ฅด๊ฒ ๋งํ๋ฉด ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ๋ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ ์๋์ผ๋ก ํธ์ถ๋์ง ์๋๋ค.
์ด๋๋ ์์์์ฑ์์ super(); ๋ผ๊ณ ํธ์ถํ๋ฉด ์๋ฌ๋ฌ๋ค ๋ถ๋ชจ์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ์๊ธฐ ๋๋ฌธ์!
๋ฐ๋ผ์ ์ด๋๋ ์๋ตํ์ง๋ง๊ณ super(๋งค๊ฐ๋ณ์); ๋ผ๊ณ ํธ์ถ์ ๊ผญ ํด์ค์ผ ํ๋ค
class SuperClass {
public SuperClass(String str){
System.out.println(str + "ํธ์ถ");
}
}
class SubClass extends SuperClass{
public SubClass() { // ์์ ์์ฑ์
System.out.println("์์ ์์ฑ์ ํธ์ถ");
}
}
public class InheritanceConstructorEx01 {
public static void main(String[] args) {
SubClass sc = new SubClass(); // ์์ ์ธ์คํด์ค ์์ฑ
}
}
=> ์ด๋๋ ์๋ฌ๊ฐ ๋ฌ๋ค! ์์์์ฑ์์ super();๊ฐ ์๋ต์ด ๋์ด์๋๊ฑด๋ฐ.. ๋ถ๋ชจํด๋์ค์ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์์ฑ์๊ฐ ์๊ธฐ ๋๋ฌธ์
class SubClass extends SuperClass{
public SubClass() { // ์์ ์์ฑ์
super("๋ถ๋ชจ ์์ฑ์ "); // ๋ถ๋ชจ ์์ฑ์ ํธ์ถ
System.out.println("์์ ์์ฑ์ ํธ์ถ");
}
}
=> ์ด๋ฐ์์ผ๋ก super("๋ถ๋ชจ ์์ฑ์ "); // ๋ถ๋ชจ ์์ฑ์ ํธ์ถ ์ ํด์ค์ผ ์๋ฌ๋ ์๋จ๊ณ ๋ถ๋ชจ์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ์์๋๋ ์์ ์์ฑ์์์ ๋ช ์์ ์ผ๋ก ๋ถ๋ชจ ์์ฑ์๋ฅผ ํธ์ถํด์ผ ํ๋ค
public class Inheritance004 {
public static void main(String[] args) {
Parent p1 = new Parent(); //๋ถ๋ชจ์์ฑ
Child c1 = new Child(); //์์์์ฑ
Parent p2 = new Child(); //์์๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ Parent์ ๋ด๊ฒ ๋ค OOO
//๋ถ๋ชจํ์
์์๊ฐ์ฒด
Parent p3 = c1; //์์๊ฐ์ฒด๋ฅผ Parent์ ๋ด๊ฒ ๋ค OOO
//๋ถ๋ชจํ์
์์๊ฐ์ฒด
// Child c2 = new Parent(); //๋ถ๋ชจ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ Child์ ๋ด๊ฒ ๋ค XXX
GrandParent gp1 = new GrandParent();
GrandParent gp2 = new Parent(); //๋ถ๋ชจ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ GrandParent์ ๋ด๊ฒ ๋ค OOO
GrandParent gp3 = new Child(); //์์๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ GrandParent์ ๋ด๊ฒ ๋ค OOO
}
}
class GrandParent {
}
class Parent extends GrandParent {
}
class Child extends Parent {
}
๐
Parent p2 = new Child(); ๋๋ ์ ๋ณด์!
Child๊ฐ์ฒด๋ฅผ ์์ฑํด์ Parent์ ๋ด๊ฒ ๋ค๋ ๋ป! OOO
๐
Child c2 = new Parent();
๋ถ๋ชจ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์์์ ๋ด๊ฒ ๋ค๋๊ฑด๋ฐ.. ๋ง์ด ์๋์์!?
๐
GrandParent gp2 = new Parent();
GrandParent gp3 = new Child();
๋ถ๋ชจ,์์๊ฐ์ฒด๋ฅผ ์์ฑํด์ ํ ์๋ฒ์ง์ ๋ด๊ฒ ๋ค OOO
public class Inheritance005 {
public static void main(String[] args) {
Parent2 p1 = new Parent2();
p1.method1();
p1.method2(); //๋ฉ์ธ์ด ์๋์ชฝ์ ๋ค๋ฅธํด๋์ค๋๊น Parent2 ํด๋์ค์ private ๋ชป์จ
// p1.method3(); // X Parent์๋ method3์ด ์๋ค / ์์๊บผ๋ฅผ ๊ฐ์ง๊ณ ๋ถ๋ชจ์์ ๋ชป์จ!
Child2 c1 = new Child2();
c1.method1(); // ๋ถ๋ชจ๊บผ๋ฅผ ๊ฐ์ง๊ณ ์์์์ ์ธ ์ ์์ด
c1.method2(); // ๋ถ๋ชจ๊บผ๋ฅผ ๊ฐ์ง๊ณ ์์์์ ์ธ ์ ์์ด
c1.method3();
Parent2 p2 = new Child2(); //์์๊ฐ์ฒด๋ฅผ ์์ฑ์์ผ์ ๋ถ๋ชจ์ ๋ด๊ฒ ๋ค // method1,2 / method๋ถ๋ชจ1,2 method์์2,3
p2.method1();
p2.method2(); //์ต์ 222(์์๋ฉ์๋) /์๋์ผ๋ก ์ฌ์ ์๋ ์์method2๋ก ์ฐ๊ฒฐ!
// p2.method3(); // ๋ถ๋ชจ์ ๋ด๊ฒจ์ ธ ์๋ ๊ฐ์ฒด!!! ๋ถ๋ชจ๋ฉ์๋์ ์๋ ๊ฒ๋ง ์ฌ์ฉ๊ฐ๋ฅ // method3์ ๊ธฐ๋ฅ์ ์๋๋ฐ ๊ฒ์ผ๋ก ๋ฒํผ๊ตฌํ์ด ์๋์์ด์ ๋ชป์ฐ๋๊ฑฐ์ง..!
Parent2 p3 = new Child3(); //method1,2 = ๋ถ๋ชจmethod1,2 ์์method2
p3.method1();
p3.method2(); //๋๋ ๋๋ง์ 222(์์๋ฉ์๋) /์ ์ผ ์ต์ ๊บผ ์์ method2๋ก ์ฐ๊ฒฐ
}
}
class Parent2 {
void method1() {
System.out.println("111");
}
void method2() {
System.out.println("222");
}
}
class Child2 extends Parent2 { //์ฒซ๋ฒ์งธ ์์
void method2() { //๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ
// super.method2();
System.out.println("์ต์ 222");
}
void method3() {
System.out.println("333");
}
}
class Child3 extends Parent2 { //๋๋ฒ์งธ ์์
void method2() {
System.out.println("๋๋ ๋๋ง์ 222");
}
}
๐
Parent2 p2 = new Child2();
์์๊ฐ์ฒด๋ฅผ ์์ฑ์์ผ์ ๋ถ๋ชจ์ ๋ด๊ฒ ๋ค OOO
๋๋ ์ ์๊ฐํด๋ณด๋ฉด
๋ถ๋ชจ method 1,2 = ์์ method 2,3
๊ทธ๋์ method3์ ๊ธฐ๋ฅ์ ์์ง๋ง ํ์ฌ ๋ถ๋ชจ์ ๋ชธ๋ด๊ถ์ ธ์๋์ ๋ผ ๋ฒํผ์ ๊ตฌํ์ด ์๋์์ด์ ์ฐ์ง ๋ชปํ๋๊ฑฐ๊ณ
method2๋ ์ธ ์ ์์ง๋ง ์ ์ผ ์ต์ ๊บผ ์ค๋ฒ๋ผ์ด๋ฉ ๋๊ฑฐ๊ฐ ๋์จ๋ค!
// Vehicle vh = bike, boat ๊ฐ๋ฅ!
public static void runParameter(Vehicle vh) { //static์ static๋ง ์ธ ์..
vh.run(); //๋งค๊ฐ๋ณ์๋ก ๋ค์ด์จ ๊ฐ์ฒด์ run ๋ฉ์๋๋ฅผ ํธ์ถ
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Vehicle v1 = new Vehicle();
Vehicle v12 = new Vehicle();
Vehicle v13 = new Vehicle();
ArrayList<Vehicle> vehicleList = new ArrayList<Vehicle>();
vehicleList.add(v1);
vehicleList.add(v12);
vehicleList.add(v13);
Bike v2 = new Bike();
Bike v22 = new Bike();
Bike v23 = new Bike();
Boat v3 = new Boat();
Boat v32 = new Boat();
//์์๊ฐ์ฒด๋ฅผ ๋ถ๋ชจ vehicleList์ ๋ด์ ์ ์๋ค
vehicleList.add(v2); // == vehicleList.add( new Bike() );
vehicleList.add(v22);
vehicleList.add(v23);
vehicleList.add(v3); // == vehicleList.add( new Boat() );
vehicleList.add(v32);
for (Vehicle vh : vehicleList) {
vh.run();
}
System.out.println("------------------------");
runParameter(v23); //๋งค๊ฐ๋ณ์๊ฐ Vehicle์ด๋ผ bike๋ ๋๊ณ ! new Bike()๋ผ์ Bike์ run()
runParameter(v32); //๋งค๊ฐ๋ณ์๊ฐ Vehicle์ด๋ผ boat๋ ๋๋ค! new Boat()๋ผ์ Boat์ run()
}
}
class Vehicle { //ํ ๊ฒ!
void run() {
System.out.println("ํ ๊ฒ์ด ๋ฌ๋ฆฐ๋ค.");
}
}
class Bike extends Vehicle{ //์์ ๊ฑฐ
void run() { //๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ (์์์ผ๊ฒฝ์ฐ)
System.out.println("ํ๋ฌ์ ๊ตด๋ ค์ ๋ฌ๋ฆฐ๋ค.");
}
}
class Boat extends Vehicle { //๋ณดํธ
void run() { //๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ (์์์ผ๊ฒฝ์ฐ)
System.out.println("ํ๋กํ ๋ฌ๋ฅผ ๋๋ ค์ ๋ฌ๋ฆฐ๋ค.");
}
}
=>
//์์๊ฐ์ฒด๋ฅผ ๋ถ๋ชจ vehicleList์ ๋ด์ ์ ์๋ค
vehicleList.add(v2); // == vehicleList.add( new Bike() );
vehicleList.add(v22);
vehicleList.add(v23);
vehicleList.add(v3); // == vehicleList.add( new Boat() );
vehicleList.add(v32);
for (Vehicle vh : vehicleList) {
vh.run();
}
๐์ฌ๊ธฐ์
Vehicle v1 = new Bike(); //๋ฐ์ดํฌ๋ฅผ ์์ฑํด์ vehicle์ ๋ฃ์ด์ค๋ค
Vehicle v2 = new Boat(); //๋ณดํธ๋ฅผ ์์ฑํด์ vehicle์ ๋ฃ์ด์ค๋ค
๊ฐ ๊ฐ๋ฅํ๋๊น!
vehicleList์๋ Bike๊ฐ์ฒด์ Boat๊ฐ์ฒด๋ฅผ ๋ด์์ค ์ ์๋๊ฑฐ์ง
=>
public static void runParameter(Vehicle vh) { //static์ static๋ง ์ธ ์..
vh.run(); //๋งค๊ฐ๋ณ์๋ก ๋ค์ด์จ ๊ฐ์ฒด์ run ๋ฉ์๋๋ฅผ ํธ์ถ
}
=>
runParameter(v23); //๋งค๊ฐ๋ณ์๊ฐ Vehicle์ด๋ผ bike๋ ๋๊ณ ! new Bike()๋ผ์ Bike์ run()
runParameter(v32); //๋งค๊ฐ๋ณ์๊ฐ Vehicle์ด๋ผ boat๋ ๋๋ค! new Boat()๋ผ์ Boat์ run()
๐
๋ฉ์ธํด๋์ค์ ๋ฉ์๋ ๋ง๋ค์ด์ฃผ๊ณ
์ด์จ๋ Vehicle์๋ Bike, Boat ๋ค ๋ค์ด๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฉ์๋ ๋งค๊ฐ๋ณ์์ Bike, Boat ๋ค ์ธ ์ ์๋ค~!
๐จ๊ฒฐ๋ก ๐จ
<mainํด๋์ค>
A b = new B(); -> B ๊ฐ์ฒด ์์ฑ์ํค๊ณ A์ ๋ฃ๋๋ค // A paint(), draw() = A paint(), draw() , B paint(), draw()
b.paint();
b.draw();
<A ํด๋์ค>
๋ฉ์๋
paint();
draw();
<B ํด๋์ค>
๋ฉ์๋
paint();
draw();
๊ฐ ์๋ค๋ฉด!
1. b.paint(); => A์ ์๋ ๋ฉ์๋๋ง ์ธ ์ ์๋๋ฐ B์๋ ๋๊ฐ์ ๋ฉ์๋๊ฐ ์๋ค๋ฉด(์ค๋ฒ๋ผ์ด๋ฉ๋ ๋ฉ์๋) ๊ทธ๊ฑธ ์ด๋ค! ๊ฐ์ฅ ์ต์ ๊บผ๋ฅผ ์ด๋ค~! Bํด๋์ค์ ์๋ paint()๋ถํฐ ๊ฐ๋ค~
์์๊ด๊ณ์์ ์ค๋ฒ๋ผ์ด๋ฉ : ์๋น ๊บผ ์ํด! ๋ด๊บผํ ๊ฑฐ์ผ
2. b.draw(); => ์์ ๋๊ฐ์ ๋ ผ๋ฆฌ! Bํด๋์ค์ ์๋ draw()๋ก ๊ฐ๋ค~!