JavaRush /Java Blog /Random-KO /ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„(๊ธฐ์‚ฌ ๋ฒˆ์—ญ)
fatesha
๋ ˆ๋ฒจ 22

ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„(๊ธฐ์‚ฌ ๋ฒˆ์—ญ)

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„(๊ธฐ์‚ฌ ๋ฒˆ์—ญ) - 1

์ฝ˜ํ…์ธ 

  1. ์†Œ๊ฐœ
  2. ์ธํ„ฐํŽ˜์ด์Šค
  3. ์ธํ„ฐํŽ˜์ด์Šค ๋งˆ์ปค
  4. ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค, ์ •์  ๋ฉ”์„œ๋“œ ๋ฐ ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ
  5. ์ถ”์ƒ ์ˆ˜์—…
  6. ๋ถˆ๋ณ€(์˜๊ตฌ) ํด๋ž˜์Šค
  7. ์ต๋ช… ์ˆ˜์—…
  8. ์‹œ๊ณ„
  9. ๊ณ„์Šน
  10. ๋‹ค์ค‘ ์ƒ์†
  11. ์ƒ์†๊ณผ ๊ตฌ์„ฑ
  12. ์บก์Šํ™”
  13. ์ตœ์ข… ํด๋ž˜์Šค ๋ฐ ๋ฉ”์„œ๋“œ
  14. ๋ฌด์—‡ ํ–ฅํ›„ ๊ณ„ํš
  15. ์†Œ์Šค ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ

1. ์†Œ๊ฐœ

์–ด๋–ค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋“ (Java๋„ ์˜ˆ์™ธ๋Š” ์•„๋‹˜), ๊น”๋”ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด ์ข‹์€ ๋””์ž์ธ ์›์น™์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ˆ˜๋ช…์ด ๊ธธ๊ณ  ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์‰ฝ๊ฒŒ ์ง€์›ํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํŠœํ† ๋ฆฌ์–ผ์˜ ์ด ๋ถ€๋ถ„์—์„œ๋Š” Java ์–ธ์–ด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ๋” ๋‚˜์€ ๋””์ž์ธ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋””์ž์ธ ์›์น™์„ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค ๊ตฌ์ฒด์ ์œผ๋กœ ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ(Java 8์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ), ์ถ”์ƒ ๋ฐ ์ตœ์ข… ํด๋ž˜์Šค, ๋ถˆ๋ณ€ ํด๋ž˜์Šค, ์ƒ์†, ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ , 2019๋…„์—์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ๋‹ค๋ฃจ์—ˆ๋˜ ๊ฐ€์‹œ์„ฑ(๋˜๋Š” ์ ‘๊ทผ์„ฑ) ๊ทœ์น™์„ ๋‹ค์‹œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 1๋ถ€ ๋ ˆ์Šจ "๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํŒŒ๊ดดํ•˜๋Š” ๋ฐฉ๋ฒ•" .

2. ์ธํ„ฐํŽ˜์ด์Šค

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ๋…์€ ๊ณ„์•ฝ ๊ฐœ๋ฐœ์˜ ๊ธฐ์ดˆ๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค . ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ผ๋ จ์˜ ๋ฉ”์„œ๋“œ(๊ณ„์•ฝ)๋ฅผ ์ •์˜ํ•˜๊ณ  ํ•ด๋‹น ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ง€์›์ด ํ•„์š”ํ•œ ๊ฐ ํด๋ž˜์Šค๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ๊ตฌํ˜„์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๊ฐ•๋ ฅํ•œ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—๋Š” ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์ง€๋งŒ ํŠนํžˆ Java๋Š” ์ด์— ๋Œ€ํ•œ ์–ธ์–ด ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Java์˜ ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
package com.javacodegeeks.advanced.design;

public interface SimpleInterface {
void performAction();
}
์œ„์˜ ์ฝ”๋“œ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํ˜ธ์ถœํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” SimpleInterfaceํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋งŒ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค performAction. ์ธํ„ฐํŽ˜์ด์Šค์™€ ํด๋ž˜์Šค์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์—ฐ๋ฝ์ฒ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์ง€๋งŒ(๋ฉ”์„œ๋“œ ์„ ์–ธ) ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Java์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ค‘์ฒฉ๋œ ์ธํ„ฐํŽ˜์ด์Šค, ํด๋ž˜์Šค, ๊ฐœ์ˆ˜, ์ฃผ์„ ๋ฐ ์ƒ์ˆ˜๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
package com.javacodegeeks.advanced.design;

public interface InterfaceWithDefinitions {
    String CONSTANT = "CONSTANT";

    enum InnerEnum {
        E1, E2;
    }

    class InnerClass {
    }

    interface InnerInterface {
        void performInnerAction();
    }

