Skip to content

Latest commit

ย 

History

History
73 lines (59 loc) ยท 3.25 KB

Item_20._abstract_class_vs_interface.md

File metadata and controls

73 lines (59 loc) ยท 3.25 KB

Item 20. ์ถ”์ƒ ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์šฐ์„ ํ•˜๋ผ

์ถ”์ƒ ํด๋ž˜์Šค vs ์ธํ„ฐํŽ˜์ด์Šค

์ƒ์†/๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์˜ ๊ณ„์ธต ๊ตฌ์กฐ ์ƒ์„ฑ ์—ฌ๋ถ€

  • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ด๋ฅผ ์ƒ์†ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ํด๋ž˜์Šค๋“ค์˜ ๊ณตํ†ต ์กฐ์ƒ์ด์–ด์•ผ ํ•จ
  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ํด๋ž˜์Šค๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ
    • ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋“ค์ด ๋ชจ๋‘ ๊ฐ™์€ ๊ณ„์ธต์œผ๋กœ ๋ฌถ์ผ ํ•„์š”๊ฐ€ ์—†์Œ
    • ์ด๋Ÿฌํ•œ ์  ๋•๋ถ„์— ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋“ฑ์žฅํ–ˆ์„ ๋•Œ ๋‹ค์–‘ํ•œ ํด๋ž˜์Šค๋“ค์ด ์ถ”ํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ
      • ex) Comparable, Iterable ๋“ฑ

๊ธฐ๋ณธ ๊ธฐ๋Šฅ์— ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๊ธฐ์กด ๋™์ž‘์— ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์ƒ์†์„ ํ•ด์•ผ ํ•จ
    • ์œ ์—ฐ์„ฑ ๋ฉด์—์„œ ์ข‹์ง€ ์•Š๊ณ , ๋ถ€์ž‘์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ (Item 18)
  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ปดํฌ์ง€์…˜๊ณผ ํ•จ๊ป˜ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ๋‚ด๋ถ€ ํ•„๋“œ๋กœ ์†Œ์œ ํ•˜์—ฌ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ํ™œ์šฉ์„ฑ์ด ์ข‹์€ ๋ž˜ํผ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Œ

๋‘ ๊ฐ€์ง€์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์ทจํ•˜๋Š” ์ถ”์ƒ ๊ณจ๊ฒฉ ๊ตฌํ˜„

interface Interface {
    default void print() {
        System.out.println("๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ");
    }
}

abstract class AbstractInterface implements Interface {
    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return super.equals(obj);
    }

    @Override
    public String toString() {
        return super.toString();
    }
}
  • ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํƒ€์ž…๊ณผ ์ผ๋ถ€ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„
    • ์ด๋ฅผ ๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ๋ผ๊ณ  ํ•จ
  • (์ถ”์ƒ) ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค๋Š” (์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ํ•„์š”ํ•œ) ๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€ ํ™•์ • ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„
  • ์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ์„ฑ ์‹œ์ ์— ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํš๋“ํ•˜๋˜ ๋ถˆํ•„์š”ํ•œ ๊ตฌํ˜„์€ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Œ
class Item20 {
    public static void main(String[] args) {
				// ๊ฒฐ๊ณผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฐ›์Œ
        Interface i = getInterface();
    }

    public static Interface getInterface() {
				// ๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ๋งŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๊ณ , ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์ง€ ์•Š์•„๋„ ๋  ๋ฉ”์„œ๋“œ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•จ
        return new AbstractInterface() {
            @Override
            public void print() {
                System.out.println("์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ ๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ");
            }
        };
    }
}
  • ์ด์™€ ๊ฐ™์ด ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•จ์œผ๋กœ์จ ํŠน์ • ๊ธฐ๋Šฅ๋งŒ ์ œ์–ดํ•˜๊ณ , ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ์ถ”์ƒ ํด๋ž˜์Šค์— ์˜ํ•ด ์ œ์–ด๋˜๋„๋ก ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ (ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด)
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•˜๋ฉด์„œ๋„ ๋ชจ๋“  ๋‚ด์šฉ์„ ๊ตฌํ˜„ํ•  ๊ท€์ฐฎ์Œ์„ ๋œ์–ด์ฃผ๋Š” ๊ตฌํ˜„๋ฒ•
  • ๊ตฌํ˜„ํ•  ์ ์ด ๋งŽ์€ ๋งค์šฐ ๋ณต์žกํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋ฉด, ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์Œ
  • ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค/์ถ”์ƒ ํด๋ž˜์Šค ๋‚ด ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ๋“ค์€ Item 19์—์„œ ๋ช…์‹œํ–ˆ๋“ฏ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ์—ผ๋‘์— ๋‘๊ณ  ๋ฌธ์„œํ™”๋ฅผ ํ•ด์•ผ ํ•จ