์ถ”์ƒ(abstract) ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ด์œ 

๋ธ”๋กœ๊ทธ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค! ๐Ÿก’ integer.blog



Java์˜ ์ •์„์œผ๋กœ Java์˜ ๊ฐœ๋…๋“ค์„ ๊ณต๋ถ€ํ•œ ๋‚˜๋Š” ์ถ”์ƒํด๋ž˜์Šค๊ฐ€ ์–ธ์ œ๋‚˜ ์ฐ์ฐํ–ˆ๋‹ค.
๊ฐœ๋ฐœ์„ ๊ณต๋ถ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ์ง€ ์–ผ๋งˆ ์•ˆ๋˜์–ด ํ•™์Šตํ•œ ๋‚ด์šฉ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ๋‹นํ•œ ์ˆ˜์ค€์œผ๋กœ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ”๋˜ ๊ฒƒ์ด๋‹ค.
์ฐ์ฐํ•œ ์ƒํƒœ๋กœ ๋‚จ์•„์žˆ๋Š” ๊ฐœ๋…๋“ค์„ ํ•˜๋‚˜์”ฉ ๋ฐ”๋กœ ์žก์„ ๊ณ„ํš์ด์—ˆ๋Š”๋ฐ, ์ถ”์ƒํด๋ž˜์Šค์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์ดํ•ด ํ•  ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒจ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.


Java์˜ ์ •์„์—์„œ๋Š” ์ถ”์ƒํด๋ž˜์Šค์™€ ์ถ”์ƒ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ง€ ์•Š์•˜๋‹ค.

๋•Œ๋ฌธ์— ๋‚˜๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์ถ”์ƒํด๋ž˜์Šค(๋ฉ”์„œ๋“œ)๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋ฅผ
์ž์† ํด๋ž˜์Šค์—์„œ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋ผ๊ณ ๋งŒ ์ดํ•ดํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์•„์ง ์‹ค๋ฌด์—์„œ ์ถ”์ƒํด๋ž˜์Šค(๋ฉ”์„œ๋“œ)๋ฅผ ์ž‘์„ฑํ•  ์ผ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ „์ด ์—†๋Š” ์ƒํƒœ์˜€๋‹ค.

ํ•˜์ง€๋งŒ Java๋กœ ๋ฐฐ์šฐ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ๊ฐ•์˜์—์„œ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ ์„ค๋ช…ํ–ˆ๊ณ , ๋‚œ ์ด ์˜ˆ์ œ์™€ ์„ค๋ช…์ด ๋” ์™€๋‹ฟ์•˜๋‹ค.


์˜ˆ์ œ๋ฅผ ๋‹จ์ˆœํ™” ํ•ด๋ณด๋ฉด,

  1. Event ๋ผ๋Š” ๋ถ€๋ชจํด๋ž˜์Šค๊ฐ€ ์žˆ๊ณ ,

    public class Event {
        ...
    }
  2. Event๋ฅผ ์ƒ์†๋ฐ›์€ ์ž์‹ํด๋ž˜์Šค aEvent, bEvent, cEvent๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ isRelevant() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

    public class aEvent extends Event {
        ...
        public boolean isRelevant(Data data) {
            return logic.a;
        }
    }
    public class bEvent extends Event {
        ...
        public boolean isRelevant(Data data) {
            return logic.b;
        }
    }
    public class cEvent extends Event {
        ...
        public boolean isRelevant(Data data) {
            return logic.c;
        }
    }
  3. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์–ด๋Š ๋ฉ”์„œ๋“œ์—์„œ Event ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋œ ๋ฐฐ์—ด events[]์˜ ๊ฐ ์›์†Œ๋ฅผ isRelevant()๋ฉ”์†Œ๋“œ๋กœ ๊ฒ€์ฆํ•˜๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ–ˆ๋‹ค. (events[] ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ๋Š” aEvent, bEvent, cEvent ํƒ€์ž…์˜ ์›์†Œ๋“ค์ด๋‹ค.)

    public class someClass() {
        ...
        Event events[] = new Event[100];
        ...
            
        public void someMethod() {
            for(int i=0; i<n; i++)
                if(events[i].isRelevant(someData)) // ์ปดํŒŒ์ผ ์—๋Ÿฌ!!!
                    system.out.println( events[i].toString());
        }

    ๊ทธ๋Ÿฐ๋ฐ isRelevant()๋ฉ”์†Œ๋“œ์—์„œ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    ์™œ๋ƒํ•˜๋ฉด events[] ๋ฐฐ์—ด์€ Event ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋Š”๋ฐ, Event ํด๋ž˜์Šค์—๋Š” isRelevant() ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ๊ฐ€ Event ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด์ด๊ณ , ๊ฐ ํด๋ž˜์Šค๋Š” isRelevant() ๋ฉ”์„œ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์ง€๋งŒ,
    ์ปดํŒŒ์ผ๋Ÿฌ๋Š” Event ํด๋ž˜์Šค์— isRelevant() ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

    (events[i].toString()์—์„œ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” toString() ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์กฐ์ƒ ํด๋ž˜์Šค์ธ Object ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

  4. ์ด ๋•Œ, ๋‹จ์ˆœํžˆ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋งŒ ํ”ผํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด,
    ์•„๋ž˜์™€ ๊ฐ™์ด Event ๊ฐ์ฒด์— ์‚ฌ์šฉ๋  ์ผ ์—†๋Š” isRelevant() ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

    public class Event {
        ...
    
        public boolean isRelevant(Data data) {
            return false;
        }
    }

    ์œ„์™€ ๊ฐ™์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๋Š” ์‚ฌ๋ผ์ง€๊ณ  ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
    ํ•˜์ง€๋งŒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋‹ค.

  5. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด isRelevant()๋ฉ”์„œ๋“œ๋ฅผ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.
    (๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ๊ทธ ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ๋œ๋‹ค.)

    public abstract class Event {
        ...
    
        public abstract boolean isRelevant(Data data);
    }


์ด ์˜ˆ์ œ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์› ๋˜ ์ด์œ ๋Š” ๋‚˜๊ฐ™์€ ์ดˆ๋ณด์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด์„œ ๋งž์ดํ•˜๋Š” ์ƒํ™ฉ๊ณผ ๋น„์Šทํ•œ ํ๋ฆ„์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋‚˜์˜ ๊ฒฝ์šฐ์—๋Š”, ํฐ ๊ทธ๋ฆผ์„ ๋ณด์ง€ ๋ชปํ•˜๊ณ  ์šฐ์„  ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋‹ค ๋ณด๋ฉด ์ฝ”๋“œ ์ค‘๋ณต์ด ๋ฐœ๊ฒฌ๋˜๊ณ , ๊ทธ ์ค‘๋ณต์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ์ œ์„œ์•ผ ์ถ”์ƒํ™”์™€ ์ƒ์†์„ ๊ณ ๋ฏผํ•œ๋‹ค.

๋•Œ๋ฌธ์— ๋ถ€๋ชจํด๋ž˜์Šค์— ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜์—ฌ ์ถ”์ƒํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๊ณ , ๊ทธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ์„œ๋ธŒํด๋ž˜์Šค๋“ค์—์„œ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๋ช…ํ•˜๋Š” Java์˜ ์ •์„์˜ ์˜ˆ์ œ๋Š” ์ดˆ๋ณด๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ์ œ๋Œ€๋กœ ์ดํ•ดํ•  ์ˆ˜ ์—†์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.

๋ฌผ๋ก  ์ถ”์ƒ ๋ฉ”์„œ๋“œ์™€ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์—ญํ• ๊ณผ ํ™œ์šฉ์— ๋Œ€ํ•ด์„œ๋Š” ๋” ๊นŠ์€ ์ด์•ผ๊ธฐ๋“ค์ด ์žˆ๊ฒ ์ง€๋งŒ,
์‹ค๋ฌด์—์„œ ๋งˆ์ฃผํ•˜๊ฒŒ ๋˜๊ธธ ๋ฐ”๋ผ๋ฉด์„œ ์šฐ์„ ์€ ์ด ์ •๋„๋กœ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.


*Reference