    void performAction();
}
์ด ๋ณด๋‹ค ๋ณต์žกํ•œ ์˜ˆ์—๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ค‘์ฒฉ ๊ตฌ๋ฌธ ๋ฐ ๋ฉ”์„œ๋“œ ์„ ์–ธ์— ๋ฌด์กฐ๊ฑด ๋ถ€๊ณผํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์ œํ•œ ์‚ฌํ•ญ์€ Java ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์šฐ์„ , ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ ์„ ์–ธ์€ ๊ณต๊ฐœ ๋ฉ๋‹ˆ๋‹ค (๊ณต๊ฐœ๋งŒ ๊ฐ€๋Šฅํ•จ). ๋”ฐ๋ผ์„œ ๋‹ค์Œ ๋ฉ”์„œ๋“œ ์„ ์–ธ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
public void performAction();
void performAction();
์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  ๋‹จ์ผ ๋ฉ”์„œ๋“œ๋Š” ์•”์‹œ์ ์œผ๋กœ abstract ๋กœ ์„ ์–ธ๋˜๋ฉฐ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ ์„ ์–ธ๋„ ๋™์ผํ•˜๋‹ค๋Š” ์ ์€ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
public abstract void performAction();
public void performAction();
void performAction();
์„ ์–ธ๋œ ์ƒ์ˆ˜ ํ•„๋“œ๋Š” public ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•”์‹œ์ ์œผ๋กœ static ์ด๋ฉฐ final ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค . ๋”ฐ๋ผ์„œ ๋‹ค์Œ ์„ ์–ธ๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
String CONSTANT = "CONSTANT";
public static final String CONSTANT = "CONSTANT";
๋งˆ์ง€๋ง‰์œผ๋กœ ์ค‘์ฒฉ๋œ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๊ฐœ์ˆ˜๋Š” public ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•”์‹œ์ ์œผ๋กœ static ์œผ๋กœ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค . ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ์„ ์–ธ์€ ๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
class InnerClass {
}

static class InnerClass {
}
์„ ํƒํ•˜๋Š” ์Šคํƒ€์ผ์€ ๊ฐœ์ธ ์ทจํ–ฅ์ด์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์†์„ฑ์„ ์•Œ๋ฉด ๋ถˆํ•„์š”ํ•œ ์ž…๋ ฅ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์ธํ„ฐํŽ˜์ด์Šค ๋งˆ์ปค

๋งˆ์ปค ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ๊ธฐํƒ€ ์ค‘์ฒฉ๋œ ๊ตฌ๋ฌธ์ด ์—†๋Š” ํŠน๋ณ„ํ•œ ์ข…๋ฅ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ด๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•:
public interface Cloneable {
}
์ธํ„ฐํŽ˜์ด์Šค ๋งˆ์ปค๋Š” ๊ทธ ์ž์ฒด๋กœ๋Š” ๊ณ„์•ฝ์ด ์•„๋‹ˆ์ง€๋งŒ ํŠน์ • ํŠน์„ฑ์„ ํด๋ž˜์Šค์™€ "์—ฐ๊ฒฐ"ํ•˜๊ฑฐ๋‚˜ "์—ฐ๊ด€"ํ•˜๋Š” ๋ฐ ๋‹ค์†Œ ์œ ์šฉํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Cloneable ๊ณผ ๊ด€๋ จํ•˜์—ฌ ํด๋ž˜์Šค๋Š” ๋ณต์ œ ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œ๋˜์ง€๋งŒ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ์‹์€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋งค์šฐ ์œ ๋ช…ํ•˜๊ณ  ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋งˆ์ปค์˜ ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค Serializable.
public interface Serializable {
}
์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค๋ฅผ ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™”์— ์ ํ•ฉํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๋ฉฐ, ์ด๊ฒƒ์ด ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๋งˆ์ปค๋Š” ๊ณ„์•ฝ์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฃผ์š” ๋ชฉ์ ์„ ์ถฉ์กฑ์‹œํ‚ค์ง€ ๋ชปํ•˜๋”๋ผ๋„ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ทธ ์œ„์น˜๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. 

4. ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค, ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ ๋ฐ ์ •์  ๋ฉ”์†Œ๋“œ

Java 8 ์ถœ์‹œ ์ดํ›„ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์ •์  ๋ฉ”์„œ๋“œ, ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ, ๋žŒ๋‹ค(๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค)์—์„œ ์ž๋™ ๋ณ€ํ™˜ ๋“ฑ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ์„น์…˜์—์„œ ์šฐ๋ฆฌ๋Š” Java์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜๋งŒ ์žˆ์„ ๋ฟ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ฐ•์กฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํ™ฉ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ๋ณธ ํ‚ค์›Œ๋“œ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ํ‘œ์‹œ ํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
package com.javacodegeeks.advanced.design;

public interface InterfaceWithDefaultMethods {
    void performAction();

