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();         // ์ถœ๋ ฅ: ์Šคํฌ์ธ ์นด๊ฐ€ ํ„ฐ๋ณด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค!

 

 

 

+ Recent posts