ํด๋ž˜์Šค(Class)

ํด๋ž˜์Šค ์ฒด๊ณ„

  • public static ๋ณ€์ˆ˜
  • private static ๋ณ€์ˆ˜
  • private ๋ณ€์ˆ˜
  • public ๋ณ€์ˆ˜(๊ณต๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†๋‹ค.)

์บก์Šํ™”

  • ๋•Œ๋กœ๋Š” ๋ณ€์ˆ˜๋‚˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ protected๋กœ ์„ ์–ธํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ ๋น„๊ณต๊ฐœ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์˜จ๊ฐ– ๋ฐฉ๋ฒ•์„ ๊ฐ•๊ตฌํ•˜๊ณ , ์บก์Šํ™”๋ฅผ ํ’€์–ด์ฃผ๋Š” ๊ฒฐ์ •์€ ์–ธ์ œ๋‚˜ ์ตœํ›„์˜ ์ˆ˜๋‹จ์ด๋‹ค.

ํด๋ž˜์Šค๋Š” ์ž‘์•„์•ผ ํ•œ๋‹ค!

  • ํด๋ž˜์Šค๋Š” ์ž‘๊ฒŒ ์ž‘๊ฒŒ ์ž‘๊ฒŒ..
  • ํด๋ž˜์Šค๋Š” ๋งก์€ ์ฑ…์ž„์„ ์ธก์ •ํ•œ๋‹ค.

Bad Example

// ์–ด๋งˆ์–ด๋งˆํ•˜๊ฒŒ ํฐ ์Šˆํผ ๋งŒ๋Šฅ ํด๋ž˜์Šค
public class SuperDashboard extends JFrame implements MetaDataUser {
    public String getCustomizerLanguagePath()
    public void setSystemConfigPath(String systemConfigPath)
    public String getSystemConfigDocument()
    public Properties getProps()
    public String getUserHome()
    public String getBaseDir()
    public int getMajorVersionNumber()
    public int getMinorVersionNumber()
    public int getBuildNumber()
    public MetaObject pasting(MetaObject target, MetaObject pasted, MetaProject project)
    public void processMenuItems(MetaObject metaObject)
    public void processMenuSeparators(MetaObject metaObject)
    public void processTabPages(MetaObject metaObject)
    public void processPlacement(MetaObject object)
    public void processCreateLayout(MetaObject object)
    public void updateDisplayLayer(MetaObject object, int layerIndex)
    public void propertyEditedRepaint(MetaObject object)
    public void processDeleteObject(MetaObject object)
    public boolean getAttachedToDesigner()
    public void processProjectChangedState(boolean hasProjectChanged)
    public void processObjectNameChanged(MetaObject object)
    public void runProject()
    public void setAรงowDragging(boolean allowDragging)
    public boolean allowDragging()
    public boolean isCustomizing()
    public void setTitle(String title)
    public IdeMenuBar getIdeMenuBar()
    public void showHelper(MetaObject metaObject, String propertyName)
 
    // ... many non-public methods follow ...
}

ํด๋ž˜์Šค ์ด๋ฆ„์€ ํ•ด๋‹น ํด๋ž˜์Šค ์ฑ…์ž„์„ ๊ธฐ์ˆ ํ•ด์•ผ๋œ๋‹ค. ์ž‘๋ช…์€ ํด๋ž˜์Šค ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์ฒซ๋ฒˆ์งธ ๊ด€๋ฌธ์ด๋‹ค.

๊ฐ„๊ฒฐํ•œ ์ด๋ฆ„์ด ๋– ์˜ค๋ฅด์ง€ ์•Š๋Š”๋‹ค๋ฉด ํด๋ž˜์Šค ์ฑ…์ž„์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ์ด๋‹ค. (e.g. Chapter 2์žฅ์— ์–ธ๊ธ‰ํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ Manager, Processor, Super ๋“ฑ)