    default void performDefaulAction() {
        // Implementation here
    }
}
์ธ์Šคํ„ด์Šค ์ˆ˜์ค€์—์„œ ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ๋Š” ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์— ์˜ํ•ด ์žฌ์ •์˜๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ œ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์ •์  ๋ฉ”์„œ๋“œ๋„ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: package com.javacodegeeks.advanced.design;
public interface InterfaceWithDefaultMethods {
    static void createAction() {
        // Implementation here
    }
}
์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๊ณ„์•ฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ „์ฒด ๋ชฉ์ ์„ ๋ฌดํšจํ™”ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด Java ์–ธ์–ด์— ๋„์ž…๋œ ๋ฐ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ทธ๊ฒƒ์ด ์•„๋ฌด๋ฆฌ ์œ ์šฉํ•˜๊ฑฐ๋‚˜ ํ˜ผ๋ž€์Šค๋Ÿฝ๋”๋ผ๋„ ๊ท€ํ•˜์™€ ๊ท€ํ•˜๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ด๋ฉฐ ์–ธ์–ด์— ๋งค์šฐ ์œ ์šฉํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์œผ๋กœ ์ž…์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์„ ์–ธ๋œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. Runnableํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด ๊ฐœ๋…์˜ ์•„์ฃผ ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค.
@FunctionalInterface
public interface Runnable {
    void run();
}
Java ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ ์ ˆํ•œ ๊ฒฝ์šฐ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํ•จ์ˆ˜ ์„ค๋ช…์„ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 
public void runMe( final Runnable r ) {
    r.run();
}
Java 7 ์ดํ•˜์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์„ ์ œ๊ณตํ•ด์•ผ Runnableํ•˜์ง€๋งŒ(์˜ˆ: ์ต๋ช… ํด๋ž˜์Šค ์‚ฌ์šฉ) Java 8์—์„œ๋Š” ๋žŒ๋‹ค ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ run() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
runMe( () -> System.out.println( "Run!" ) );
๋˜ํ•œ @FunctionalInterface ์ฃผ์„ (์ฃผ์„์€ ํŠœํ† ๋ฆฌ์–ผ์˜ 5๋ถ€์—์„œ ์ž์„ธํžˆ ์„ค๋ช…)์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ–ฅํ›„ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ด ๊ฐ€์ •์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค. .

5. ์ถ”์ƒ ์ˆ˜์—…

Java ์–ธ์–ด๊ฐ€ ์ง€์›ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ๊ฐœ๋…์€ ์ถ”์ƒ ํด๋ž˜์Šค ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค๋Š” Java 7์˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋‹ค์†Œ ์œ ์‚ฌํ•˜๋ฉฐ Java 8์˜ ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ํด๋ž˜์Šค์™€ ๋‹ฌ๋ฆฌ ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์—†์ง€๋งŒ ํ•˜์œ„ ํด๋ž˜์Šคํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒ์† ์„น์…˜ ์ฐธ์กฐ). ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ถ”์ƒ ํด๋ž˜์Šค์— ์ถ”์ƒ ๋ฉ”์„œ๋“œ, ์ฆ‰ ์ธํ„ฐํŽ˜์ด์Šค์ฒ˜๋Ÿผ ๊ตฌํ˜„์ด ์—†๋Š” ํŠน์ˆ˜ํ•œ ์ข…๋ฅ˜์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
package com.javacodegeeks.advanced.design;

public abstract class SimpleAbstractClass {
    public void performAction() {
        // Implementation here
    }

    public abstract void performAnotherAction();
}
์ด ์˜ˆ์ œ์—์„œ ํด๋ž˜์Šค๋Š” abstractSimpleAbstractClass ๋กœ ์„ ์–ธ๋˜์—ˆ์œผ๋ฉฐ ์„ ์–ธ๋œ ์ถ”์ƒ ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์˜ ๋Œ€๋ถ€๋ถ„ ๋˜๋Š” ์ผ๋ถ€๋ฅผ ์—ฌ๋Ÿฌ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋”๋ผ๋„ ์—ฌ์ „ํžˆ ๋ฌธ์„ ์—ด์–ด๋‘๊ณ  ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํ•˜์œ„ ํด๋ž˜์Šค์— ๋‚ด์žฌ๋œ ๋™์ž‘์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์šฉ ์„ ์–ธ ๋งŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋‹ฌ๋ฆฌ ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ ‘๊ทผ์„ฑ ๊ทœ์น™์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์ƒ ๋ฉ”์„œ๋“œ์˜ ๊ฐ€์‹œ์„ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

6. ์ฆ‰์‹œ ์ˆ˜์—…

๋ถˆ๋ณ€์„ฑ์€ ์˜ค๋Š˜๋‚  ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ์ ์  ๋” ์ค‘์š”ํ•ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ์ฝ”์–ด ์‹œ์Šคํ…œ์˜ ๋“ฑ์žฅ์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ณต์œ  ๋ฐ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ๋œ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ๋ถ„๋ช…ํžˆ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๊ฑฐ์˜ ์—†๊ฑฐ๋‚˜ ์ „ํ˜€ ์—†์œผ๋ฉด ํ™•์žฅ์„ฑ(ํ™•์žฅ์„ฑ)์ด ํ–ฅ์ƒ๋˜๊ณ  ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ถ”๋ก ์ด ๋” ์‰ฌ์›Œ์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ Java ์–ธ์–ด๋Š” ํด๋ž˜์Šค ๋ถˆ๋ณ€์„ฑ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์ง€์›์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ์„ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์šฐ์„ , ํด๋ž˜์Šค์˜ ๋ชจ๋“  ํ•„๋“œ๋Š” final์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( final ๋กœ ํ‘œ์‹œ๋จ ). ์ด๋Š” ์ข‹์€ ์‹œ์ž‘์ด์ง€๋งŒ ๋ณด์žฅํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. 
package com.javacodegeeks.advanced.design;

