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