๋˜ํ•œ ํด๋ž˜์Šค ์„ค๋ช…์€ โ€œifโ€, โ€œandโ€, โ€œorโ€, โ€œbutโ€์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  25 ๋‹จ์–ด ๋‚ด์™ธ๋กœ ๊ฐ€๋Šฅํ•ด์•ผ๋œ๋‹ค. ํ•œ๊ธ€์˜ ๊ฒฝ์šฐ ๋งŒ์•ฝ, ๊ทธ๋ฆฌ๊ณ , ~ํ•˜๋ฉฐ, ํ•˜์ง€๋งŒ ์ด ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋œ๋‹ค.

๋‹จ์ผ ์ฑ…์ž„ ์›์น™

SRP(Single Responsibility Principle)์€ ํด๋ž˜์Šค๋‚˜ ๋ชจ๋“ˆ์„ ๋ณ€๊ฒฝํ•  ์ด์œ ๊ฐ€ ํ•˜๋‚˜, ๋‹จ ํ•˜๋‚˜๋ฟ์ด์—ฌ์•ผ ํ•˜๋Š” ์›์น™์ด๋‹ค.

// ์ด ์ฝ”๋“œ๋Š” ์ž‘์•„๋ณด์ด์ง€๋งŒ, ๋ณ€๊ฒฝํ•  ์ด์œ ๊ฐ€ 2๊ฐ€์ง€์ด๋‹ค.
// ๋ฒ„์ ผ ์ •๋ณด.
// ์ปดํฌ๋„ŒํŠธ ๊ด€๋ฆฌ.
public class SuperDashboard extends JFrame implements MetaDataUser {
    public Component getLastFocusedComponent()
    public void setLastFocused(Component lastFocused)
    public int getMajorVersionNumber()
    public int getMinorVersionNumber()
    public int getBuildNumber()
}
// ์œ„ ์ฝ”๋“œ์—์„œ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฉ”์„œ๋“œ 3๊ฐœ๋ฅผ ๋”ฐ๋กœ ๋นผ์„œ
// Version์ด๋ผ๋Š” ๋…์ž์ ์ธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋‹ค๋ฅธ ๊ณณ์—์„œ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์›Œ์กŒ๋‹ค.
 
public class Version {
    public int getMajorVersionNumber()
    public int getMinorVersionNumber()
    public int getBuildNumber()
}

SRP๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์„ค๊ณ„์—์„œ ๋”์šฑ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๊ณ , ์ง€ํ‚ค๊ธฐ ์ˆ˜์›”ํ•œ ๊ฐœ๋…์ธ๋ฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์žฅ ๋ฌด์‹œํ•˜๋Š” ๊ทœ์น™ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

โ€œ๋„๊ตฌ ์ƒ์ž๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์€๊ฐ€? ์ž‘์€ ์„œ๋ž์„ ๋งŽ์ด ๋‘๊ณ  ๊ธฐ๋Šฅ๊ณผ ์ด๋ฆ„์ด ๋ช…ํ™•ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‚˜๋ˆ  ๋„ฃ๊ณ  ์‹ถ์€๊ฐ€? ์•„๋‹ˆ๋ฉด ํฐ ์„œ๋ž ๋ช‡๊ฐœ๋ฅผ ๋‘๊ณ  ๋ชจ๋‘ ๋˜์ ธ ๋„ฃ๊ณ  ์‹ถ์€๊ฐ€?โ€

ํฐ ํด๋ž˜์Šค ๋ช‡๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ ์ž‘์€ ํด๋ž˜์Šค ์—ฌ๋Ÿฟ์œผ๋กœ ์ด๋ค„์ง„ ์‹œ์Šคํ…œ์ด ๋” ๋ฐ”๋žŒ์งํ•˜๋‹ค. ์ž‘์€ ํด๋ž˜์Šค๋Š” ๊ฐ์ž ๋งก์€ ์ฑ…์ž„์ด ํ•˜๋‚˜๋ฉฐ, ๋ณ€๊ฒฝํ•  ์ด์œ ๊ฐ€ ํ•˜๋‚˜๋ฉฐ, ๋‹ค๋ฅธ ์ž‘์€ ํด๋ž˜์Šค์™€ ํ˜‘๋ ฅํ•ด ์‹œ์Šคํ…œ์— ํ•„์š”ํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์‘์ง‘๋„ Cohesion