import java.util.Collection;

public class ImmutableClass {
    private final long id;
    private final String[] arrayOfStrings;
    private final Collection<String> collectionOfString;
}
๋‘˜์งธ, ์ ์ ˆํ•œ ์ดˆ๊ธฐํ™”๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ํ•„๋“œ๊ฐ€ ์ปฌ๋ ‰์…˜์ด๋‚˜ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ฐธ์กฐ์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์ƒ์„ฑ์ž ์ธ์ˆ˜์—์„œ ์ง์ ‘ ํ• ๋‹นํ•˜์ง€ ๋ง๊ณ  ๋Œ€์‹  ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“œ์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปฌ๋ ‰์…˜์ด๋‚˜ ๋ฐฐ์—ด์˜ ์ƒํƒœ๊ฐ€ ์™ธ๋ถ€์—์„œ ์ˆ˜์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
public ImmutableClass( final long id, final String[] arrayOfStrings,
        final Collection<String> collectionOfString) {
    this.id = id;
    this.arrayOfStrings = Arrays.copyOf( arrayOfStrings, arrayOfStrings.length );
    this.collectionOfString = new ArrayList<>( collectionOfString );
}
๋งˆ์ง€๋ง‰์œผ๋กœ ์ ์ ˆํ•œ ์•ก์„ธ์Šค(getter)๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜์˜ ๊ฒฝ์šฐ ๋ถˆ๋ณ€์„ฑ์€ ๋ž˜ํผ๋กœ ์ œ๊ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค  Collections.unmodifiableXxx. ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ์ง„์ •ํ•œ ๋ถˆ๋ณ€์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ๋ณต์‚ฌ๋ณธ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐฐ์—ด์˜ ํฌ๊ธฐ์— ํฌ๊ฒŒ ์˜์กดํ•˜๊ณ  ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ์— ๋ง‰๋Œ€ํ•œ ๋ถ€๋‹ด์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์šฉ์ ์ธ ๊ด€์ ์—์„œ๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
public String[] getArrayOfStrings() {
    return Arrays.copyOf( arrayOfStrings, arrayOfStrings.length );
}
์ด ์ž‘์€ ์˜ˆ์กฐ์ฐจ๋„ ๋ถˆ๋ณ€์„ฑ์€ ์•„์ง Java์˜ ์ผ๊ธ‰ ์‹œ๋ฏผ์ด ์•„๋‹ˆ๋ผ๋Š” ์ข‹์€ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ถˆ๋ณ€ ํด๋ž˜์Šค์— ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์ƒํ™ฉ์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํด๋ž˜์Šค๋„ ๋ถˆ๋ณ€์ด์–ด์•ผ ํ•˜์ง€๋งŒ ์ด๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฐํ•จ์„ ์ง€์ ํ•จ์œผ๋กœ์จ ํฐ โ€‹โ€‹๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋Š” FindBugs ๋ฐ PMD์™€ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๊ดœ์ฐฎ์€ Java ์†Œ์Šค ์ฝ”๋“œ ๋ถ„์„๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋Š” ๋ชจ๋“  Java ๊ฐœ๋ฐœ์ž์˜ ์ข‹์€ ์นœ๊ตฌ์ž…๋‹ˆ๋‹ค.

7. ์ต๋ช… ์ˆ˜์—…

Java 8 ์ด์ „ ์‹œ๋Œ€์—๋Š” ์ต๋ช… ํด๋ž˜์Šค๊ฐ€ ํด๋ž˜์Šค๊ฐ€ ์ฆ‰์‹œ ์ •์˜๋˜๊ณ  ์ฆ‰์‹œ ์ธ์Šคํ„ด์Šคํ™”๋˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ต๋ช… ํด๋ž˜์Šค์˜ ๋ชฉ์ ์€ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๊ณ  ํด๋ž˜์Šค๋ฅผ ๋ ˆ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ์งง๊ณ  ์‰ฌ์šด ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. Java์—์„œ ์ƒˆ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ตฌ์‹ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
package com.javacodegeeks.advanced.design;

public class AnonymousClass {
    public static void main( String[] args ) {
        new Thread(
            // Example of creating anonymous class which implements
            // Runnable interface
            new Runnable() {
                @Override
                public void run() {
                    // Implementation here
                }
            }
        ).start();
    }
}
์ด ์˜ˆ์ œ์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ด Runnable์ต๋ช… ํด๋ž˜์Šค๋กœ ์ฆ‰์‹œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ต๋ช… ํด๋ž˜์Šค์™€ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์ง€๋งŒ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋”ฐ๋ฅธ ์ฃผ์š” ๋‹จ์ ์€ Java ์–ธ์–ด๊ฐ€ ์š”๊ตฌํ•˜๋Š” ๋งค์šฐ ์žฅํ™ฉํ•œ ๊ตฌ๋ฌธ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ์ต๋ช… ํด๋ž˜์Šค๋ผ๋„ ์ž‘์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์ตœ์†Œํ•œ 5์ค„์˜ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
new Runnable() {
   @Override
   public void run() {
   }
}
๋‹คํ–‰ํžˆ๋„ Java 8, ๋žŒ๋‹ค ๋ฐ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ณ ์ •๊ด€๋…์ด ๊ณง ์‚ฌ๋ผ์ง€๊ณ  ๋งˆ์นจ๋‚ด Java ์ฝ”๋“œ ์ž‘์„ฑ์ด ์ •๋ง ๊ฐ„๊ฒฐํ•ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
package com.javacodegeeks.advanced.design;

