1. ์ธํฐํ์ด์ค๋?
'ํด๋์ค๋ฅผ ์ด๋ป๊ฒ ๋ง๋ค์ด๋ผ'๋ ๊ฐ์ด๋ ๋ผ์ธ์ด๋ค.
์ค๋ก์ง ์์(static final๋ก ์ ์ธ๋ ๋ณ์)์ ์ถ์ ๋งค์๋๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค.
ํด๋น ์ธํฐํ์ด์ค๋ฅผ '๊ตฌํ' ํ ํด๋์ค๋ ์ถ์ ๋งค์๋ ์ ๋ถ๋ฅผ ๊ตฌ์ฒดํํ ์๋ฌด๋ฅผ ๊ฐ์ง๋ค.
* ์ ์ธ
interface ์ธํฐํ์ด์ค ์ด๋ฆ {
์์ or ์ถ์๋งค์๋
}
//EX)
public interface Animal {
public abstract void cry(); //public abstract๋ ์ ์จ๋ ๋จ. -> default๋ก ๋์ด์์
}
*์์ or ๊ตฌํ
์ธํฐํ์ด์ค ๋ผ๋ฆฌ ํ์ฅํ ๋๋ ์์(extends) ํค์๋๋ฅผ ์ฌ์ฉํ๋ค. ํด๋์ค๊ฐ ํน์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ์์ ๊ตฌ์ฒดํ๋ ๋๋ ๊ตฌํ(implements) ํค์๋๋ฅผ ์ด๋ค.
// ์ธํฐํ์ด์ค๋ก ํ์ฅ
public interface Pet extends Animal {
//๊ฐ์ ์ธํฐํ์ด์ค ์ด๋ฏ๋ก ๊ตฌ์ฒดํ x
public abstract void cry();
}
// ํด๋์ค๋ก ๋ฐ์ ๋
public class Dog implements Pet {
public void cry(){
System.out.println("๋ฉ ๋ฉ"):
}
}
์ธํฐํ์ด์ค๋ ํด๋์ค์ ์ฅ์ฐฉํ๋ ๋ถํ ๊ฐ์ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ด๋ค ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์ํ๋ ์์ ํด๋์ค์๋ ์ฅ์ฐฉํ ์ ์๋ค.
public class Poketmon_2G extends Poketmon_1G implements newEngine, NintendoSwitch {
// ํฌ์ผ๋ชฌ 1์ธ๋๋ก๋ถํฐ ์์๋ฐ์ ๋ด์ฉ
// newEngine, ๋ํ
๋ ์ค์์น ๋ด์ฉ๋ ๊ตฌํ
}
(1) ์ธํฐํ์ด์ค์ ์ฅ์ : ์ค๋ณต ์์์ด ๊ฐ๋ฅํ๋ค. (ํด๋์ค์์ ์ฐจ์ด์ )
์ถ์ํด๋์ค๋ ์ ๋ฒ ํฌ์คํ ์ค๋ช ๊ณผ ๊ฐ์ด, ์์ฑ๋์ง ์์ ํด๋์ค๋ฅผ ๋ปํ๋ค.
๋ฐ๋ผ์ ์ถ์ํด๋์ค๋ ์ถ์๋งค์๋๋ฅผ ํฌํจํ์ง๋ง, ์ผ๋ฐ ๋งค์๋, ์์, ๋ณ์ ๋ชจ๋ ํฌํจํ ์ ์๋ค.
ํ์ง๋ง ์ธํฐํ์ด์ค๋ ์ค๋ก์ง ์์์ ์ถ์๋งค์๋๋ง ํฌํจํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ธํฐํ์ด์ค๋ ํด๋์ค ๊ฐ์ด๋ ๋ผ์ธ์ ์ ๋ง๋ค์์๊น?
์ฐ๋ฆฌ๊ฐ ํด๋์ค๋ฅผ ๋ง๋ค๋ค๋ณด๋ฉด, ๋ค์์ ํด๋์ค๋ฅผ ํ๋ฒ์ ์์๋ฐ์ ์ฐ๊ณ ์ถ์ ์ํฉ์ด ์๊ธด๋ค.
์๋ฅผ ๋ค์ด ๋ฐ๋ ค๋๋ฌผ์ด๋ผ๋ ํด๋์ค๊ฐ ๋ฐ๋ ค๋๋ฌผ์ ์ธ์์๋ฆฌ๋ฅผ ํํํ๋ ๋งค์๋๋ฅผ ๊ฐ์ง๋ค๊ณ ๊ฐ์ ํ์. ์ด ๊ฒฝ์ฐ ์ธ์์๋ฆฌ๋ฅผ ๋๋ฌผ ๋ณ๋ก ์ผ์ผํ ๋ง๋ค๊ธฐ ๋ณด๋จ, ๋ค์์ ๋๋ฌผ ํด๋์ค๋ฅผ ์์๋ฐ์, super.cry();๋ก ์ฝ๊ณ ๊ฐ๊ฒฐํ๊ฒ ํํํ๊ณ ์ถ์ ์ ์๋ค. ํ์ง๋ง ํด๋์ค๋ ์ค๋ณต ์์์ด ๋ถ๊ฐ๋ฅํ๋ค.
์๋ํ๋ฉด ๋งค์๋ ํธ์ถ์ ๋ชจํธ์ฑ์ด ์๊ธฐ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด ์ค๋ช ํ๊ฒ ๋ค.
์์ ์์์ ์ด์ด์, ๋ฐ๋ ค๋๋ฌผ ํด๋์ค ์์ ๊ณ ์์ด์ ๊ฐ์์ง์ ์ธ์์๋ฆฌ๋ฅผ ๋๋ค ํํ ํ๊ณ ์ ํ๋ค. ๊ณ ์์ด์ ๊ฐ์์ง ๊ฐ๊ฐ ์ธ์์๋ฆฌ ๊ธฐ๋ฅ์ ๊ฐ์ง ํด๋์ค๊ฐ ์กด์ฌํ๋ค๊ณ ํ๋ฉด,
// class๋ก ์ค๋ณต ์์ํ ๊ฒฝ์ฐ
public class Dog{
public void cry(){
System.out.println("๋ฉ ๋ฉ");
}
}
public class Cat{
public void cry(){
System.out.println("์์น ๊น์น")
}
}
public Pet extends Dog,Cat {
public void cry(){
// ํด๋น super๊ฐ ์ง์นญํ๋ ๋ถ๋ชจ ํด๋์ค๋ ๋๊ตฌ์ง? ์ด๋ค ํด๋์ค์ ๋งค์๋๋ฅผ ํธ์ถํ ๊ฒ์ด์ง?
super.cry();
}
}
์์ ๊ฐ์ด ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๋งค์๋๋ฅผ ํธ์ถํ ๋, ๋ ๋งค์๋์ ์ด๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ, ํธ์ถํ ๋งค์๋๊ฐ ๋๊ตฌ์ธ์ง ๋ชจํธํ๋ค. ์ด๊ฒ์ ๋งค์๋ ํธ์ถ์ ๋ชจํธ์ฑ์ด๋ผ ์๊ธด๋ค.
์ถ์ ํด๋์ค๋ ์ถ์ ๋งค์๋๊ฐ ์์ด์ ๋ ๋์ ๊ฒ์ด๋ผ ์๊ฐํ ์ ์์ง๋ง, ์ถ์ ํด๋์ค๋ ๋๊ฐ์ด ์ผ๋ฐ ๋งค์๋์ ๋ณ์๋ฅผ ๊ฐ์ง ์ ์๋ ์ ์ฅ์์ ๋งค์๋ ํธ์ถ์ ๋ชจํธ์ฑ์์ ์์ ๋กญ์ง ์๋ค.
๋ฐ๋ผ์ Java๋ ํด๋์ค์ ์ค๋ณต์์์ ๊ธ์งํ๋ค.
ํ์ง๋ง ์ค๋ณต ์์์ ์ฌ์ ํ ์ด์ ์ด ์๋ค. ์์ ๊ด๊ณ๋ฅผ ํตํด ํด๋น ํด๋์ค์ ์ํ ๋ด์ฉ์ด ๋ญ์ง ๋น ๋ฅด๊ฒ ํ์ ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ฌ์ค๋ค.
Java์์๋ ์ค๋ณต ์์์ ์ด์ ์ ์ด์ฉํ๊ธฐ ์ํด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ๋ฉด ๋งค์๋ ํธ์ถ์ ๋ชจํธ์ฑ์ด ์๊ธฐ์ง ์์, ์ค๋ณต ์์์ ์ฌ์ฉํ ์ ์๋ค.
public interface Dog {
void cry();
}
public interface Cat {
void cry();
}
public class Pet implements Dog, Cat {
public void cry(){
System.out.println("๋ฉ ๋ฉ, ๋์น ๋์น");
}
}
๊ตฌํ ์์ฒด๋ ํด๋์ค์์๋ง ํ๋ฏ๋ก, ๋งค์๋ ํธ์ถ์ ๋ชจํธ์ฑ์ด ์ผ์ด๋์ง ์๊ณ , ์ฐ๋ฆฌ๋ ๊ตฌํํ ์ธํฐํ์ด์ค๊ฐ ๋ญ์ง๋ง ๋ด๋ ํด๋น ํด๋์ค์์ ๊ตฌํํ ๋ด์ฉ์ด ๋ฌด์์ธ์ง ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์๋ค. (์ฌ๊ธฐ์๋ ์ธํฐํ์ด์ค ๋ณ๋ก ๋งค์๋๊ฐ ํ๋์ฌ์ ์๋ฟ์ง ์์ง๋ง, ์ธํฐํ์ด์ค ๋ณ๋ก ๋งค์๋๊ฐ ๋ค๋ฅด๊ณ , ๋ง์ ๊ฒฝ์ฐ๋ฅผ ์์ํด๋ด๋ผ.)
2. ์ฝ๋ ํด์ค
์์ ๋ด์ฉ์ ๋ํด์ ํด์ค ํ๊ฒ ๋ค.
๋จผ์ ์์ ์์๋ Detectable๊ณผ Reportable์ด๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ ๊ฐ ๋ง๋ค์๋ค.
public interface Detectable {
void detect(); // ํ์ฌ ๊ฐ์ง
}
public interface Reportable {
void report(); //์ ๊ณ ๊ธฐ๋ฅ
}
ํด๋น ์ธํฐํ์ด์ค๋ฅผ ํด๋์ค๋ก ๊ตฌ์ฒดํ ํ์๋ค. ์ฌ๊ธฐ๊น์ง๋ ์ฌ์ ์ค๋น ์ด๋ค.
public class AdvancedFireDetector implements Detectable{
@Override
public void detect() {
System.out.println("ํฅ์๋ ์ฑ๋ฅ์ผ๋ก ํ์ฌ๋ฅผ ๊ฐ์งํฉ๋๋ค.");
}
}
public class VideoReporter implements Reportable{
@Override
public void report() {
System.out.println("์ง์ 30์ด ์์๊ณผ ํจ๊ป ์ ๊ณ ๋ฅผ ์งํํฉ๋๋ค.");
}
}
์ด์ ์ง์ง ์ฌ์ฉํ ํด๋์ค๋ฅผ ๋ํ๋ด๊ฒ ๋ค
// ์ธํฐํ์ด์ค์ ๋ด์ฉ(detect, report ๋งค์๋ ๊ตฌํ ํ์, Camera ๋ถ๋ชจ ํด๋์ค์ ์ถ์ ๋งค์๋๋ ๊ตฌํ ํ์)
public class FatoryCam extends Camera implements Detectable, Reportable {
//ํด๋น ๋ณ์๋ค์ ์ธํฐํ์ด์ค์ ์ถ์ ๋งค์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ์ํด ํ์ํ๋ค.
//๋งค๊ฐ์ฒด ์ญํ
private Detectable detector;
private Reportable reporter;
// ์ธ์๋ก ๋ฐ์ Detectable ์๋ฃํ์ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์ค ๋ณ์์ ๊ฐ์ผ๋ก ๋ฐ๊ฒ ๋ค.
// ํด๋น ๋ณ์๋ฅผ ์ด์ฉํด ๋ด ์ถ์ ๋งค์๋๋ฅผ ๊ตฌ์ฒดํ ํ๊ฒ ๋ค.
public void setDetector(Detectable detector) {
this.detector = detector;
}
public void setReporter(Reportable reporter) {
this.reporter = reporter;
}
// ๋ถ๋ชจ ํด๋์ค์ ์ถ์ ๋งค์๋
@Override
public void showMainFeature() {
System.out.println("ํ์ฌ ๊ฐ์ง");
}
// ์ธ์๋ก ๋ค์ด์จ ๊ฐ์ฒด์ ๋งค์๋๊ฐ ๋ด ์ถ์ ๋งค์๋์ ๋ด์ฉ
@Override
public void detect() {
detector.detect();
}
@Override
public void report() {
reporter.report();
}
}
main ๋งค์๋
public class _02_Interface {
public static void main(String[] args) {
//๊ฐ์ฒด ์์ฑ
VideoReporter videoReporter = new VideoReporter();
//๊ฐ์ฒด ์์ฑ
Detectable advancedFireDetector = new AdvancedFireDetector();
// ๊ฐ์ฒด ์์ฑ
FatoryCam fatoryCam = new FatoryCam();
// ํด๋์ค ๋ด ์ถ์ ๋งค์๋๋ฅผ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ๊ฐ์ฒด๋ก ๊ตฌ์ฒดํ ํ๊ฒ ๋ค.
fatoryCam.setDetector(advancedFireDetector);
fatoryCam.setReporter(videoReporter);
fatoryCam.detect();
fatoryCam.report();
}
}
*์ ๊ฒ
์ธํฐํ์ด์ค๋?
๋ฌด์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ง? /
์ถ์ ํด๋์ค์์ ์ฐจ์ด์ (๊ตฌ์ฑ์์, ์ค๋ณต์์ ๊ด๋ จ)