ํด๋ž˜์Šค๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ์ˆ˜๊ฐ€ ์ž‘์•„์•ผ ํ•œ๋‹ค.

๊ฐ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•  ์ˆ˜๋ก ๋ฉ”์„œ๋“œ์™€ ํด๋ž˜์Šค๋Š” ์‘์ง‘๋„๊ฐ€ ๋” ๋†’๋‹ค.

๋ชจ๋“  ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ๋งˆ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค๋Š” ์‘์ง‘๋„๊ฐ€ ๊ฐ€์žฅ ๋†’์ง€๋งŒ, ์ด๋Ÿฐ ํด๋ž˜์Šค๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋„, ๋ฐ”๋žŒ์งํ•˜์ง€๋„ ์•Š๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐ€๋Šฅํ•œํ•œ ์‘์ง‘๋„๊ฐ€ ๋†’์€ ํด๋ž˜์Šค๋ฅผ ์ง€ํ–ฅํ•ด์•ผ ํ•œ๋‹ค. ์‘์ง‘๋„๊ฐ€ ๋†’๋‹ค๋Š” ๋ง์€ ํด๋ž˜์Šค์— ์†ํ•œ ๋ฉ”์„œ๋“œ์™€ ๋ณ€์ˆ˜๊ฐ€ ์„œ๋กœ ์˜์กดํ•˜๋ฉฐ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ๋ฌถ์ธ๋‹ค๋Š” ์˜๋ฏธ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

// Stack์„ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ, ์‘์ง‘๋„๊ฐ€ ๋†’์€ ํŽธ์ด๋‹ค.
// ๊ฐ Method๋งˆ๋‹ค ํด๋ž˜์Šค ๋ณ€์ˆ˜๋ฅผ ๋‹ค ์‚ฌ์šฉํ•˜์˜€๋‹ค.
public class Stack {
    private int topOfStack = 0;
    List<Integer> elements = new LinkedList<Integer>();
 
    public int size() {
        return topOfStack;
    }
 
    public void push(int element) {
        topOfStack++;
        elements.add(element);
    }
 
    public int pop() throws PoppedWhenEmpty {
        if (topOfStack == 0)
            throw new PoppedWhenEmpty();
        int element = elements.get(--topOfStack);
        elements.remove(topOfStack);
        return element;
    }
}

์‘์ง‘๋„๋ฅผ ์œ ์ง€ํ•˜๋ฉด ์ž‘์€ ํด๋ž˜์Šค ์—ฌ๋Ÿฟ์ด ๋‚˜์˜จ๋‹ค.

์‘์ง‘๋„๋ฅผ ์œ ์ง€ํ•˜๋ฉด ์ž‘์€ ํด๋ž˜์Šค ์—ฌ๋Ÿฟ์ด ๋‚˜์˜จ๋‹ค.

ํด๋ž˜์Šค๊ฐ€ ์‘์ง‘๋ ฅ์„ ์žƒ๋Š”๋‹ค๋ฉด ์ชผ๊ฐœ๋ผ! ํฐ ํ•จ์ˆ˜๋ฅผ ์ž‘์€ ํ•จ์ˆ˜ ์—ฌ๋Ÿฟ์œผ๋กœ ์ชผ๊ฐœ๋‹ค ๋ณด๋ฉด ์ข…์ข… ์ž‘์€ ํด๋ž˜์Šค ์—ฌ๋Ÿฟ์œผ๋กœ ์ชผ๊ฐค ๊ธฐํšŒ๊ฐ€ ์ƒ๊ธด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฒด๊ณ„๊ฐ€ ์žกํžˆ๊ณ  ๊ตฌ์กฐ๊ฐ€ ํˆฌ๋ช…ํ•ด์ง„๋‹ค.