public class AnonymousClass {
    public static void main( String[] args ) {
        new Thread( () -> { /* Implementation here */ } ).start();
    }
}

8. ๊ฐ€์‹œ์„ฑ

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํŠœํ† ๋ฆฌ์–ผ 1๋ถ€์—์„œ Java์˜ ๊ฐ€์‹œ์„ฑ ๋ฐ ์ ‘๊ทผ์„ฑ ๊ทœ์น™์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์—์„œ๋Š” ์„œ๋ธŒํด๋ž˜์‹ฑ์˜ ๋งฅ๋ฝ์—์„œ ์ด ์ฃผ์ œ๋ฅผ ๋‹ค์‹œ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„(๊ธฐ์‚ฌ ๋ฒˆ์—ญ) - 2๋‹ค์–‘ํ•œ ์ˆ˜์ค€์˜ ๊ฐ€์‹œ์„ฑ์€ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค(์˜ˆ: ์„œ๋กœ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ์žˆ๊ฑฐ๋‚˜ ์„œ๋กœ ์ค‘์ฒฉ๋œ ๊ฒฝ์šฐ)๋ฅผ ๋ณด๊ฑฐ๋‚˜ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž ๋ฐ ํ•„๋“œ๋ฅผ ๋ณด๊ณ  ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์ธ ์ƒ์†์—์„œ๋Š” ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

9. ์ƒ์†

์ƒ์†์€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ฃผ์š” ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ๊ด€๊ณ„ ํด๋ž˜์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ์ดˆ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์‹œ์„ฑ ๋ฐ ์ ‘๊ทผ์„ฑ ๊ทœ์น™๊ณผ ๊ฒฐํ•ฉ๋œ ์ƒ์†์„ ํ†ตํ•ด ํด๋ž˜์Šค๋ฅผ ํ™•์žฅ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋…์  ์ˆ˜์ค€์—์„œ Java์˜ ์ƒ์†์€ ์ƒ์œ„ ํด๋ž˜์Šค์™€ ํ•จ๊ป˜ ์„œ๋ธŒํด๋ž˜์‹ฑ ๋ฐ ํ™•์žฅ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ณต๊ฐœ ๋ฐ ๋ณดํ˜ธ ์š”์†Œ๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•˜์œ„ ํด๋ž˜์Šค์™€ ํด๋ž˜์Šค๊ฐ€ ๋ชจ๋‘ ๋™์ผํ•œ ํŒจํ‚ค์ง€์— ์žˆ๋Š” ๊ฒฝ์šฐ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ํŒจํ‚ค์ง€ ์ „์šฉ ์š”์†Œ๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฌด์—‡์„ ๋””์ž์ธํ•˜๋ ค๊ณ  ํ•˜๋“  ํด๋ž˜์Šค๊ฐ€ ๊ณต๊ฐœ์ ์œผ๋กœ ๋˜๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์— ๋…ธ์ถœํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ๋ฉ”์„œ๋“œ ์ง‘ํ•ฉ์„ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ€์‹œ์„ฑ ์ˆ˜์ค€๊ณผ ๊ทธ ํšจ๊ณผ์˜ ์ฐจ์ด๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค Parent์™€ ํ•ด๋‹น ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.Child
package com.javacodegeeks.advanced.design;

public class Parent {
    // Everyone can see it
    public static final String CONSTANT = "Constant";

    // No one can access it
    private String privateField;
    // Only subclasses can access it
    protected String protectedField;

    // No one can see it
    private class PrivateClass {
    }

    // Only visible to subclasses
    protected interface ProtectedInterface {
    }

    // Everyone can call it
    public void publicAction() {
    }

    // Only subclass can call it
    protected void protectedAction() {
    }

    // No one can call it
    private void privateAction() {
    }

    // Only subclasses in the same package can call it
    void packageAction() {
    }
}
package com.javacodegeeks.advanced.design;

// Resides in the same package as parent class
public class Child extends Parent implements Parent.ProtectedInterface {
    @Override
    protected void protectedAction() {
        // Calls parent's method implementation
        super.protectedAction();
    }

    @Override
    void packageAction() {
        // Do nothing, no call to parent's method implementation
    }

