Inheritance (์์)
๐คฆ๐ปโ๏ธ ์์์ ๊ด๊ณ๋ is - a ๊ด๊ณ์ด๋ค
<1> ์ ์
์์์ ๊ธฐ์กด ํด๋์ค์ ์์ฐ (๋งด๋ฒ)๋ฅผ ์์ ํด๋์ค์์ ์ฌ์ฌ์ฉ ํ๊ธฐ ์ํด ์ฐ์ธ๋ค. ํ์ค์์์๋ ๋ฐ๋๋ก, ๋ถ๋ชจ๊ฐ ์์์๊ฒ ์์์์ผ์ฃผ๋ ๊ฒ์ด ์๋๋ผ ์์์ด ๋ถ๋ชจ๋ ํด๋์ค๋ฅผ ์์ํ๋๊ฒ์ด๋ค (๋ถํจ์์)
๊ธฐ์กด ํด๋์ค์ ๋งด๋ฒ๋ฅผ ๋ฌผ๋ ค๋ฐ๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ์ ๊ฐํ ์ ์๊ณ ์ ์ง ๋ณด์๊ฐ ํธ๋ฆฌํ๋ค
ํค์๋ : extends
public class ๋ถ์ด๋นตํ {
String product_name;
String fillings;
int age ; //unit - min
void coolDown();
void eaten ();
}
public class ๋ถ์ด๋นต extends ๋ถ์ด๋นตํ{
boolean isCarp ;
void curse() {}
}
๐งธ์์์ ํ ๋, ๋ถ๋ชจ์ ์์ฑ์์ ์ด๊ธฐํ ๋ธ๋ก์ ์์ํ์ง ์๋๋ค !
์ค์ต
๋ถ์ด๋นต ํด๋์ค๋ฅผ ์์๋ฐ๋ ๋ถ์ด ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ณด์๋ค. ๋ถ์ด์ธ๋ฐ ๋ถ์ด๋นต์ ์์๋ฐ์ผ๋ฉด, ์ต์ธํ ๋ถ์ด๊ฐ ์ ์ฃผํ ๊ฒ์ด๋ค.
public class ๋ถ์ด๋นต{
//์์ฑ
String product_name, fillings;
int age;
//๊ฐ๋ฅ
void coolDown(){
System.out.println("์์ด๋ฒ๋ ธ๋ค...");
}
void eaten() {
System.out.println("์ด๋ ค์ค...");
}
}
public class ๋ถ์ด extends ๋ถ์ด๋นต{
/*๊ณ ์ ์์ฑ, ๊ธฐ๋ฅ์ ์ ์*/
//์์ฑ
boolean isCarp;
//๊ธฐ๋ฅ
void curse{
String cursed= isCarp==true?
"์ ์ฃผํ ๊ฑฐ์ผ ์ธ๊ฐ.." : "๋ฐ๋๋ฐ๋";
System.out.println(cursed);
}
}
public class ๋ถ์ด๋นต๋ง๋ค๊ธฐ{
public static void main(String[] args){
//๋ถ์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ณด์
๋ถ์ด ๊ธ๋ถ์ด = new ๋ถ์ด();
๋ถ์ด ํฅ = new ๋ถ์ด ();
//๋ถ์ดํด๋์ค์ ๊ธฐ๋ฅ๊ณผ ์์ฑ ์ฌ์ฉ ๊ฐ๋ฅ
๊ธ๋ถ์ด.isCarp = true;
ํฅ.isCarp = false;
/*๋ถ์ด ํด๋์ค์๋ ๋์ด ์์ฑ์ด ๋ถ๊ฐ๋ฅํ์ง๋ง, ๋ถ์ด๋นต์์๋ age, fillings, name์ ์ธ ์ ์๋ค*/
๊ธ๋ถ์ด.age = 15, ํฅ.age = 1;
๊ธ๋ถ์ด.productName = "๋ถ์ด๊ฐ ์๋ ๋ถ์ด๋นต", ํฅ.productName="๋ถ์ด ์๋ ๋ถ์ด๋นต";
๊ธ๋ถ์ด.fillings = "๋ถ์ด๊ฐ ๋ค์ด์์ด์ฉ" ,ํฅ.fillings = "ํฅ์ด ๋ค์ด์์ด์ฉ";
๊ธ๋ถ์ด.curse(); //"์ ์ฃผํ ๊ฑฐ์ผ ์ธ๊ฐ..." ์ ์ถ๋ ฅํ๋ค
ํฅ.curse(); //"๋ฐ๋๋ฐ๋" ์ ์ถ๋ ฅํ๋ค
๊ธ๋ถ์ด.carp(); // ๋ถ์ด๋นต ํด๋์ค์ ๊ธฐ๋ฅ๋ ์ธ ์ ์๋ค
}
}
์์ ์ฝ๋์ ์์ ๊ด๊ณ๋ฅผ ์ดํด๋ณด์.
์์์ ๊ด๊ณ๋ is a ๊ด๊ณ๋ผ๊ณ ํ๋ค
๐๊ธ๋ถ์ด is a ๋ถ์ด๋นต
๐ํฅ๋ถ์ด๋นต is a ๋ถ์ด๋นต
๐๋ถ์ด๋นต is an Object
๐ ๋ถ์ด๋นต๊ณผ ํฅ๋ถ์ด๋นต์ ๊ด๊ณ : ๋ถ์ด๋นต↔ํฅ๋ถ์ด๋นต
๐ Object์ ํฅ๋ถ์ด๋นต์ ๊ด๊ณ : ์ค๋ธ์ ํธ↔ํฅ๋ถ์ด๋นต
๐ ํฅ๋ถ์ด๋นต๊ณผ ๊ธ๋ถ์ด์ ๊ด๊ณ : ๊ธ๋ถ์ด โํฅ๋ถ์ด๋นต ๊ธ๋ถ์ด (๋๊ตฌ์..?) - ํฅ๋ถ์ด๋นต(ํ๋..)
<2> ๋จ์ผ ์์
๋ค์ค ์์์ ๊ฒฝ์ฐ ์ฌ๋ฌ ํด๋์ค์ ๊ธฐ๋ฅ์ ๋ฌผ๋ ค๋ฐ์ ์ ์์ผ๋ ๊ด๊ณ๊ฐ ๋ณต์กํด์ง ์ ์๋ค. ๋ฐ๋ผ์, ์๋ฐ๋ ๋จ์ผ ์์๋ง์ ์ง์ํ๋ค
์์ UML ์์ ๋ถ์ด๋ ๋ถ์ด๋นต์ ์์๋ฐ์์ผํ๋ ์ด๋ช ์ ์ฒํด์๋ค. ํ์ง๋ง, ๋ถ์ด๋ ๋ฌผ๊ณ ๊ธฐ๊ธฐ์ ๋ ๋ฌผ๊ณ ๊ธฐ ํด๋์ค๋ฅผ ์์๋ฐ์๋ณผ๊น ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๊ฒ ๋ฌด์จ์ผ์ธ๊ฐ.. ๋ฌผ๊ณ ๊ธฐ์ ๋ถ์ด๋นต ํด๋์ค ๋ชจ๋ ์ฟจ๋ค์ด ๊ธฐ๋ฅ์ด ์๋ค. ๋ฌผ๊ณ ๊ธฐ์ ์ฟจ๋ค์ด ๋งค์๋๋ ์์์ ํ๋ค ์ ์ ์ฌ๋ ๊ธฐ๋ฅ์ ๊ฐ์ก์ง๋ง, ๋ถ์ด๋นต์ ์ฟจ๋ค์ด์ ์์์ด ์ฐจ๊ฒ ์๋ ๊ธฐ๋ฅ์ ๋ด๋นํ๊ณ ์๋ค. ์ด๋, ๋ถ์ด๋ ๋๋ ๋ง์ ๋น ์ง๋ค...
์ด๋ฐ ์ํฉ์ ๋ชจ๋ฉดํ๊ธฐ ์ํด ์๋ฐ๋ ์์์ ํ๋๋ง ๋ฐ์ ์ ์๊ฒ ์ ํ๋ค ์ค๋นค ๋๋ฌด๊ทน๋จ์ ์ด์ผ..
๊ทธ๋ ๋ค๋ฉด ์์ ์ธ์๋ ํด๋์ค๋ฅผ ์ฌํ์ฉ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น?
ํฌํจ๊ด๊ณ
์์ ์ด์ธ์ ํด๋์ค๋ฅผ ์ฌํ์ฉ ํ๋ ๋ฐฉ๋ฒ 2๊ฐ ์ด์์ ํด๋์ค์์ ํน์ฑ์ ๊ฐ์ ธ์ฌ ๋ ํ๋๋ ์์, ๋๋จธ์ง๋ ๋ฉค๋ฒ ๋ณ์๋ก ์ฒ๋ฆฌํ๋ค
๐คฆ๐ปโ๏ธ ํฌํจ ๊ด๊ณ๋ has - a ๊ด๊ณ์ด๋ค
public class ๋ฌผ๊ณ ๊ธฐ{
void swim() { System.out.println("์ดํธ์ดํธ~"); }
void coolDown(){ System.out.println("ํฅํฅ.."); } }
public class ๋ถ์ด2 extends ๋ถ์ด๋นต{ //is a ๊ด๊ณ (๋ถ์ด๋นต์ ์์๋ฐ์ ๋ถ์ด)
๋ฌผ๊ณ ๊ธฐ ๋ถ์ด; //has a ๊ด๊ณ (๋ฌผ๊ธฐ๊ฐ has a ๋ถ์ด)
boolean isCarp; //๊ณ ์ ์ ์์ฑ, ๊ธฐ๋ฅ
void coolDown(){
if (isCarp){๋ถ์ด.swim();} //๋ถ์ด๋ฉด ํค์์น๋ค
else{ System.out.println("๋ถ์ด๋นต์ ์์ ๋ชปํด");}} } //ํฅ์ ํค์ ๋ชป์ณ..
public class ๋ถ์ด๋นต๋ง๋ค๊ธฐ{
public static void main(String[]args)
{
//๋ถ์ด ๊ฐ์ฒด ๋ง๋ค๊ธฐ
๋ถ์ด ๊ธ๋ถ์ด = new ๋ถ์ด();
๋ถ์ด ํฅ = new ๋ถ์ด ();
//๋ถ์ดํด๋์ค์ ๊ธฐ๋ฅ๊ณผ ์์ฑ ์ฌ์ฉ ๊ฐ๋ฅ
๊ธ๋ถ์ด.isCarp = true;
ํฅ.isCarp = false;
//๊ณ ์ ๊ธฐ๋ฅํ์ฉ
๋ถ์ด.swim(); //์ดํธ์ดํธ!
ํฅ.swim(); //๋ถ์ด๋นต์ ์์๋ชปํด..
}
}
๐คฆ๐ปโ๏ธ ์ธ์ ํฌํจ์ ์ฐ๊ณ ์ธ์ ์์์ ์จ์ผ ํ ๊น?
๐งธ ๋ฌธ๋ฒ์ ์ธ ๋ฌธ์ ๋ ์๋์ง๋ง ํ๋ก์ ํธ์ ๊ด์ ์ ๋ฐ๋ผ ๊ฒฐ์ ํด์ผ ํ๋ค ๐งธ
- ์์ is -a ๊ด๊ณ๊ฐ ์ฑ๋ฆฝํ๋๊ฐ?
- ํฌํจ has-a ๊ด๊ณ๊ฐ ์ฑ๋ฆฝํ๋๊ฐ?
๐ ๋ถ์ด is a ๋ถ์ด๋นต โ๋ถ์ด has a ๋ฌผ๊ณ ๊ธฐ ๐ ๋ถ์ด is a ๋ฌผ๊ณ ๊ธฐ โ๋ถ์ด has a ๋ถ์ด๋นต
2๋ฒ์ด ๋์ ๋ณด์ด์ง๋ง, ํ๋ก์ ํธ๊ฐ ๋ถ์ด๋นต ๋ง๋ค๊ธฐ์ด๊ธฐ ๋๋ฌธ์ ์ฒซ๋ฒ์จฐ ๊ด๊ณ๋ก ์๋ฆฝ. ์์์ ํ๋ฒ๋ฟ์ด๋ ์ ์คํ๊ฒ ํ๋ก์ ํธ์ ๋ฐ๋ผ ๊ฒฐ์ ํ์
์ธํฐํ์ด์ค
์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ๋ฉด extends ๋ฅผ ํตํด ๋ค์ค ์์์ด ๊ฐ๋ฅํ๋ค. ํด๋์ค ์์๊ณผ๋ ๋ค๋ฅด๊ฒ, ์ธํฐํ์ด์ค๋ ๋ฉ์๋์ ๊ตฌํ์ด ์๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์์ ํผ๋์ ์ฃผ๋ ์ผ์ด ์์ด ๋ค์ค ์์์ด ๊ฐ๋ฅํด์ง๋ ๊ฒ์ด๋ค.
<3> ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ
๐คฆ๐ปโ๏ธ ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ์ ํ๋์ผ์ ๊ฐ๊ณ ํ๋ผ๋ฏธํฐ๋ง ๋ค๋ฅด๊ฒ ํ์ฌ ์กฐ๊ฑด์ ๋ค๋ฅด๊ฒ ํ๋ ํ์์ธ๋ฐ, ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ๊ฐ์ ์กฐ๊ฑด์์ ํ๋ ์ผ์ ๋ค๋ฅด๊ฒ ํ๋๊ฒ์ด๋ค
๋งค์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ด๋, ์กฐ์ ํด๋์ค์ ์ ์๋ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค์์ ์ ํฉํ๊ฒ ์์ ํ๋ ๊ฒ์ด๋ค
public class Fish{
void swim(){
System.out.println("์ดํธ์ดํธ");
}
}
public class ๋ถ์ด extends Fish{
@override //annotation
void swim(){ //์ฌ์ ์
System.out.println("๋๋ฆฟ๋๋ฆฟ");}
}
๊ธฐ์กด์ ์๋ ๋ฉ์๋๋ฅผ ๊ทธ๋๋ก ๋ถ๋ฌ์์ ๋ง๊ทธ๋๋ก override ํ ๋ ํ์ํ๋ค. ๋ถ์ด์ ์ฐธ์น๋ ์์ํ๋ intensity ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์, ๊ฐ๊ฐ swim ์ด๋ ๊ธฐ๋ฅ์ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ๊ฐ ์ํฉ์ ๋ง๊ฒ ๊ณ ์ณ์ ์ฐ๋ ๊ฒ์ (๋ฎ์ด ์ด๋ค๊ณ ๋ณด๋ฉด ํธํจ)
์ค๋ฒ๋ผ์ด๋ฉ์ ์กฐ๊ฑด
- ๋ฉ์๋ ์ด๋ฆ์ด ๊ฐ์์ผ ํ๋ค
- ๋งค๊ฐ ๋ณ์์ ๊ฐ์, ํ์ , ์์๊ฐ ๊ฐ์์ผ ํ๋ค
- ๋ฆฌํด ํ์ ์ด ๊ฐ์์ผ ํ๋ค
- ์ ๊ทผ ์ ํ์๋ ๋ถ๋ชจ๋ณด๋ค ๋ฒ์๊ฐ ๋๊ฑฐ๋ ๊ฐ์์ผ ํ๋ค
- ์กฐ์๋ณด๋ค ๋ ํฐ ์์ธ๋ฅผ ๋์ง ์ ์๋ค
<4> ์ค๋ธ์ ํธ ํด๋์ค
์ค๋ธ์ ํธ ํด๋์ค๋ ๊ฐ์ฅ ์ต์์ ํด๋์ค๋ก, ๋ชจ๋ ํด๋์ค์ ์กฐ์์ด๋ค. ์ฆ, ์ค๋ธ์ ํธ์ ๋งด๋ฒ๋ ๋ชจ๋ ํด๋์ค์ ๋งด๋ฒ๊ฐ ๋๋ค
<5>Super ํค์๋
this ๋ฅผ ํตํด ๋งด๋ฒ์ ์ ๊ทผํ๋ฏ์ด super ๋ฅผ ํตํด ์กฐ์ ํด๋์ค ๋งด๋ฒ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค super. ์ ์ด์ฉํด ์กฐ์์ ๋ฉ์๋ ํธ์ถ๋ก ์กฐ์์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉ ํ๋ค
void swim(){
if(isCap) { ๋ถ์ด.swim();}
else{
System.out.println("๋ถ์ด๋นต์ ์์๋ชปํด");
}
}
void swim() {
if(isCarp){ ๋ถ์ด.swim();}
else{
super.swim();} //์กฐ์ํด๋์ค์ ์ฝ๋ ํธ์ถ
}
- ๋ณ์์ ์ค์ฝํ ์ฌ์ฉ๋ ์์น์์ ์ ์ ํ์ฅํด๊ฐ๋ฉฐ ์ฒ์ ๋ง๋ ์ ์ธ๋ถ์ ์ฐ๊ฒฐ๋๋ค method ๋ด๋ถ → ํด๋น ํด๋์ค์ ๋งด๋ฒ ๋ณ์ → ์กฐ์ ํด๋์ค์ ๋งด๋ฒ ๋ณ์
1๏ธโฃ ์๋ ํด๋์ค์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์์ํด๋ณด์์ค
2๏ธโฃ method์ x๋ฅผ ์ฃผ์ํ ํ ๊ฒฐ๊ณผ๋ฅผ ์์ํด๋ณด์์ค
3๏ธโฃ child ์ x ๋ ์ฃผ์ํ ํ ๊ฒฐ๊ณผ๋ฅผ ์์ํด๋ณด์์ค
4๏ธโฃ Parent ํด๋์ค์ x๋ง ์ฃผ์ํ ๊ฒฐ๊ณผ๋ฅผ ์์ํด ๋ณด์์ค
class Parent{ String x = "parent";}
class Child extends Parent{
String x = "Child"; //memeber ๋ณ์
void method(){
String x = "method"; //local ๋ณ์
System.out.println("X: " +x);
System.out.println("this.x: " + this.x);
System.out.println("super.x: " + super.x);
}
}
class ScopeTest{
main(){ //main์ฃผ์ ๋ฆฌ ์๋ตํ์ ใ
..
Child child = new Child();
child.method();
}
}
1๏ธโฃ ์์ ๊ฒฐ๊ณผ X: method this.x: child super.x: parent
2๏ธโฃ ์์ ๊ฒฐ๊ณผ X: Child this.x : Child super.x : parent
3๏ธโฃ ์์ ๊ฒฐ๊ณผ X: parent this.x: parent super.x: parent;
4๏ธโฃ ์์๊ฒฐ๊ณผ X: method this.x: Child super.x: null → ERROR
โญthis ๋ ํค์๋๋ ๋งด๋ฒ ๋ณ์๋ฅผ ๋ปํ๋ ํค์๋์ด๊ธฐ ๋๋ฌธ์, 1๋ฒ ๋ฌธ์ ์์ this.x๋ฅผ ํ์๋ void ์์ ์ ์ธ๋ ๋ก์ปฌ๋ณ์(์ง์ญ๋ณ์)์ธ method ๊ฐ ์๋๋ผ, ๋งด๋ฒ๋ณ์๋ฅผ ๊ฐ์ ธ์จ ๊ฒ์ด๋ค!
2. this() ์ super()
(1) this () ๊ฐ ํด๋น ํด๋์ค์ ๋ค๋ฅธ ์์ฑ์๋ฅผ ํธ์ถํ๋ฏ์ด, super() ๋ ์กฐ์ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถ
๐งธ ์กฐ์ ํด๋์ค์ ์ ์ธ๋ ๋งด๋ฒ๋ค์ ์กฐ์ ํด๋์ค์ ์์ฑ์์์ ์ด๊ธฐํ๊ฐ ์ด๋ค์ ธ์ ์ฌํ์ฉ
๐งธ ์์ ํด๋์ค์ ์ ์ธ๋ ๋งด๋ฒ๋ค๋ง ์์ ํด๋์ค ์์ฑ์์์ ์ด๊ธฐํ
(2) super()๋ ์์ ํด๋์ค ์์ฑ์์ ๋งจ ์ฒซ์ค์์๋ง ํธ์ถ ๊ฐ๋ฅ
๐งธ ์์ฑ์์ ์ฒซ์ค์๋ง this() ๋๋ super() ๊ฐ ์ฌ ์ ์๋ค
(3) ๋ช ์์ ์ผ๋ก this() ๋๋ super() ์ ํธ์ถํ์ง ์๋ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ super()์ ์ฝ์ ํด์ง๋ค
๐งธ๋งจ ์์ Object๊น์ง ๊ฐ์ฒด๊ฐ ๋ค ๋ง๋ค์ด์ง
class Parent {
String name;
Parent(String name){
//super(); -> ์ค๋ธ์ ํธ์ ๊ธฐ๋ณธ์์ฑ์ ํธ์ถ. ์๋ฌด๊ฒ๋ ์์จ์์ผ๋ฉด ๋ช
์์ ์ผ๋ก ๋ถ๋ฆ
this.name = name; //this์ super๋ ๋งจ ์ฒซ์ค๋ง ๊ฐ๋ฅ
}
}
'์ทจ์ค > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์บก์ํ (0) | 2022.05.17 |
---|---|
๋คํ์ฑ (0) | 2022.05.17 |
์ถ์ํ (0) | 2022.05.17 |
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ (0) | 2022.05.17 |
Class Case Exception (0) | 2022.05.17 |