// ์—„์ฒญ๋‚œ ๊ธธ์ด์˜ ํ•จ์ˆ˜์ด๋ฉด์„œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋งŒ๋Šฅ ํ•จ์ˆ˜์ด๋‹ค.
// ์ด ๊ธด ํ•จ์ˆ˜๋ฅผ ๋‚˜๋ˆ„์–ด ๋ณด์ž.
public class PrintPrimes {
    public static void main(String[] args) {
        final int M = 1000;
        final int RR = 50;
        final int CC = 4;
        final int WW = 10;
        final int ORDMAX = 30;
        int P[] = new int[M + 1];
        int PAGENUMBER;
        int PAGEOFFSET;
        int ROWOFFSET;
        int C;
        int J;
        int K;
        boolean JPRIME;
        int ORD;
        int SQUARE;
        int N;
        int MULT[] = new int[ORDMAX + 1];
 
        J = 1;
        K = 1;
        P[1] = 2;
        ORD = 2;
        SQUARE = 9;
 
        while (K < M) {
            do {
                J = J + 2;
                if (J == SQUARE) {
                    ORD = ORD + 1;
                    SQUARE = P[ORD] * P[ORD];
                    MULT[ORD - 1] = J;
                }
                N = 2;
                JPRIME = true;
                while (N < ORD && JPRIME) {
                    while (MULT[N] < J)
                        MULT[N] = MULT[N] + P[N] + P[N];
                    if (MULT[N] == J)
                        JPRIME = false;
                    N = N + 1;
                }
            } while (!JPRIME);
            K = K + 1;
            P[K] = J;
        }
        {
            PAGENUMBER = 1;
            PAGEOFFSET = 1;
            while (PAGEOFFSET <= M) {
                System.out.println("The First " + M + " Prime Numbers --- Page " + PAGENUMBER);
                System.out.println("");
                for (ROWOFFSET = PAGEOFFSET; ROWOFFSET < PAGEOFFSET + RR; ROWOFFSET++) {
                    for (C = 0; C < CC;C++)
                        if (ROWOFFSET + C * RR <= M)
                            System.out.format("%10d", P[ROWOFFSET + C * RR]);
                    System.out.println("");
                }
                System.out.println("\f"); PAGENUMBER = PAGENUMBER + 1; PAGEOFFSET = PAGEOFFSET + RR * CC;
            }
        }
    }
}

๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ์œ„์˜ ํ•จ์ˆ˜๋ฅผ ๊ฐ๊ฐ์˜ ์—ญํ• ์— ๋งž๊ฒŒ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • PrimePrinter
  • RowColumnPagePrinter
  • PrimeGenerator

๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ๋ณ€์ˆ˜์˜ ์ด๋ฆ„๋„ ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฌ์šด ํด๋ž˜์Šค

์‹œ์Šคํ…œ์€ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€ํ”ผํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ๋งˆ๋‹ค ์˜๋„๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์œ„ํ—˜์ด ๋”ฐ๋ฅธ๋‹ค. ๊นจ๋—ํ•œ ์‹œ์Šคํ…œ์€ ํด๋ž˜์Šค๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅด๋Š” ์œ„ํ—˜์„ ์ตœ๋Œ€ํ•œ ๋‚ฎ์ถ˜๋‹ค.

// ์ƒˆ๋กœ์šด SQL๋ฌธ์„ ์ง€์›ํ•  ๋•Œ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์†๋Œ€์•ผ ํ•˜๊ณ , ๊ธฐ์กด SQL๋ฌธ์„ ์ˆ˜์ •ํ•  ๋•Œ๋„ ์†๋Œ€์•ผ ํ•˜๋ฏ€๋กœ SRP์œ„๋ฐ˜ํ•œ๋‹ค.
public class Sql {
    public Sql(String table, Column[] columns)
    public String create()
    public String insert(Object[] fields)
    public String selectAll()
    public String findByKey(String keyColumn, String keyValue)
    public String select(Column column, String pattern)
    public String select(Criteria criteria)
    public String preparedInsert()
    private String columnList(Column[] columns)
    private String valuesList(Object[] fields, final Column[] columns) private String selectWithCriteria(String criteria)
    private String placeholderList(Column[] columns)
}