    public void childAction() {
        this.protectedField = "value";
    }
}
์ƒ์†์€ ๊ทธ ์ž์ฒด๋กœ ๋งค์šฐ ํฐ ์ฃผ์ œ์ด๋ฉฐ Java์™€ ๊ด€๋ จ๋œ ์„ธ๋ถ€์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋”ฐ๋ฅด๊ธฐ ์‰ฝ๊ณ  ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค. Java์—์„œ ๊ฐ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ตœ์ข…์œผ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์€ ํ•œ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ƒ์†๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์ด๋‚˜ ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด @Override ์ฃผ์„์ด ๋„์ž…๋œ ์ด์œ ์ž…๋‹ˆ๋‹ค . ์ƒ์†๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ผ ๋•Œ๋งˆ๋‹ค @Override ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œ์‹œํ•˜์„ธ์š”. Java ๊ฐœ๋ฐœ์ž๊ฐ€ ๋””์ž์ธ์—์„œ ์ง€์†์ ์œผ๋กœ ์ง๋ฉดํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋”œ๋ ˆ๋งˆ๋Š” ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ(๊ตฌ์ฒด์  ๋˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค ํฌํ•จ) ๊ตฌ์„ฑ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ํด๋ž˜์Šค๋‚˜ ์ถ”์ƒ ํด๋ž˜์Šค๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋” ๊ฐ€๋ณ๊ณ  ํ…Œ์ŠคํŠธ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋” ์‰ฌ์šฐ๋ฉฐ ๊ตฌํ˜„ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ๋ถ€์ž‘์šฉ๋„ ์ตœ์†Œํ™”๋ฉ๋‹ˆ๋‹ค. Java ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํ”„๋ก์‹œ ํด๋ž˜์Šค ์ƒ์„ฑ๊ณผ ๊ฐ™์€ ๋งŽ์€ ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์€ ์ธํ„ฐํŽ˜์ด์Šค์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

10. ๋‹ค์ค‘ ์ƒ์†

C++ ๋ฐ ์ผ๋ถ€ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ Java๋Š” ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Java์—์„œ ๊ฐ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ง์ ‘ ์ƒ์œ„ ํด๋ž˜์Šค๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํด๋ž˜์Šค๊ฐ€ Object๊ณ„์ธต ๊ตฌ์กฐ์˜ ์ตœ์ƒ์œ„์— ์žˆ์Œ). ๊ทธ๋Ÿฌ๋‚˜ ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค ์Šคํƒœํ‚น์€ Java์—์„œ ๋‹ค์ค‘ ์ƒ์†์„ ๋‹ฌ์„ฑ(๋˜๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜)ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
package com.javacodegeeks.advanced.design;

public class MultipleInterfaces implements Runnable, AutoCloseable {
    @Override
    public void run() {
        // Some implementation here
    }

    @Override
    public void close() throws Exception {
       // Some implementation here
    }
}
๋‹ค์ค‘ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์€ ์‹ค์ œ๋กœ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ๊ตฌํ˜„์„ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Java์˜ ๋‹ค์ค‘ ์ƒ์† ์ง€์› ๋ถ€์กฑ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊นŠ์€ ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. 
public class A implements Runnable {
    @Override
    public void run() {
        // Some implementation here
    }
}
// Class B wants to inherit the implementation of run() method from class A.
public class B extends A implements AutoCloseable {
    @Override
    public void close() throws Exception {
       // Some implementation here
    }
}
// Class C wants to inherit the implementation of run() method from class A
// and the implementation of close() method from class B.
public class C extends B implements Readable {
    @Override
    public int read(java.nio.CharBuffer cb) throws IOException {
       // Some implementation here
    }
}
๋“ฑ๋“ฑ... Java 8์˜ ์ตœ๊ทผ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ ์‚ฝ์ž… ๋ฌธ์ œ๋ฅผ ์–ด๋Š ์ •๋„ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ ๋•Œ๋ฌธ์— ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์‹ค์ œ๋กœ ๊ณ„์•ฝ๋ฟ ์•„๋‹ˆ๋ผ ๊ตฌํ˜„๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ๊ตฌํ˜„๋œ ๋ฉ”์„œ๋“œ๋„ ์ž๋™์œผ๋กœ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
package com.javacodegeeks.advanced.design;

public interface DefaultMethods extends Runnable, AutoCloseable {
    @Override
    default void run() {
        // Some implementation here
    }

    @Override
    default void close() throws Exception {
       // Some implementation here
    }
}

// Class C inherits the implementation of run() and close() methods from the
// DefaultMethods interface.
public class C implements DefaultMethods, Readable {
    @Override
    public int read(java.nio.CharBuffer cb) throws IOException {
       // Some implementation here
    }
}
๋‹ค์ค‘ ์ƒ์†์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ๋™์‹œ์— ์œ„ํ—˜ํ•œ ๋„๊ตฌ๋ผ๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์„ธ์š”. ์ž˜ ์•Œ๋ ค์ง„ ์ฃฝ์Œ์˜ ๋‹ค์ด์•„๋ชฌ๋“œ ๋ฌธ์ œ๋Š” ๋‹ค์ค‘ ์ƒ์† ๊ตฌํ˜„์˜ ์ฃผ์š” ๊ฒฐํ•จ์œผ๋กœ ์ข…์ข… ์ธ์šฉ๋˜๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๋Š” ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋งค์šฐ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Java 8 ์ธํ„ฐํŽ˜์ด์Šค๋„ ์ด๋Ÿฌํ•œ ๊ฒฐํ•จ์˜ ํฌ์ƒ์–‘์ด ๋ฉ๋‹ˆ๋‹ค.
interface A {
    default void performAction() {
    }
}

