Day 16(21.09.28) - Gomserker/Java-101 GitHub Wiki
23. ์ธํฐํ์ด์ค(Interface)
(1) ์ธํฐํ์ด์ค์ ์ญํ
Java์์ ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ ์ํ ํ์ ์ด๋ค.๋ํ, ์ธํฐํ์ด์ค๋ ๊ฐ๋ฐ ์ฝ๋์ ๊ฐ์ฒด๊ฐ ์๋ก ํต์ ํ๋ ์ ์ ์ญํ ์ ํ๊ธฐ์, ๊ฐ๋ฐ ์ฝ๋๊ฐ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ธํฐํ์ด์ค๊ฐ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. ๋๋ฌธ์ ๊ฐ๋ฐ ์ฝ๋๋ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌ์กฐ๊น์ง๋ ํ์ ํ ํ์๋ ์๊ณ , ์ธํฐํ์ด์ค๊ฐ ์ ๊ณตํ๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ง ์๊ณ ์์ผ๋ฉด ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ํ ๊ฐ์ง ๋๋ ์๋ฌธ.
์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์๊ณ ์ธํฐํ์ด์ค๋ฅผ ๋๋ ๊ฒ์ธ๊ฐ?
์ด์ ๋ ๊ฐ๋ฐ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํจ์ด๋ค. ์ธํฐํ์ด์ค๋ ๋ค์์ ๊ฐ์ฒด๋ค๊ณผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์ ๋ฐ๋ผ ์คํ ๋ด์ฉ๊ณผ ๋ฆฌํด ๊ฐ์ด ๋ค๋ฅผ ์ ์๋ค. ๋๋ฌธ์, ๊ฐ๋ฐ ์ฝ๋ ์ธก๋ฉด์์๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์คํ ๋ด์ฉ๊ณผ ๋ฆฌํด ๊ฐ์ ๋ค์ํ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
(2) ์ธํฐํ์ด์ค์ ์ ์ธ
์ธํฐํ์ด์ค๋ .java ํํ์ src ํ์ผ๋ก ์์ฑ๋๊ณ , ์ปดํ์ผ๋ฌ(javac.exe)๋ฅผ ํตํด ํด๋์ค ํํ๋ก ์ปดํ์ผ ๋๊ธฐ ๋๋ฌธ์ ๋ฌผ๋ฆฌ์ ์ธ ํํ๋ ํด๋์ค์ ๋์ผํ๋ค. ํ์ง๋ง ์์ค๋ฅผ ์์ฑํ ๋ ์ ์ธํ๋ ๋ฐฉ๋ฒ์์ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋ค.
ํด๋์ค์ ์ ์ธ
์ ๊ทผ์ ์ด์ class ํด๋์ค๋ช
{....}
์ธํฐํ์ด์ค์ ์ ์ธ
์ ๊ทผ์ ์ด์ interface ํด๋์ค๋ช
{....}
๋ํ, ํด๋์ค๋ ํ๋, ์์ฑ์, ๋ฉ์๋๋ฅผ ๋ฉค๋ฒ๋ก ๊ฐ์ง๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, ์ธํฐํ์ด์ค๋ ์์์ ๋ฉ์๋๋ง ๊ตฌ์ฑ ๋ฉค๋ฒ๋ค. ๋ํ ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ฒด๋ก ์์ฑํ ์ ์์ผ๋ฏ๋ก, ์์ฑ์๋ฅผ ๊ฐ์ง ์ ์๋ค. ์๋๋ ์ธํฐํ์ด์ค ์ ์ธ์ ์์์ด๋ค.
interface ์ธํฐํ์ด์ค๋ช
{
//์์ ํ๋
ํ์
์์๋ช
= ๊ฐ;
//์ถ์ ๋ฉ์๋
ํ์
๋ฉ์๋๋ช
(ํ๋ผ๋ฏธํฐ, ...);
//๋ํดํธ ๋ฉ์๋
default ํ์
๋ฉ์๋๋ช
(ํ๋ผ๋ฏธํฐ, ...) {...}
}
โ ์์ ํ๋ ์ ์ธ
์ธํฐํ์ด์ค๋ ์ค์ฒด๊ฐ ์๋ ๊ฐ์ฒด ์ฌ์ฉ ์ค๋ช
์์ด๋ฏ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ํ๋๋ฅผ ์ ์ธํ ์ ์๊ธฐ ๋๋ฌธ์, ๊ฐ์ฒด ๋๋ ์คํํฑํ ํ๋๋ฅผ ์ ์ธํ ์ ์๊ณ , ์์๋ง ์ ์ธํ ์ ์๋ค. ์ธํฐํ์ด์ค์ ์ ์ธ๋ ์์ ํ๋๋ ๋ชจ๋ public static final ์ ํน์ฑ์ ๊ฐ๊ธฐ ๋๋ฌธ์ ์๋ตํ๋๋ผ๋ ์ปดํ์ผ ๊ณผ์ ์์ ์๋์ผ๋ก ๋ถ๊ฒ ๋๋ค.
โก ์ถ์ ๋ฉ์๋ ์ ์ธ
์ธํฐํ์ด์ค๋ฅผ ํตํด ํธ์ถ๋ ๋ฉ์๋๋ ์ต์ข
์ ์ผ๋ก ๊ฐ์ฒด์์ ์คํ๋๋ค. ๋ฐ๋ผ์ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ ์คํ ๋ธ๋ก{}์ด ํ์ ์๋ ์ถ์ ๋ฉ์๋๋ก ์ ์ธํ๋ค. ์ธํฐํ์ด์ค์ ์ ์ธ๋ ์ถ์ ๋ฉ์๋๋ ๋ชจ๋ public abstract์ ํน์ฑ์ ๊ฐ๊ธฐ ๋๋ฌธ์ public abstract๋ฅผ ์๋ตํ๋๋ผ๋ ์ปดํ์ผ ๊ณผ์ ์์ ์๋์ผ๋ก ๋ถ๊ฒ ๋๋ค.
โข ๋ํดํธ ๋ฉ์๋ ์ ์ธ
์์์ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ ์คํ ๋ธ๋ก์ด ํ์ ์๋ ์ถ์ ๋ฉ์๋๋ก ์ ์ธํ๋ค๊ณ ํ์ง๋ง, ๋ถ๋๋ถ ์คํ ๋ธ๋ก์ด ํ์ํ ๋ฉ์๋๋ฅผ ์์ฑํด์ผํ ๊ฒฝ์ฐ์ ๋ฉ์๋์ ๋ฆฌํด ํ์
์์ default๋ฅผ ๋ถ์ฌ ๋ํดํธ ๋ฉ์๋๋ก ์ฌ์ฉํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ์ ์คํ ๋ธ๋ก์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, public ํน์ฑ์ ๊ฐ๊ธฐ ๋๋ฌธ์ public์ ์๋ตํ๋๋ผ๋ ์ปดํ์ผ ๊ณผ์ ์์ ์๋์ผ๋ก ๋ถ๊ฒ ๋๋ค.
(3) ์ธํฐํ์ด์ค ๊ตฌํ
์ฝ๋๊ฐ ์ธํฐํ์ด์ค ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด๋ ์ธํฐํ์ด์ค์์ ์ ์๋ ์ถ์ ๋ฉ์๋์ ๋์ผํ ์ด๋ฆ, ํ๋ผ๋ฏธํฐ ํ์ , ๋ฆฌํด ํ์ ์ ๊ฐ์ง ์ค์ฒด ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. ์ด๋ฅผ ์ธํฐํ์ด์ค์ ๊ตฌํ(implement) ๊ฐ์ฒด๋ผ๊ณ ํ๊ณ , ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํด๋์ค๋ฅผ ๊ตฌํ ํด๋์ค๋ผ๊ณ ํ๋ค.
โ ๊ตฌํ ํด๋์ค
๋ณดํต์ ํด๋์ค์ ๋์ผํ์ง๋ง ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์์ ์๋ ค์ฃผ๊ธฐ ์ํด ํด๋์ค ์ ์ธ๋ถ์ implement ํค์๋๋ฅผ ์ฌ์ฉํ๊ณ , ์ธํฐํ์ด์ค๋ช ์ ์ ์ด์ฃผ์ด์ผ ํ๋ค.
public class ๊ตฌํํด๋์ค๋ช
implement ์ธํฐํ์ด์ค๋ช
{
//์ธํฐํ์ด์ค์ ์ ์ธ๋ ์ถ์ ๋ฉ์๋์ ์ค์ฒด ๋ฉ์๋ ์ ์ธ
}
๊ตฌํ ํด๋์ค์์ ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋๋ค์ ๋ํ ์ค์ฒด ๋ฉ์๋๋ฅผ ์์ฑํ ๋๋ ์ธํฐํ์ด์ค์ ๋ชจ๋ ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก public ์ ๊ทผ ์ ํ์ ๊ฐ๋๋ค๋ ์ ์ด๋ค. ๋ฐ๋ผ์, public ๋ณด๋ค ๋ ๋ฎ์ ์ ๊ทผ ์ ํ์ผ๋ก ๋ฉ์๋๋ฅผ ์์ฑํ ์ ์๋ค. ๋ง์ฝ public์ ๋ช ์ํ์ง ์์ผ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ๊ตฌํ ํด๋์ค๊ฐ ์์ฑ๋๋ฉด new ์ฐ์ฐ์๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค. ๋ค๋ง, ์ด๋ค ํ์ ์ ๋ณ์์ ๋์ ํ๋๋๊ฐ ๋ฌธ์ ์ธ๋ฐ, ์ธํฐํ์ด์ค๋ก ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ธํฐํ์ด์ค ๋ณ์๋ฅผ ๋จผ์ ์ ์ธํ๊ณ , ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ํด์ผํ๋ค. ์ฐธ๊ณ ๋ก ์ธํฐํ์ด์ค ๋ณ์๋ ์ฐธ์กฐ ํ์ ์ด๋ฏ๋ก ๊ตฌํ ๊ฐ์ฒด๊ฐ ๋์ ๋๋ฉด ๊ตฌํ ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ค.
//Coffee๋ผ๋ ์ธํฐํ์ด์ค๊ฐ ์๊ณ , ์ฌ๋ฌ ์ข
๋ฅ์ ์ปคํผ๋ฅผ ๊ตฌํ ๊ฐ์ฒด๋ก ์์ฑํ๋ ค๊ณ ํ ๋
Coffee coffee; //์ฐธ์กฐ ๋ณ์ coffee
coffee = new Espresso(); // Espresso ๊ตฌํ ๊ฐ์ฒด ์์ฑ
coffee.name(); //Espresso ๊ตฌํ ํด๋์ค์ name() ๋ฉ์๋ ํธ์ถ
coffee.price(); //Espresso ๊ตฌํ ํด๋์ค์ price() ๋ฉ์๋ ํธ์ถ
coffee = new CaffeLatte(); // CaffeLatte ๊ตฌํ ๊ฐ์ฒด ์์ฑ
coffee.name();
coffee.price();
โก ๋ค์ค ์ธํฐํ์ด์ค ๊ตฌํ ํด๋์ค
ํ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ๋ณต์์ ์ธํฐํ์ด์ค๊ฐ ํธ์ถํ ์ ์์ผ๋ ค๋ฉด, ํด๋น ๊ฐ์ฒด๋ ๋ณต์์ ์ธํฐํ์ด์ค๋ฅผ ๋ชจ๋ ๊ตฌํํด์ผ ํ๋๋ฐ, ์ด๋ด๋ ๋ค์ค ์ธํฐํ์ด์ค๋ฅผ ๋ฐ์ํ๋๋ก ๊ตฌํ ํด๋์ค๋ฅผ ์์ฑํด์ผ ํ๋ค.
public class ๊ตฌํ ํด๋์ค๋ช
implements ์ธํฐํ์ด์ค1, ์ธํฐํ์ด์ค2 {
//์ธํฐํ์ด์ค1์ ์ ์ธ๋ ์ถ์ ๋ฉ์๋์ ์ค์ฒด ๋ฉ์๋ ์ ์ธ
//์ธํฐํ์ด์ค2์ ์ ์ธ๋ ์ถ์ ๋ฉ์๋์ ์ค์ฒด ๋ฉ์๋ ์ ์ธ
}
์์ ๊ฐ์ด ๋ค์ค ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ์ ๊ตฌํ ํด๋์ค๋ ๋ชจ๋ ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋์ ๋ํ ์ค์ฒด ๋ฉ์๋๋ฅผ ์์ฑํด์ผ ํ๋ค. ๋ง์ฝ ํ๋๋ผ๋ ์๋ค๋ฉด ์ถ์ ํด๋์ค๋ก ์ ์ธํด์ผ ํ๋ค.
//๊ฐ ์ธํฐํ์ด์ค์ ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋ ์ ์ธ
interface Car {
void work();
}
interface Cannon {
void fire();
}
interface MachineGun{
void shoot();
}
//๊ตฌํ ํด๋์ค
class Tank implements Car, Cannon, MachineGun{
//๊ตฌํ๋ ํด๋์ค์์ ์ฌ์ฉํ ๊ฐ ์ธํฐํ์ด์ค์ ์ค์ฒด ๋ฉ์๋ ์์ฑ
@Override
public void work() {
System.out.println("Tank is moving");
}
@Override
public void fire() {
System.out.println("Firing the cannon");
}
@Override
public void shoot() {
System.out.println("Firing COAX");
}
}
public class TankExam {
public static void main(String[] args) {
//๊ตฌํ ํด๋์ค Tank๋ก Tank ๊ฐ์ฒด ์์ฑ
Tank tank1 = new Tank();
tank1.work();
tank1.fire();
tank1.shoot();
}
}
Result
Tank is moving
Firing the cannon
Firing COAX