[JAVA] ์์(Inheritance)
๐ ์์(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)