interface B extends A {
    @Override
    default void performAction() {
    }
}

interface C extends A {
    @Override
    default void performAction() {
    }
}
์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฝ”๋“œ ์กฐ๊ฐ์€ ์ปดํŒŒ์ผ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
// E is not compilable unless it overrides performAction() as well
interface E extends B, C {
}
ํ˜„ ์‹œ์ ์—์„œ ์–ธ์–ด๋กœ์„œ์˜ Java๋Š” ํ•ญ์ƒ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋ฅผ ํ”ผํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด ์™”๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ธ์–ด๊ฐ€ ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์ค‘ ์ผ๋ถ€๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋‚˜ํƒ€๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. 

11. ์ƒ์† ๋ฐ ๊ตฌ์„ฑ

๋‹คํ–‰ํžˆ ์ƒ์†์ด ํด๋ž˜์Šค๋ฅผ ๋””์ž์ธํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ƒ์†๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ๋‹ค๊ณ  ๋ฏฟ๋Š” ๋˜ ๋‹ค๋ฅธ ๋Œ€์•ˆ์€ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
// E is not compilable unless it overrides performAction() as well
interface E extends B, C {
}
ํด๋ž˜์Šค๋Š” Vehicle์—”์ง„๊ณผ ๋ฐ”ํ€ด(๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด ๋‚จ๊ฒจ๋‘” ๋‹ค๋ฅธ ๋งŽ์€ ๋ถ€ํ’ˆ ํฌํ•จ)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํด๋ž˜์Šค Vehicle๋„ ์—”์ง„์ด๋ฏ€๋กœ ์ƒ์†์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
public class Vehicle extends Engine {
    private Wheels[] wheels;
    // ...
}
์–ด๋–ค ๋””์ž์ธ ์†”๋ฃจ์…˜์ด ๋งž์„๊นŒ์š”? ์ผ๋ฐ˜์ ์ธ ํ•ต์‹ฌ ์ง€์นจ์€ IS-A(is) ๋ฐ HAS-A(ํฌํ•จ) ์›์น™์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. IS-A๋Š” ์ƒ์† ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ํด๋ž˜์Šค ์‚ฌ์–‘๊ณผ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ณ€ํ˜•๋„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค. ํ•˜์œ„ ํด๋ž˜์Šค)๋Š” ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์—”ํ„ฐํ‹ฐ๊ฐ€ ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ๋ฅผ ํ™•์žฅํ•˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์ผ์น˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š” - IS -A(is).") ๋”ฐ๋ผ์„œ HAS-A๋Š” ๊ตฌ์„ฑ ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ HAS-A ์›์น™์ด IS-A๋ณด๋‹ค ๋” ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์†Œ์œ (๋˜๋Š” ํฌํ•จ)ํ•ฉ๋‹ˆ๋‹ค. 
  • ๋””์ž์ธ์ด ๋”์šฑ ์œ ์—ฐํ•ด์กŒ์Šต๋‹ˆ๋‹ค.
  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์ „ํŒŒ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋ธ์ด ๋” ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค์™€ ํ•ด๋‹น ์ปดํฌ์ง€์…˜์€ ์ƒ์œ„ ํด๋ž˜์Šค์™€ ํ•ด๋‹น ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๊ธด๋ฐ€ํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•˜๋Š” ์ปดํฌ์ง€์…˜์— ๋น„ํ•ด ๋Š์Šจํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค์˜ ๋…ผ๋ฆฌ์  ์‚ฌ๊ณ  ๋ฐฉ์‹์€ ๋ชจ๋“  ์ข…์†์„ฑ์ด ํ•œ ๊ณณ์— ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. 
๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ƒ์†์€ ๊ทธ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ์กด์˜ ์—ฌ๋Ÿฌ ๋””์ž์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฏ€๋กœ ๋ฌด์‹œ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ๋ชจ๋ธ์„ ์„ค๊ณ„ํ•  ๋•Œ ์ด ๋‘ ๊ฐ€์ง€ ๋Œ€์•ˆ์„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค.

12. ์บก์Šํ™”.

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์บก์Šํ™”์˜ ๊ฐœ๋…์€ ๋ชจ๋“  ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ(์˜ˆ: ์ž‘๋™ ๋ชจ๋“œ, ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ ๋“ฑ)์„ ์™ธ๋ถ€ ์„ธ๊ณ„๋กœ๋ถ€ํ„ฐ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์บก์Šํ™”์˜ ์žฅ์ ์€ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ๊ณผ ๋ณ€๊ฒฝ ์šฉ์ด์„ฑ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์€ ์ˆจ๊ฒจ์ ธ ์žˆ์œผ๋ฉฐ, ํด๋ž˜์Šค ๋ฐ์ดํ„ฐ ์ž‘์—…์€ ํด๋ž˜์Šค์˜ ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ ๋ฌธ์ œ). Java์˜ ์บก์Šํ™”๋Š” ๊ฐ€์‹œ์„ฑ ๋ฐ ์ ‘๊ทผ์„ฑ ๊ทœ์น™์„ ํ†ตํ•ด ๋‹ฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. Java์—์„œ๋Š” ํ•„๋“œ๊ฐ€ ์ตœ์ข…์œผ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ getter ๋ฐ setter๋ฅผ ํ†ตํ•ด์„œ๋งŒ ํ•„๋“œ๋ฅผ ์ง์ ‘ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
package com.javacodegeeks.advanced.design;

