1. ์ ์
๋คํ์ฑ์ด๋, ํ๋์ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ๊ฐ์ง ํ์ ์ ๊ฐ์ง ์ ์๋ ๊ฒ์ ๋งํ๋ค.
Java์์๋ ๋ถ๋ชจ ํด๋์ค์ ์ฐธ์กฐ ๋ณ์๊ฐ ์์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก ํ๋ ๊ฒ์ผ๋ก ๋คํ์ฑ์ ๊ตฌํํ๋ค.
๋ง์ฝ Camera class๊ฐ factoryCam class์ ๋ถ๋ชจ ํด๋์ค ๋ผ๋ฉด,
//Canera๊ฐ ๋ถ๋ชจํด๋์ค, factoryCam์ด ์์ํด๋์ค
Camera FC = new factoryCam();
๋ผ๊ณ ์ ์ธ์ด ๊ฐ๋ฅํ๊ณ , ์์ ๋์์ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๋ง์ฝ ์ฐธ์กฐ๋ณ์์ ์ผ๋ฐ๋ณ์์ ์ฐจ์ด๊ฐ ํท๊ฐ๋ฆฐ๋ค๋ฉด, ๋ฐ์ ๋งํฌ๋ฅผ ์ฐธ์กฐํ์.
https://dalcheonroadhead.tistory.com/68
๋ง์ฝ Camera ํด๋์ค์ factoryCam, SpeedCam ์ด๋ผ๋ ์์ ํด๋์ค๊ฐ ์๋ค๊ณ ํ์ ๋, ๋คํ์ฑ์ ์ด์ฉํด ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
//์ผ๋ฐ ๊ฐ์ฒด ์ ์ธ
Camera C = new Camera();
// ๋คํ์ฑ์ ์ด์ฉํ ๊ฐ์ฒด ์ ์ธ
Camera FC = new FactoryCam();
Camera SC = new SpeedCam();
**๊ทธ๋ ๋ค๋ฉด ์์ํด๋์ค์ ์ฐธ์กฐ๋ณ์๊ฐ ๋ถ๋ชจ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์๋ ์์๊น?
์๋ค. java์์๋ ๋คํ์ฑ์ ๋ถ๋ชจ ํด๋์ค ์ฐธ์กฐ๋ณ์๋ก ์์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํฌ๋๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
(2) ๋คํ์ฑ ์ด์ฉํ ๊ฐ์ฒด ์ ์ธ์ ๋ฐฐ์ด๋ก ํํํ๊ธฐ.
๋ฐฐ์ด ๋ํ ์ฐธ์กฐํ ํ์ ์ด๋ค. ๋ฐฐ์ด์ด ๊ฐ์ ์ ์ฅํ๋ ์๋ฆฌ๋ ์์ ๋คํ์ฑ ์ด์ฉ ๊ฐ์ฒด ์ ์ธ์ ์๋ฆฌ์ ๊ฐ๋ค.
๋ฐฐ์ด์ ์๋ฆฌ๋ฅผ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๋คํ์ฑ ์ด์ฉํ ๊ฐ์ฒด ์ ์ธ์ ๋ฐฐ์ด๋ก ํํํ๋ฉด,
// ํด๋์ค๋ ์๋ฃํ์ ์ทจ๊ธ์ ๋ฐ์ผ๋ฏ๋ก ๋ฐ์ ๋ฌธ์ฅ์ด ๊ฐ๋ฅํ๋ค.
Camera[] cameras = new Camera[3];
Camera[0] = new Camera();
Camera[1] = new FactoryCam();
Camera[2] = new SpeedCam();
2. ํน์ง
๋คํ์ฑ์ ์ด์ฉํ์ฌ ๋ถ๋ชจ ํด๋์ค ์ฐธ์กฐ ๋ณ์๋ก ์์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๊ฒฝ์ฐ, ํด๋น ์ฐธ์กฐ๋ณ์๋ค์ ์์ ํด๋์ค ๊ณ ์ ์ ๋งค์๋๋ ์ฌ์ฉํ ์ ์๋ค. (์ค๋ก์ง ๋ถ๋ชจํด๋์ค์ ๊ณตํต๋ ๋งค์๋๋ง ์ฌ์ฉํ ์ ์์.)
์ด์ ?
์ ์ธํ ์๋ฃํ์ด ๋ถ๋ชจํด๋์ค์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์์ ํด๋์ค ์์ผ๋ก ์ง์ ํ ์๊ฐ ์๋ค.
๊ทธ๋ ๋ค๋ฉด, ๋คํ์ฑ์ ์ด์ฉํ ๊ฐ์ฒด ์ ์ธ ์ดํ์, ์์ ํด๋์ค ๊ณ ์ ์ ๋ณ์์ ๋งค์๋๋ ์ฌ์ฉํ ๋ ค๋ฉด?
ํด๋น ์ฐธ์กฐ๋ณ์๊ฐ ์์ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋์ง ํ์ธํ๊ณ , ์ฐธ์กฐํ๋ค๋ฉด, ๋ณ์์ ์๋ฃํ์ ์์ํด๋์ค๋ก ํ๋ณํ ์์ผ์ผํ๋ค.
* ์ฌ์ ์ฐธ๊ณ ์ฌํญ 1 (๋ถ๋ชจ ํด๋์ค ๋ด๋ถ)
// ๋ถ๋ชจ ํด๋์ค
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 + "์ ์ฃผ์ ๊ธฐ๋ฅ : ์ฌ์ง ์ดฌ์, ๋์์ ๋
นํ");
}
}
*์ฐธ๊ณ ์ฌํญ 2 (์์ ํด๋์ค ๋ด๋ถ)
//FactoryCam
public class FactoryCam extends Camera {
public FactoryCam() {
this.name = "๊ณต์ฅ ์นด๋ฉ๋ผ";
}
public void detectFire() {
//ํ์ฌ ๊ฐ์ง
System.out.println("ํ์ฌ๋ฅผ ๊ฐ์งํฉ๋๋ค.");
}
public void showMainPicture() {
System.out.println(this.name + "์ ์ฃผ์ ๊ธฐ๋ฅ : ํ์ฌ ๊ฐ์ง");
}
}
//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 + "์ ์ฃผ์ ๊ธฐ๋ฅ : ์๋ ์ธก์ , ๋ฒํธ ์ธ์");
}
}
Camera camera = new Camera();
Camera factoryCam = new FactoryCam();
Camera speedCam = new SpeedCam();
//์์ ๊ฐ์ด ๋ถ๋ชจ ํด๋์ค ์๋ฃํ์ผ๋ก ์ ์ธํ๋ฉด, ์์ํด๋์ค ๊ณ ์ ์ ๋งค์๋๋ ์ฌ์ฉ๋ถ๊ฐ
// factoryCam.detectFire();
// speedCam.checkSpeed();
// speedCam.recognizeLicensePlate();
//์ฌ์ฉํ๊ฒ ํ๋ ค๋ฉด? ๋ด์ฉ๋ฌผ์ด ์์ ํด๋์ค ๊ฐ์ฒด๊ฐ ๋ง๋์ง ํ์ธ
// ๋ง๋ค๋ฉด ์๋ฃํ์ ํ ๋ณํ (๋ถ๋ชจ ํด๋์ค -> ์์ ํด๋์ค)
if (factoryCam instanceof FactoryCam) {
((FactoryCam)factoryCam).detectFire();
}
if (speedCam instanceof SpeedCam) {
((SpeedCam) speedCam).checkSpeed();
((SpeedCam) speedCam).recognizeLicensePlate();
}
**์ฐธ๊ณ **
์ฌ๊ธฐ์ if (๊ฐ์ฒดa instanceof ํด๋์ค B ) ์ ๊ฐ์ฒด a๊ฐ ํด๋์ค B์ ๊ฐ์ฒด๊ฐ ๋ง๋์ง ํ์ธํ๋ ๊ฒ์ด๋ค.
3. ์ธ์ ๋์ง ์ ๊ฒ
*๋คํ์ฑ์ด๋ ๋ฌด์์ธ์ง
์ฐธ์กฐ๋ณ์ ๊ทธ๋ฆผ์ ํตํด ํํ
*๋ฐ๋๋ก ์์ ํด๋์ค์ ์ฐธ์กฐ๋ณ์๊ฐ ๋ถ๋ชจ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์์๊น? ์๋จ. why?
(1) ์ฝ๋๋ก ์ด๋ป๊ฒ ์ฐ๋์ง ์ง์ ์จ๋ณด๊ธฐ
(2) ๋ฐฐ์ด๋ก ์ด๋ป๊ฒ ๋๊ฐ์ด ๋ํ๋ด๋์ง, ์ ๊ฐ์ ๋ง์ธ์ง ์จ๋ณด๊ธฐ
(3) ์ด๋ ๋๋ ๋ช
๋ น ์๋๋ ๋ช
๋ น, ์๋๋ ๋ช
๋ น์ ์ ์๋๋์ง, ์๋๋ ๋ช
๋ น ๋๊ฒ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ๋์ง