โค๏ธ JAVA/Basic

[JAVA] ์ƒ์†(Inheritance)

Genie_. 2024. 10. 20. 00:20
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“š ์ƒ์†(Inherihance)

1. ์ƒ์†์ด๋ž€?

์ƒ์†(Inherihance)์ด๋ž€ ํด๋ž˜์Šค์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์žฌ์ •์˜ํ•˜์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ƒ์†์„ ์ด์šฉํ•˜๋ฉด, ๊ธฐ์กด ์ •์˜๋œ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฌผ๋ ค๋ฐ›์•„, ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ ๊ธฐ์กด์— ์ •์˜๋˜์–ด ์žˆ๋˜ ํด๋ž˜์Šค๋ฅผ ๋ถ€๋ชจ ํด๋ž˜์Šค(parent class) ๋˜๋Š” ์ƒ์œ„ ํด๋ž˜์Šค(super class)๋ผ๊ณ  ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ƒ์†์„ ํ†ตํ•ด ์ƒˆ๋กญ๊ฒŒ ์ž‘์„ฑ๋˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ž์‹ ํด๋ž˜์Šค(child class)๋ผ๊ณ  ํ•œ๋‹ค.

 

์ƒ์†์˜ ์‚ฌ์šฉ

์ƒ์†์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค.

์ƒˆ๋กœ ์ž‘์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ด๋ฆ„ ๋’ค์— ์ƒ์† ๋ฐ›๊ณ ์ž ํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ํ‚ค์›Œ๋“œ 'extends'์™€ ํ•จ๊ป˜ ์จ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

class Parent { }
class Child extends Parent {
	// ...
}

๋‘ ํด๋ž˜์Šค๋Š” ์„œ๋กœ ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋‹ค๊ณ  ํ•˜๋ฉฐ, Parent ํด๋ž˜์Šค๋Š” '์กฐ์ƒ ํด๋ž˜์Šค'๋ผ ํ•˜๊ณ , Child ํด๋ž˜์Šค๋Š” '์ž์† ํด๋ž˜์Šค'๋ผ ํ•œ๋‹ค.

 

์ƒ์†์€ ํด๋ž˜์Šค ๊ฐ„์˜ ์ƒ์† ๊ด€๊ณ„๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๊ฒƒ์„ ์ƒ์†๊ณ„์ธต๋„(class hierarchy)๋ผ๊ณ  ํ•œ๋‹ค.

์•„๋ž˜ ์ด๋ฏธ์ง€๋Š” ์ƒ์†์— ๋Œ€ํ•ด ์ „์ฒด์ ์ธ ๊ณ„์ธต ๊ตฌ์กฐ์ด๋‹ค.

์ด ์ด๋ฏธ์ง€๋ฅผ ํ†ตํ•ด, ํด๋ž˜์Šค ๊ฐ„์˜ ์ƒ์†๊ด€๊ณ„์—์„œ

  • ์ž์† ํด๋ž˜์Šค๋Š” ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค.
    (์ƒ์„ฑ์ž์™€ ์ดˆ๊ธฐํ™” ๋ธ”๋Ÿญ์€ ์ƒ์†๋˜์ง€ ์•Š๋Š”๋‹ค.)
  • ์ž์† ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๊ฐœ์ˆ˜๋Š” ์กฐ์ƒ ํด๋ž˜์Šค๋ณด๋‹ค ํ•ญ์ƒ ๊ฐ™๊ฑฐ๋‚˜ ๋งŽ๋‹ค.

 

์ƒ์†์˜ ์žฅ์ 

1. ์ ์€ ์–‘์˜ ์ฝ”๋“œ๋กœ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์ฝ”๋“œ๋ฅผ ๊ณตํ†ต์ ์œผ๋กœ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ์–ด์„œ, ์ฝ”๋“œ์˜ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ์ด ํŽธํ•˜๋‹ค

 

์ƒ์†์˜ ์˜ˆ์‹œ

class Tv {
    boolean power; // ์ „์› ์ƒํƒœ(on/off)
    int channel; // ์ฑ„๋„

    void power() { power = !power; }
    void channelUp() { ++channel; }
    void channelDown() { --channel; }
}

class SmartTv extends Tv{ // SmartTv๋Š” Tv์— ์บก์…˜(์ž๋ง‰)์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€
    boolean caption; // ์บก์…˜์ƒํƒœ(on/off)
    void  displayCaption(String text){
        if(caption){ // ์บก์…˜ ์ƒํƒœ๊ฐ€ on(true)์ผ ๋•Œ๋งŒ text๋ฅผ ๋ณด์—ฌ ์ค€๋‹ค.
            System.out.println(text);
        }
    }
}

class Ex7_1{
    public static void main(String[] args) {
        SmartTv stv = new SmartTv();
        stv.channel = 10; // ์กฐ์ƒํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ๋ฉค๋ฒ„
        stv.channelUp();  // ์กฐ์ƒํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ๋ฉค๋ฒ„
        System.out.println(stv.channel);
        stv.displayCaption("Hello, World");
        stv.caption = true; // ์บก์…˜(์ž๋ง‰) ๊ธฐ๋Šฅ์„ ์ผ ๋‹ค.
        stv.displayCaption("Hello, World");
    }
}

 


2. ํด๋ž˜์Šค๊ฐ„์˜ ๊ด€๊ณ„ - ํฌํ•จ๊ด€๊ณ„

์ƒ์† ์ด์™ธ์—๋„ ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, 'ํฌํ•จ(composite)'๊ด€๊ณ„๋ฅผ ๋งบ์–ด ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

ํฌํ•จ๊ด€๊ณ„๋ฅผ ๋งบ์–ด ์ฃผ๋Š” ๊ฒƒ์€ ํ•œ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

 

์˜ˆ๋ฅผ๋“ค์–ด๋ณด์ž, ์›(Circle)์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ Circleํด๋ž˜์Šค์™€ ์ขŒํ‘œ์ƒ์˜ ํ•œ ์ ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ Pointํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค

class Circle {
	int x; // ์›์ ์˜ x์ขŒํ‘œ
    int y; // ์›์ ์˜ y์ขŒํ‘œ
    int r; // ๋ฐ˜์ง€๋ฆ„(radius)
}

class Point {
	int x; // x์ขŒํ‘œ
    int y; // y์ขŒํ‘œ
}

Point ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•ด์„œ Circleํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

class Circle {
	Point c = new Point(); // ์›์ 
    int r;
}

๋‹จ์œ„๋ณ„๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ ๋‹ค์Œ, ์ด ๋‹จ์œ„ ํด๋ž˜์Šค๋“ค์„ ํฌํ•จ๊ด€๊ณ„๋กœ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

ํฌํ•จ๊ด€๊ณ„ vs ์ƒ์†๊ด€๊ณ„

ํฌํ•จ๊ด€๊ณ„ : '~์€ ~์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.(has-a)'

์ƒ์†๊ด€๊ณ„ : '~์€ ~์ด๋‹ค.(is-a)'

 

์›(Circle)์€ ์ (Point)์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. - Circle has a Point. โœ”๏ธ

์›(Circle)์€ ์ (Point)์ด๋‹ค. - Circle is a Point.


3. ๋‹จ์ผ ์ƒ์†

์ž๋ฐ”๋Š” ๋‹จ์ผ ์ƒ์†๋งŒ์„ ํ—ˆ์šฉํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋‘˜ ์ด์ƒ์˜ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†์„ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.

class TvDVD extends Tv, DVD { // ์—๋Ÿฌ. ์กฐ์ƒ์€ ํ•˜๋‚˜๋งŒ ํ—ˆ์šฉ
	// ...
}

๋‹ค์ค‘ ์ƒ์†์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์„ ๋•Œ, Tvํด๋ž˜์Šค์— power()๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๊ณ , DVD ํด๋ž˜์Šค์—๋„ power()๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด

TvDVD์—์„œ power ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ, ์ด๋ฆ„์ด ๊ฐ™์•„์„œ ๋‘˜ ์ค‘ ์–ด๋А๊ฒƒ์„ ์จ์•ผํ• ์ง€ ๋ชจ๋ฅด๋Š” ์ƒํ™ฉ ์ฆ‰, ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋น„์ค‘์ด ๋†’์€ ํด๋ž˜์Šค ํ•˜๋‚˜๋งŒ ์ƒ์†๊ด€๊ณ„๋กœ, ๋‚˜๋จธ์ง€๋Š” ํฌํ•จ๊ด€๊ณ„๋กœ ํ•œ๋‹ค.


4. ์˜ค๋ฒ„๋ผ์ด๋”ฉ(overriding)

override์˜ ์‚ฌ์ „์  ์˜๋ฏธ๋Š” '~์œ„์— ๋ฎ์–ด์“ฐ๋‹ค(overwrite)'์ด๋‹ค.

์กฐ์ƒ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ๋•Œ ์ง€์ผœ์•ผํ•  ์กฐ๊ฑด์ด 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • ๋ฉ”์„œ๋“œ์˜ ์„ ์–ธ๋ถ€(๋ฉ”์„œ๋“œ ์ด๋ฆ„, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜ํƒ€์ž…)๋Š” ์กฐ์ƒ์˜ ๊ฒƒ๊ณผ ์™„์ „ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ์ข์€ ๋ฒ”์œ„๋กœ ๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์˜ˆ์™ธ๋Š” ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ๋งŽ์ด ์„ ์–ธ ํ•  ์ˆ˜ ์—†๋‹ค.
 

์˜ค๋ฒ„๋กœ๋”ฉ vs ์˜ค๋ฒ„๋ผ์ด๋”ฉ

์˜ค๋ฒ„๋กœ๋”ฉ(overloading) : ๊ธฐ์กด์— ์—†๋Š” ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ(new)

์˜ค๋ฒ„๋ผ์ด๋”ฉ(oberriding) : ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ(change, modify)

 

728x90
๋ฐ˜์‘ํ˜•