public class Encapsulation {
    private final String email;
    private String address;

    public Encapsulation( final String email ) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getEmail() {
        return email;
    }
}
์ด ์˜ˆ๋Š” Java ์–ธ์–ด์—์„œ JavaBeans ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์„ ์—ฐ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค . ํ‘œ์ค€ Java ํด๋ž˜์Šค๋Š” ์ผ๋ จ์˜ ๊ทœ์น™์— ๋”ฐ๋ผ ์ž‘์„ฑ๋˜๋ฉฐ, ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” getter ๋ฐ setter ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ํ•„๋“œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒ์† ๋ถ€๋ถ„์—์„œ ์ด๋ฏธ ๊ฐ•์กฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, ํด๋ž˜์Šค ๋‚ด์—์„œ๋Š” ํ•ญ์ƒ ์บก์Šํ™” ์›์น™์„ ํ™œ์šฉํ•˜์—ฌ ์ตœ์†Œํ•œ์˜ ํ™๋ณด ๊ณ„์•ฝ์„ ์ค€์ˆ˜ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ณต๊ฐœ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์€ ๋น„๊ณต๊ฐœ(๋˜๋Š” ํ•ด๊ฒฐ ์ค‘์ธ ๋ฌธ์ œ์— ๋”ฐ๋ผ ๋ณดํ˜ธ/ํŒจํ‚ค์ง€ ๋น„๊ณต๊ฐœ)๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์žฅ๊ธฐ์ ์œผ๋กœ ํฐ ๋ณ€ํ™” ์—†์ด(๋˜๋Š” ์ตœ์†Œํ•œ ์ตœ์†Œํ™”ํ•˜์—ฌ) ๋””์ž์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ž์œ ๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์„ฑ๊ณผ๋ฅผ ๊ฑฐ๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

13. ์ตœ์ข… ์ˆ˜์—… ๋ฐ ๋ฐฉ๋ฒ•

Java์—๋Š” ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ final๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
package com.javacodegeeks.advanced.design;

public final class FinalClass {
}
๋ฉ”์„œ๋“œ ์„ ์–ธ์˜  ๋™์ผํ•œ final ํ‚ค์›Œ๋“œ๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
package com.javacodegeeks.advanced.design;

public class FinalMethod {
    public final void performAction() {
    }
}
ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ตœ์ข…์ด์–ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์€ ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์ข… ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ๋Š” ํ™•์žฅ์„ฑ์„ ์ œํ•œํ•˜๋ฏ€๋กœ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•ด์•ผ ํ• ์ง€, ์ƒ์†ํ•˜์ง€ ๋ง์•„์•ผ ํ• ์ง€, ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋‚˜์ค‘์— ์žฌ์ •์˜ํ•ด์•ผ ํ• ์ง€ ๋ง์•„์•ผ ํ• ์ง€ ๋ฏธ๋ฆฌ ์ƒ๊ฐํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์„ค๊ณ„ ๊ฒฐ์ •์œผ๋กœ ์ธํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ ์šฉ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๊ฒŒ ์ œํ•œ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Java ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์ตœ์ข… ํด๋ž˜์Šค์˜ ์—ฌ๋Ÿฌ ์˜ˆ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ๊ฒƒ์€ String ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ์ด ๊ฒฐ์ •์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฌธ์ž์—ด ๊ตฌํ˜„์— ๋Œ€ํ•œ "๋” ๋‚˜์€" ์†”๋ฃจ์…˜์„ ๊ณ ์•ˆํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ ค์กŒ์Šต๋‹ˆ๋‹ค. 

14. ๋‹ค์Œ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ

์ด ๋‹จ์›์—์„œ๋Š” Java์˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์„ ๋‹ค๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ณ„์•ฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ณ  ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์  ๊ฐœ๋…์„ ์‚ดํŽด๋ณด๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์–ธ์–ด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐœ์ „ํ–ˆ๋Š”์ง€ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ•์˜์˜ ๋‹ค์Œ ๋ถ€๋ถ„์—์„œ๋Š” ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์œ ํ˜• ์•ˆ์ „์„ฑ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

15. ์†Œ์Šค ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ

์—ฌ๊ธฐ์—์„œ ์†Œ์Šค๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค - Advanced-java-part-3 ์†Œ์Šค: ํด๋ž˜์Šค๋ฅผ ๋””์ž์ธํ•˜๋Š” ๋ฐฉ๋ฒ•
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION