1.Super๋?
์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๋งค์๋๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ์ฌ์ฉ ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ ๊ฒ์ด๋ค.
์ง๊ธ๊น์ง ๋ค์ด์จ ์นด๋ฉ๋ผ ํด๋์ค๋ฅผ ์๋ก ๋ค์ด๋ณด์.
**์ฌ์ ์ฐธ๊ณ ์ฌํญ (๋ถ๋ชจ ํด๋์ค์ ์์ํด๋์ค)**
// ๋ถ๋ชจ ํด๋์ค
public class Camera {
public String name;
public Camera() {
this.name = "์นด๋ฉ๋ผ"
}
public void takePicture() {
// ์ฌ์ง ์ดฌ์
System.out.println(this.name + ": ์ฌ์ง์ ์ดฌ์ํฉ๋๋ค.");
}
public void recordVideo() {
// ๋์์ ๋
นํ
System.out.println(this.name + ": ๋์์์ ๋
นํํฉ๋๋ค.");
}
public void showMainPicture() {
System.out.println(this.name + "์ ์ฃผ์ ๊ธฐ๋ฅ : ์ฌ์ง ์ดฌ์, ๋์์ ๋
นํ");
}
}
// ์์ ํด๋์ค 1 - FactoryCam
public class FactoryCam extends Camera {
public FactoryCam() {
this.name = "๊ณต์ฅ ์นด๋ฉ๋ผ";
}
public void detectFire() {
//ํ์ฌ ๊ฐ์ง
System.out.println("ํ์ฌ๋ฅผ ๊ฐ์งํฉ๋๋ค.");
}
public void showMainPicture() {
System.out.println(this.name + "์ ์ฃผ์ ๊ธฐ๋ฅ : ํ์ฌ ๊ฐ์ง");
}
}
//์์ ํด๋์ค2 - SpeedCam
public class SpeedCam extends Camera {
public SpeedCam() {
this.name = "๊ณผ์๋จ์ ์นด๋ฉ๋ผ";
}
public void checkSpeed() {
// ์๋ ์ฒดํฌ
System.out.println("์๋๋ฅผ ์ธก์ ํฉ๋๋ค.");
}
public void recognizeLicensePlate(){
// ๋ฒํธ ์ธ์
System.out.println("์ฐจ๋ ๋ฒํธ๋ฅผ ์ธ์ํฉ๋๋ค.");
}
@Override// annotation -> ์ปดํ์ผ ํ๋ ์ปดํจํฐ์๊ฒ ์ค๋ช
ํ๊ธฐ ์ํ ์ฃผ์ (์ฐ๋ฆฌ๊ฐ ์ง๊ธ ์ค๋ฒ๋ผ์ด๋ฉ์ ์ผ๋ค๊ณ ์๋ฆผ)
public void showMainPicture() {
System.out.println(this.name + "์ ์ฃผ์ ๊ธฐ๋ฅ : ์๋ ์ธก์ , ๋ฒํธ ์ธ์");
}
}
๋ง์ฝ ๊ณต์ฅ ์นด๋ฉ๋ผ๊ฐ ์์์ ์ฐ๋ ๋์์ ํ์ฌ ๊ฐ์ง๋ฅผ ํ๋ค๋ฉด?
๊ณผ์๋จ์ ์นด๋ฉ๋ผ๊ฐ ์ฌ์ง์ ์ฐ๋ ๋์์ ์๋์ฒดํฌ์ ์ฐจ๋๋ฒํธ ์ธ์์ ํ๋ค๋ฉด?
๋ถ๋ชจ ํด๋์ค์ takePicture() ๋งค์๋์ recordVideo()๋งค์๋๋ฅผ ๋ค๊ณ ์์ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ฌ ํํํ ์ ์์ ๊ฒ์ด๋ค.
// FactoryCam ์์ ์๋ ๋งค์๋
public void recordVideo() {
// ๋์์ ๋
นํ
System.out.println(this.name + ": ๋์์์ ๋
นํํฉ๋๋ค.");
// ๋์ผ ํด๋์ค ๋ด ๋งค์๋๋ฅผ ํธ์ถ
detectFire();
}
//SpeedCam ์์ ์๋ ๋งค์๋
public void takePicture() {
// ์ฌ์ง ์ดฌ์
System.out.println(this.name + ": ์ฌ์ง์ ์ดฌ์ํฉ๋๋ค.");
checkSpeed();
recognizeLicensePlate();
}
ํ์ง๋ง ์ด๋ ๊ฒ ํํํ๋ค๋ฉด, ์์์ ์ฐ๋ ์๋ฏธ๊ฐ ์๋ค. ์์์ ์ ์ผ๋๊ฐ? ๊ณตํต๋ ๋ด์ฉ์ ์์ ๋ฐ์ผ๋ฏ๋ก์จ ๋ถํ์ํ ์ค๋ณต์ ํผํ๊ธฐ ์ํจ์ด์๋ค. ํ์ง๋ง ๋ถ๋ชจ ํด๋์ค์ ๋ชจ๋ ๋งค์๋๋ฅผ ์ผ์ผํ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ค๋ฉด, ๋ถํ์ํ ์ค๋ณต์ด ์ปค์ง๋ค.
์ด๋ฅผ ์ํด ์ฐ๋ ๊ฒ์ด super๋ผ๋ ํค์๋์ด๋ค. super๋ ํด๋น ํด๋์ค์ ๋ถ๋ชจํด๋์ค์ ์ ๊ทผํ๊ฒ ํด์ค๋ค.
์์ ๋ด์ฉ์ super๋ฅผ ํตํด ๋ฐ๊พธ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
public void recordVideo() {
//๋ถ๋ชจํด๋์ค์ ๋ ์ฝ๋ ๋น๋์ค๋ฅผ ๋จผ์ ์ํํ๋ผ.
super.recordVideo();
detectFire();
}
public void takePicture() {
super.takePicture();
checkSpeed();
recognizeLicensePlate();
}
์ด๋ฌ๋ฉด ํด๋น ๋ถ๋ชจ ํด๋์ค์ takePicture()์ recordVideo()๊ฐ ๋ช ์ค์ด๋ , ์ฝ๋ 1ํ์ผ๋ก ์ปค๋ฒ๊ฐ ๊ฐ๋ฅํ๋ค.
**์์ ํด๋์ค์ ์์ฑ์๋ฅผ Super๋ก ํํํ๋ ๊ฒฝ์ฐ**
๋ถ๋ชจ ํด๋์ค์ ๋งค์๋๋ ๋ณ์ ์ ๊ทผ ์ : super.๋งค์๋ ์ด๋ฆ(); or super.๋ณ์์ด๋ฆ;
๋ถ๋ชจ ํด๋์ค์ ์์ฑ์ ์ ๊ทผ์ : super(๋ค์ด๊ฐ ์ธ์);
//๋ถ๋ชจ ํด๋์ค
public class Camera {
// ์์ฑ์๊ฐ ๋ ๊ฐ (์ค๋ฒ๋ก๋ฉ ์ด์ฉ) : ๊ฐ๋ฐ์๊ฐ ์์ฑ์ ํธ์ถํ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ ๊ฐ๋ก ๋๋ ๋์ ๊ฒ
public camera(){
this.name = "์นด๋ฉ๋ผ";
}
// ๋ค๋ฅธ ํจํค์ง์ ์๋๋ผ๋ ์์์ ์์ฒํ๋ฉด ์ด ์์ฑ์์ ์ ๊ทผํ ์ ์๊ฒ protected keyword๋ฅผ ์
protected camera (String name) {
this.name = name;
}
}
// ๋ถ๋ชจ ํด๋์ค์ ๋๋ฒ์งธ ์์ฑ์๋ก ์ ๊ทผํ์ฌ ๊ฐ์ ์ธ์คํด์ค ๋ณ์๋ฅผ ์ด๊ธฐํ
public class FactoryCam extends Camera {
public FatoryCam(){
super("๊ณต์ฅ ์นด๋ฉ๋ผ");
}
}
public class SpeedCam extends Camera {
public SpeedCam() {
super("๊ณผ์๋จ์ ์นด๋ฉ๋ผ");
}
}
2. ์ ๊ฒ
super๊ฐ ํ๋ ์ญํ
super.๋งค์๋์ด๋ฆ or ๋ณ์;
super(ํ๋ผ๋ฏธํฐ ๋ค์ด๊ฐ์๋ ์์);