ํด๋ž˜์Šค ์ผ๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋Š” ์ฝ”๋“œ ๊ฐœ์„ ์˜ ์ž ์žฌ์ ์ธ ์—ฌ์ง€๋ฅผ ์‹œ์‚ฌํ•œ๋‹ค.

// ๊ณต๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ „๋ถ€ SQL ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒํ•˜๋Š” ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๊ณ , ๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธฐ๊ณ ,
// ๊ณตํ†ต๋œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋”ฐ๋กœ ํด๋ž˜์Šค๋กœ ๋บ๋‹ค.
// ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด update๋ฌธ ์ถ”๊ฐ€ ์‹œ์— ๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ๊ฑด๋“œ๋ฆด ์ด์œ ๊ฐ€ ์—†์–ด์ง„๋‹ค.
 
abstract public class Sql {
    public Sql(String table, Column[] columns)
    abstract public String generate();
}
public class CreateSql extends Sql {
    public CreateSql(String table, Column[] columns)
    @Override public String generate()
}
 
public class SelectSql extends Sql {
    public SelectSql(String table, Column[] columns)
    @Override public String generate()
}
 
public class InsertSql extends Sql {
    public InsertSql(String table, Column[] columns, Object[] fields)
    @Override public String generate()
    private String valuesList(Object[] fields, final Column[] columns)
}
 
public class SelectWithCriteriaSql extends Sql {
    public SelectWithCriteriaSql(
    String table, Column[] columns, Criteria criteria)
    @Override public String generate()
}
 
public class SelectWithMatchSql extends Sql {
    public SelectWithMatchSql(String table, Column[] columns, Column column, String pattern)
    @Override public String generate()
}
 
public class FindByKeySql extends Sql public FindByKeySql(
    String table, Column[] columns, String keyColumn, String keyValue)
    @Override public String generate()
}
 
public class PreparedInsertSql extends Sql {
    public PreparedInsertSql(String table, Column[] columns)
    @Override public String generate() {
    private String placeholderList(Column[] columns)
}
 
public class Where {
    public Where(String criteria) public String generate()
}
 
public class ColumnList {
    public ColumnList(Column[] columns) public String generate()
}

์ด์ƒ์ ์ธ ์‹œ์Šคํ…œ์ด๋ผ๋ฉด ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‹œ์Šคํ…œ์„ ํ™•์žฅํ•  ๋ฟ. ๊ธฐ์กด ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ๊ฒฉ๋ฆฌ

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ์—์„œ concrete ํด๋ž˜์Šค์™€ abstract ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š”๋ฐ, concrete ํด๋ž˜์Šค์— ์˜์กด(์ƒ์„ธํ•œ ๊ตฌํ˜„์— ์˜์กด)ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค๋Š” ๊ตฌํ˜„์ด ๋ฐ”๋€Œ๋ฉด ์œ„ํ—˜์— ๋น ์ง„๋‹ค. ๊ทธ๋ž˜์„œ ์ธํ„ฐํŽ˜์ด์Šค์™€ abstract ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„์ด ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ฒฉ๋ฆฌ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

์ƒ์„ธํ•œ ๊ตฌํ˜„์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๋‹ค. ๊ทธ๋ž˜์„œ ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•  ์ •๋„๋กœ ์‹œ์Šคํ…œ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค์œผ๋กœ์จ ์œ ์—ฐ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ๋„ ๋”์šฑ ๋†’์•„์ง„๋‹ค.

๊ฒฐํ•จ๋„๊ฐ€ ๋‚ฎ๋‹ค๋Š” ๋ง์€ ๊ฐ ์‹œ์Šคํ…œ ์š”์†Œ๊ฐ€ ๋‹ค๋ฅธ ์š”์†Œ๋กœ๋ถ€ํ„ฐ ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ์ž˜ ๊ฒฉ๋ฆฌ๋˜์–ด์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.