ํด๋ฆฐ ์ฝ”๋“œ

[ Programming > Clean Code ]

[ํด๋ฆฐ ์ฝ”๋“œ] 4-5์žฅ ์ฃผ์„-ํ˜•์‹ ๋งž์ถ”๊ธฐ

ย Carrot Yoon
ย 2025-11-11
ย 10

ํด๋ฆฐ ์ฝ”๋“œ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ข‹์€ ์ฃผ์„ ์“ฐ๋Š” ๋ฐฉ๋ฒ•๊ณผ, ํ˜•์‹ ๋งž์ถ”๊ธฐ ๋ฐฉ๋ฒ• ๋“ค์— ๋Œ€ํ•ด์„œ ์†Œ๊ฐœํ• ๊ฒŒ์š”.

4์žฅ. ์ฃผ์„

์ž˜ ๋‹ฌ์ง„ ์ฃผ์„์€ ๊ทธ ์–ด๋–ค ์ •๋ณด๋ณด๋‹ค ์œ ์šฉํ•ด์š”. ํ•˜์ง€๋งŒ ๊ทผ๊ฑฐ ์—†๋Š” ์ฃผ์„์€ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์–ด์š”. ๊ทธ๋ฆฌ๊ณ  ์˜ค๋ž˜ ๊ด€๋ฆฌ๊ฐ€ ์•ˆ๋œ ์ฃผ์„์€ ์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋„ ํ•ด์š”.

์ €์ž๋Š” ์ฃผ์„์€ ํ•„์š”์•…์ด๋ผ ํ‘œํ˜„ํ•ด์š”. ์ฝ”๋“œ ์ž์ฒด์— ํ‘œํ˜„๋ ฅ๊ณผ ์ „๋‹ฌ๋ ฅ์ด ์žˆ๋‹ค๋ฉด ์ฃผ์„์€ ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด์—์š”. ์ฆ‰, ๋‚˜์œ ์ฝ”๋“œ์— ์ฃผ์„์„ ๋‹ฌ์€ ๊ฒฝ์šฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋ž˜์„œ ์ฃผ์„์„ ๋‹ฌ๊ธฐ์ „์— ๋จผ์ € ์ฝ”๋“œ๋กœ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์„์ง€ ์ƒ๊ฐํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. ์ฃผ์„์„ ๋‹ฌ๋ฉด ๋ณธ์ธ์ด ํ‘œํ˜„๋ ฅ์ด ๋ถ€์กฑํ•จ์„ ์ธ์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€์—์š”.

๊ทธ๋Ÿฌ๋ฉด ์™œ์ด๋ ‡๊ฒŒ ์ฃผ์„์„ ๋ฏธ์›Œํ• ๊นŒ์š”? ๋ฐ”๋กœ ์ฃผ์„์ด ๊ฑฐ์ง“๋งํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ์—์š”. ๊ณ ์˜์ ์œผ๋กœ ๊ฑฐ์ง“๋งํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ฃผ์„์ด ์˜ค๋ž˜๋ ์ˆ˜๋ก ์ฝ”๋“œ์—์„œ ๋ฉ€์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด์—์š”. ๋˜ํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฃผ์„์„ ์œ ์ง€ ๋ฐ ๋ณด์ˆ˜ํ•˜๋Š” ๊ฒƒ๋„ ํ˜„์‹ค์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์—ฌ๊ฒจ์ ธ์š”. ์•„๋งˆ๋„ ์ฃผ์„์„ ๋‹ฌ์•„๋ดค์œผ๋ฉด ์•Œ๊ฑฐ์—์š”. ์–ธ์ œ ์ผ๋Š”์ง€ ๊ธฐ์–ต์ด ์•ˆ๋‚˜์š”.

์ฝ”๋“œ๋Š” ๋ณ€ํ™”ํ•˜๊ณ  ์ง„ํ™”ํ•ด์š”. ์—ฌ๊ธฐ ์ €๊ธฐ ์˜ฎ๊ฒจ๋‹ค๋‹ˆ๊ธฐ๋„ ํ•ด์š”. ๊ทธ๋ฆฌ๊ณ  ๋ถ„์—ดํ–ˆ๋‹ค๊ฐ€ ํ•ฉ์ณ์ง€๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฃผ์„์ด ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ธฐ ํž˜๋“ค์–ด์š”.

์ฃผ์„์€ ๋‚˜์œ ์ฝ”๋“œ๋ฅผ ๋ณด์™„ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์ฝ”๋“œ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์ด์œ ๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ์ด ๋‚˜์˜๊ธฐ ๋•Œ๋ฌธ์ด์—์š”. ๋ชจ๋“ˆ์„ ์งœ๊ณ  ๋ณด๋‹ˆ ์งœ์ž„์ƒˆ๊ฐ€ ์—‰๋ง์ด๊ณ  ์•Œ์•„๋จน๊ธฐ๊ฐ€ ํž˜๋“ค์–ด ์ฃผ์„์„ ๋‹ฌ์•„์•ผ๊ฒ ๋‹ค๋Š” ๊ฒฐ์‹ฌ์„ ํ•˜์ฃ . ์ด๋Ÿด ๋• "์ฃผ์„์„ ๋‹ฌ์•„์•ผ๊ฒ ๋‹ค!"๊ฐ€ ์•„๋‹ˆ๋ผ "์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•ด์•ผ๊ฒ ๋‹ค!"๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ด์š”.

ํ‘œํ˜„๋ ฅ์ด ํ’๋ถ€ํ•˜๊ณ  ๊น”๋”ํ•˜๋ฉฐ ์ฃผ์„์ด ๊ฑฐ์˜ ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ์–ด์ˆ˜์„ ํ•˜๋ฉฐ ์ฃผ์„์ด ๋งŽ์ด ๋‹ฌ๋ฆฐ ์ฝ”๋“œ๋ณด๋‹ค ์ข‹์•„์š”

์ฝ”๋“œ๋กœ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•˜๋ผ!

ํ™•์‹คํžˆ ์ฝ”๋“œ๋งŒ์œผ๋กœ ์˜๋„๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋ฅผ ์ฝ”๋“œ๋Š” ํ›Œ๋ฅญํ•œ ์ˆ˜๋‹จ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ž˜๋ชป ์ƒ๊ฐํ•ด์š”. ๋‹ค์Œ ์˜ˆ์ œ๋กœ ์•Œ์•„๋ด์š”.

1๋ฒˆ ์˜ˆ์ œ// ์ง์›์—๊ฒŒ ๋ณต์ง€ ํ˜œํƒ์„ ๋ฐ›์„ ์ž๊ฒฉ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.if((employee.flags & HOURLY_FLAG) && (employee.age > 5))2๋ฒˆ ์˜ˆ์ œif(employee.isEligibleForFullBenefits())

๋‘ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ์–ด๋–ค๊ฐ€์š”? ๋ช‡ ์ดˆ๋งŒ ๋” ์ƒ๊ฐํ•˜๋ฉด ์ฝ”๋“œ๋กœ ๋Œ€๋‹ค์ˆ˜ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์–ด์š”. ์ฃผ์„์œผ๋กœ ๋‹ฌ๋ ค๋Š” ์„ค๋ช…์„ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด ํ‘œํ˜„ํ•˜๋ฉด ์ข‹์•„์š”.

์ข‹์€ ์ฃผ์„

์ •๋ง ์ข‹์€ ์ฃผ์„์€, ์ฃผ์„์„ ๋‹ฌ์ง€ ์•Š์„ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋‚ธ ์ฃผ์„์ด์—์š”. ์—ฌ๊ธฐ์„œ๋Š” ์œ ์ตํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ์ฃผ์„์„ ์†Œ๊ฐœํ•˜๋ ค๊ณ ํ•ด์š”.

  • ๋ฒ•์ ์ธ ์ฃผ์„

ํšŒ์‚ฌ๊ฐ€ ์ •๋ฆฝํ•œ ๊ตฌํ˜„ ํ‘œ์ค€์— ๋งž์ถฐ ๋ฒ•์ ์ธ ์ด์œ ๋กœ ํŠน์ • ์ฃผ์„์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์–ด์š”. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ์†Œ์Šค ํŒŒ์ผ ์ฒซ๋จธ๋ฆฌ์— ๋“ค์–ด๊ฐ€๋Š” ์ €์ž‘๊ถŒ ์ •๋ณด์™€ ์†Œ์œ ๊ถŒ ์ •๋ณด์—์š”.

// Copyright (C) 2023,2024,2025 by Object Mentor, Inc. All rights reserved.// GNU General Public License ๋ฒ„์ „ 2 ์ด์ƒ์„ ๋”ฐ๋ฅด๋Š” ์กฐ๊ฑด์œผ๋กœ ๋ฐฐํฌํ•œ๋‹ค.
  • ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ฃผ์„

๊ธฐ๋ณธ์ ์ธ ์ •๋ณด๋ฅผ ์ฃผ์„์œผ๋กœ ์ œ๊ณตํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๊ธฐ๋„ํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์„์ด์—์š”.

// ํ…Œ์ŠคํŠธ ์ค‘์ธ Responder ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.protected abstract Responder responderInstance();=> ๊ฐœ์„ , responderBeingTested๋กœ ์ด๋ฆ„ ๋ฐ”๊พธ๋ฉด ์ฃผ์„์ด ํ•„์š” ์—†์–ด์ง.

๋ฌผ๋ก  ์œ„ ์ฃผ์„๋„ ์ข‹์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์‹œ๊ฐ€ ๋” ์ข‹์€ ์˜ˆ์‹œ์—์š”.

// kk:mm:ss EEE, MMM dd, yyyy ํ˜•์‹์ด๋‹ค.Pattern timeMatcher = Pattern.compie(    "\\d*:\\d*:\\d* \\w*, \\w* \\d*, \\d*");

์œ„์— ์ œ์‹œํ•œ ์ฃผ์„์€ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•œ ์ •๊ทœํ‘œํ˜„์‹์ด ์‹œ๊ฐ๊ณผ ๋‚ ์งœ๋ฅผ ๋œปํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ•ด์š”. ์ด์™•์ด๋ฉด ์‹œ๊ฐ๊ณผ ๋‚ ์งœ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ฝ”๋“œ๋ฅผ ์˜ฎ๊ฒจ์ฃผ๋ฉด ๋” ์ข‹๊ณ  ๊น”๋”ํ•ด์š”. ๊ทธ๋Ÿฌ๋ฉด ์ฃผ์„์ด ํ•„์š”์—†์–ด์ง€๋‹ˆ๊นŒ์š”.

  • ์˜๋„๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„

๋•Œ๋•Œ๋กœ ์ฃผ์„์€ ๊ตฌํ˜„์„ ์ดํ•ดํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ๊ฒƒ์„ ๋„˜์–ด ๊ฒฐ์ •์— ๊น”๋ฆฐ ์˜๋„๊นŒ์ง€ ์„ค๋ช…ํ•ด์š”. ๋‹ค์Œ ์˜ˆ์ œ๋กœ ๋ด์š”.

public int compareTo(Object o) {    if(o instanceof WikiPagePath) {        WikiPagePath p = (WikiPagePath) o;        String compressedName = StringUtil.join(names, "");        String compressedArgumentName = StringUtil.join(p.name, "");        String CompressedName.compareTo(compressedArgumentName);    }    return 1; // ์˜ค๋ฅธ์ชฝ ์œ ํ˜•์ด๋ฏ€๋กœ ์ •๋ ฌ ์ˆœ์œ„๊ฐ€ ๋” ๋†’๋‹ค.}

๋‹ค์Œ ์˜ˆ์ œ๊ฐ€ ๋” ์ข‹์€ ์˜ˆ์ œ์—์š”. ์ €์ž๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๋ฐฉ์‹์— ๋™์˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ €์ž์˜ ์˜๋„๊ฐ€ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚˜์š”.

public void testConcurrentAddWidgets() throws Exception {    WidgetBuilder widgetBuilder =        new WidgetBuilder(new Class[](BoldWidget.class));    String text = "'''bold text'''";    ParentWidget parent =        new BoldWidget(new MockWidgetRoot(), "'''bold text'''");    AtomicBoolean failFlag = new AtomicBoolean();    failFlag.set(false);    // ์–ด๋–ป๊ฒŒ๋“  ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์Šค๋ ˆ๋“œ๋ฅผ ๋Œ€๋Ÿ‰ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ.    for (int i = 0; i < 25000; i++) {        WidgetBuilderThread widgetBuilderThread =            new WidgetBuilderThread(widgetBuilder, text, parent, failFlag);        Thread thread = new Thread(widgetBuilderThread);        thread.start();    }    assertEquals(false, failFlag.get());}
  • ์˜๋ฏธ๋ฅผ ๋ช…๋ฃŒํ•˜๊ฒŒ ๋ฐํžˆ๋Š” ์ฃผ์„

๋•Œ๋•Œ๋กœ ๋ชจํ˜ธํ•œ ์ธ์ˆ˜๋‚˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๊ทธ ์˜๋ฏธ๋ฅผ ์ฝ๊ธฐ ์ข‹๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด ์ข‹์•„์š”. ๋ฌผ๋ก  ์ธ์ˆ˜๋‚˜ ๋ฐ˜ํ™˜๊ฐ’ ์ž์ฒด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ์ข‹์ง€๋งŒ, ํ˜„์‹ค์€ ์ธ์ˆ˜๋‚˜ ๋ฐ˜ํ™˜๊ฐ’์ด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋Š” ์ฝ”๋“œ์— ์†ํ•ด์„œ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด์š”. ๊ทธ๋ž˜์„œ ์˜๋ฏธ๋ฅผ ๋ช…๋ฃŒํ•˜๊ฒŒ ๋ฐํžˆ๋Š” ์ฃผ์„์ด ์œ ์šฉํ•˜๊ฒŒ๋˜์š”.

public void testCompareTo() throws Exception{    WikiPagePath a = PathParser.parse("PageA");    WikiPagePath ab = PathParser.parse("PageA.PageB");    WikiPagePath b = PathParser.parse("PageB");    WikiPagePath aa = PathParser.parse("PageA.PageA");    WikiPagePath bb = PathParser.parse("PageB.PageB");    WikiPagePath ba = PathParser.parse("PageB.PageB");    assertTrue(a.compareTo(a) == 0);    // a == a    assertTrue(a.compareTo(b) != 0);    // a != b    assertTrue(ab.compareTo(ab) == 0);  // ab == ab    assertTrue(a.compareTo(b) == -1);   // a < a    assertTrue(aa.compareTo(ab) == -1); // aa < ab    assertTrue(ba.compareTo(bb) == -1); // ba < bb    assertTrue(b.compareTo(a) == 1);    // b > a    assertTrue(ab.compareTo(aa) == 1);  // ab > aa    assertTrue(bb.compareTo(ba) == 1);  // bb > ba}

์œ„ ์ฝ”๋“œ๋Š” ์ž˜๋ชป๋œ ์ฃผ์„์„ ์ ์„ ํ™•๋ฅ ์ด ๋†’์•„์š”. ๊ทธ๋ฆฌ๊ณ  ์˜ณ๋ฐ”๋ฅธ์ง€ ๊ฒ€์ฆํ•˜๊ธฐ๋„ ํž˜๋“ค๊ณ ์š”. ์ด๊ฒƒ์ด ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆํ•˜๋Š” ์ฃผ์„์ด ํ•„์š”ํ•œ ์ด์œ ์ธ ๋™์‹œ์— ์ฃผ์„์ด ์œ„ํ—˜ํ•œ ์ด์œ ์—์š”.

  • ๊ฒฐ๊ณผ๋ฅผ ๊ฒฝ๊ณ ํ•˜๋Š” ์ฃผ์„

๋•Œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฝ๊ณ ํ•  ๋ชฉ์ ์œผ๋กœ ์ฃผ์„์„ ์‚ฌ์šฉํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ์˜ ํŠน์ • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๊บผ์•ผํ•˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„์ด์—์š”.

// ์—ฌ์œ  ์‹œ๊ฐ„์ด ์—†์œผ๋ฉด ์‹คํ–‰ํ•˜์ง€ ๋งˆ์„ธ์š”.public void _testWithReallyBigFile(){    writeLineToFile(10000000);    response.setBody(testFile);    response.readyToSend(this);    String responseString = output.toString();    assertSubString("Content-Length: 1000000000", respnseString);    assertTrue(bytesSent > 1000000000);}

์ด๋ฒˆ์—๋Š” ๋‹ค๋ฅธ ์ ์ ˆํ•œ ์ฃผ์„์„ ๋ณด์—ฌ์ค„๊ฒŒ์š”.

public static SimpleDateFormat makeStandardHttpDateFormat(){    // SimpleDateFormat์€ ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.    // ๋”ฐ๋ผ์„œ ๊ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.    SimpleDateFormat df = new SimpleDateformat("EEE, dd MMM  yyyy HH:mm:ss z");    df.setTimeZone(TimeZone.getTimeZone("GMT"));    return df;}

๋” ๋‚˜์€ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ์‚ฌ๋žŒ๋„ ์žˆ์„๊ฑฐ์—์š”. ๊ทธ๋Ÿผ์—๋„ ์ด ์ฃผ์„์€ ํ•ฉ๋ฆฌ์ ์ด์—์š”. ํšจ์œจ์„ ์œ„ํ•ด ์ •์  ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฃผ์„ ๋•Œ๋ฌธ์— ์‹ค์ˆ˜๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์–ด์š”.

  • TODO ์ฃผ์„

๋•Œ๋กœ๋Š” "์•ž์œผ๋กœ ํ•  ์ผ"์„ TODO ์ฃผ์„์œผ๋กœ ๋‚จ๊ฒจ๋‘๋ฉด ํŽธํ•ด์š”. ๋‹ค์Œ์€ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ์ด์œ ์™€ ๋ฏธ๋ž˜ ๋ชจ์Šต์„ TODO ์ฃผ์„์œผ๋กœ ์„ค๋ช…ํ•œ ์˜ˆ์ œ์—์š”.

// TODO-MdM ํ˜„์žฌ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.// ์ฒดํฌ์•„์›ƒ ๋ชจ๋ธ์„ ๋„์ž…ํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ํ•„์š” ์—†๋‹ค.protected VersionInfo makeVersion() throws Exception {    return null}

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

์ž์ฃผ์‚ฌ์šฉ๋˜๋Š” TODO ๊ฐ™์€ ์ฃผ์„ ํƒœ๊ทธ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ดค์–ด์š”.

  • TODO : ๋‹น์žฅ์€ ์–ด๋ ต์ง€๋งŒ ๋‚˜์ค‘์— ์ถ”๊ฐ€๋กœ ์ž‘์—…ํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„ ํ‘œํ˜„

  • FIXME : ์ฆ‰์‹œ ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๋˜๋Š”์ˆ˜์ •์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋…ผ์˜ํ•œ ์ฝ”๋“œ๋ฅผ ํ‘œํ˜„

  • HACK : ์ž„์‹œ์ ์ธ ํ•ด๊ฒฐ์ฑ…(๋ฌธ์ œ ํšŒํ”ผ ๊ธฐ๋ฒ•)์— ๋Œ€ํ•œ ์ฃผ์„

  • XXX : ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ๋‚˜์ค‘์— ๊ฒ€ํ† ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์„ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„(๋น„ํšจ์œจ์ ์ธ ์ฝ”๋“œ) ํ‘œํ˜„

  • ์ค‘์š”์„ฑ์„ ๊ฐ•์กฐํ•˜๋Š” ์ฃผ์„

๋Œ€์ˆ˜๋กญ์ง€ ์•Š๋‹ค๊ณ  ์—ฌ๊ฒจ์งˆ ๊ฒƒ์˜ ์ค‘์š”์„ฑ์„ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด๋„ ์ข‹์•„์š”.

String listItemContent = match.group(3).trim();// ์—ฌ๊ธฐ์„œ trim์€ ๋งค์šฐ ์ค‘์š”. trim ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด์—์„œ ์‹œ์ž‘ ๊ณต๋ฐฑ ์ œ๊ฑฐ.// ๋ฌธ์ž์—ด ์‹œ์ž‘ ๊ณต๋ฐฑ์ด ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธnew ListItemWidget(this, listItemContent, this.level + 1);return buildList(text.substring(match.end()));
  • ๊ณต๊ฐœ API์—์„œ Javadocs

์„ค๋ช…์ด ์ž˜ ๋œ ๊ณต๊ฐœ API๋Š” ๋งŒ์กฑ์Šค๋Ÿฌ์›Œ์š”. ํ‘œ์ค€ ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•œ Javadocs๊ฐ€ ์ข‹์€ ์˜ˆ์—์š”. ๊ณต๊ฐœ API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ›Œ๋ฅญํ•œ Javadocs๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•ด์š”. ๋‹ค๋ฅธ ์ฃผ์„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ทธ๋ฆ‡๋œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผํ•ด์š”.

๋‚˜์œ ์ฃผ์„

๋Œ€๋‹ค์ˆ˜ ์ฃผ์„์ด ๋‚˜์œ ์ฃผ์„์— ์†ํ•ด์š”. ํ—ˆ์ˆ ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด์กฐํ•˜๊ฑฐ๋‚˜, ๋ณ€๋ช…ํ•˜๊ฑฐ๋‚˜, ํ•ฉ๋ฆฌํ™”ํ•˜๋Š” ๋“ฑ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฃผ์ ˆ๊ฑฐ๋ฆฌ๋Š” ๋…๋ฐฑ์— ์ง€๋‚˜์ง€์•Š์•„์š”.

  • ์ฃผ์ ˆ๊ฑฐ๋ฆฌ๋Š” ์ฃผ์„

์ด์œ  ์—†์ด ์˜๋ฌด๊ฐ์— ํ˜น์€ ํ”„๋กœ์„ธ์Šค ์•„๋ž˜์— ์ฃผ์„์„ ๋‹ฌ๋ฉด ์‹œ๊ฐ„ ๋‚ญ๋น„์—์š”. ์ฃผ์„์„ ๋‹ฌ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด, ์‹œ๊ฐ„์„ ๋“ค์—ฌ ์ตœ๊ณ ์˜ ์ฃผ์„์„ ๋‹ฌ๋„๋ก ๋…ธ๋ ฅํ•ด์•ผํ•ด์š”. ๋‹ค์Œ ์˜ˆ์‹œ๋Š” ๊ทธ๋ƒฅ ์ฃผ์ ˆ๊ฑฐ๋ ค ํŒ๋…์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฃผ์„์ด์—์š”.

public void loadProperties() {    try {        String propertiesPath = propertiesLocation + "/" + PROPERTIES_FILE;        FileInputStream propertiesStream = new FileInputStream(propertiesPath);        loadedProperties.load(propertiesStream);    } catch(IOException e) {        // ์†์„ฑ ํŒŒ์ผ์ด ์—†๋‹ค๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ฝ์–ด ๋“ค์˜€๋‹ค๋Š” ์˜๋ฏธ๋‹ค    }}

catch ๋ธ”๋ก์— ์žˆ๋Š” ์ฃผ์„ ์˜๋ฏธ๊ฐ€ ์ „ํ˜€ ์ „ํ•ด์ง€์ง€ ์•Š์•„์š”. IOException์ด ๋ฐœ์ƒํ•˜๋ฉด ์†์„ฑ ํŒŒ์ผ์ด ์—†๋‹ค๋Š” ๋œป์ธ๊ฑฐ ๊ฐ™์•„์š”. ๊ทธ๋Ÿฐ๋ฐ ๊ธฐ๋ณธ๊ฐ’์€ ๋˜ ๋ญ”์ง€ ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๊ฒ ์–ด์š”. ๋‹ต์„ ์•Œ์•„๋‚ด๋ ค๋ฉด ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๋’ค์ ธ๋ณด๋Š” ์ˆ˜๋ฐ–์— ์—†๊ฒ ๋„ค์š”.

  • ๊ฐ™์€ ์ด์•ผ๊ธฐ๋ฅผ ์ค‘๋ณตํ•˜๋Š” ์ฃผ์„

์•„๋ž˜ ์˜ˆ์‹œ๋Š” ์ฃผ์„์ด ์ฝ”๋“œ์˜ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ์ ์—ˆ์–ด์š”. ์ž์นซํ•˜๋ฉด ์ฝ”๋“œ๋ณด๋‹ค ์ฃผ์„ ์ฝ๋Š” ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฌ๊ฒ ๋„ค์š”.

// this.closed๊ฐ€ true์ผ ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ์ด๋‹ค.// ํƒ€์ž„์•„์›ƒ์— ๋„๋‹ฌํ•˜๋ฉด๏ปฟ ์˜ˆ์™ธ๋ฅผ๏ปฟ ๋˜์ง„๋‹ค.public๏ปฟ synchronized๏ปฟ void๏ปฟ waitForClose(final๏ปฟ long๏ปฟ timeoutMillis) {    throws๏ปฟ Exception{        if(!closed) {            wait(timeoutMillis);            if(!closed) {                throw new๏ปฟ Exception("MockResponseSender could not be closed");            }        }    }}

์œ„ ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ถ€์ •ํ™•ํ•ด ์˜๋ฏธ๋ฅผ ๋ชจ๋‘ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์„์„ ์ผ์„ ํ™•๋ฅ ์ด ๋†’์•„์š”. ์ฃผ์„์„ ๋ณด๊ณ  ๋Œ€์ถฉ ๋„˜์–ด๊ฐ€์ฃผ๊ธธ ๋ฐ”๋ผ๋Š” ๋А๋‚Œ์ด์—์š”.

๋˜ ๋‹ค๋ฅธ ์˜ˆ์‹œ๋กœ Tomcat์—์„œ ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ์—์š”. ์“ธ๋ชจ์—†๋Š” ์ค‘๋ณต๋œ Javadocs๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์š”.

public abstract class ContainerBase        implements Container, Lifecycle, Pipeline,         MBeanRegistration, Serializable {    /**     * ์ด ์ปดํฌ๋„ŒํŠธ์˜ ํ”„๋กœ์„ธ์„œ ์ง€์—ฐ๊ฐ’     */    protected int backgroundProcessorDelay = -1;    /**     * ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ์ƒ๋ช…์ฃผ๊ธฐ ์ด๋ฒคํŠธ     */    protected LifecycleSupport lifecycle =             new LifecycleSupport(this);    /**     * ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ„ํ•œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ     */    protected ArrayList listeners = new ArrayList();    /**     * ์ปจํ…Œ์ด๋„ˆ์™€ ๊ด€๋ จ๋œ loader ๊ตฌํ˜„     */    protected Loader loader = null;      /**     * ์ปจํ…Œ์ด๋„ˆ์™€ ๊ด€๋ จ๋œ Logger ๊ตฌํ˜„     */    protected Log logger = null;      /**     * ๊ด€๋ จ logger ์ด๋ฆ„     */    protected String logName = null;      /**     * ์ปจํ…Œ์ด๋„ˆ์™€ ๊ด€๋ จ๋œ Manager ๊ตฌํ˜„     */    protected Manager manager = null;        /**     * ์ปจํ…Œ์ด๋„ˆ์™€ ๊ด€๋ จ๋œ Cluster     */    protected Cluster cluster = null;     /**     * ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„     */    protected String name = null;      /**     * ์ปจํ…Œ์ด๋„ˆ์˜ ๋ถ€๋ชจ ์ปจํ…Œ์ด๋„ˆ     */    protected Container parent = null;      /**     * Loader๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๊ตฌ์„ฑ์ด ๋๋‚˜์•ผ ํ•  ์–ด๋ฒ„์ด ํด๋ž˜์Šค ๋กœ๋”     */    protected ClassLoader parentClassLoader = null;      /**     * ์ปจํ…Œ์ด๋„ˆ์™€ ๊ด€๋ จ๋œ Pipeline ๊ฐ์ฒด     */    protected Pipeline pipeline = new StandardPipeline(this);      /**     * ์ปจํ…Œ์ด๋„ˆ์™€ ๊ด€๋ จ๋œ Realm     */    protected Realm realm = null;        /**     * ์ปจํ…Œ์ด๋„ˆ์™€ ๊ด€๋ จ๋œ DirContect ๊ฐ์ฒด     */    protected DirContext resources = null;

๊ทผ๋ฐ ์ €๊ฐ™์€ ์ดˆ๋ณด์—๊ฒŒ๋Š” ์œ„ ์ฃผ์„ ์ผ๋ถ€๋Š” ์˜คํžˆ๋ ค ์ดํ•ดํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

  • ์˜คํ•ดํ•  ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ์ฃผ์„

์•„๊นŒ ์œ„ ์ฝ”๋“œ์—์„œ this.closed๊ฐ€ true์ด๋ฉด ๋ฐ˜ํ™˜๋œ๋‹ค๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๊ฐ€ ๊ธฐ์–ต๋‚˜๋‚˜์š”? ๊ทธ๋Ÿฐ๋ฐ ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๊ณ  ์žˆ์–ด์š”. ์ฃผ์„์— ๋‹ด๊ธด "์ž˜๋ชป๋œ ์ •๋ณด"๋กœ ๋ฐ˜ํ™˜๋ ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ๋˜ true๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๊ณ  ์žˆ์–ด์š”. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๊ณจ์น˜์•„ํ”ˆ ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด์š”.

  • ์˜๋ฌด์ ์œผ๋กœ ๋‹ค๋Š” ์ฃผ์„

๋ชจ๋“  ํ•จ์ˆ˜์— Javadocs๋ฅผ ๋‹ฌ๊ฑฐ๋‚˜ ์ฃผ์„์„ ๋‹ค๋Š” ๊ทœ์น™์€ ์–ด๋ฆฌ์„์–ด์š”. ์˜คํžˆ๋ ค ์ฃผ์„์ด ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ๊ฑฐ์ง“๋ง๊ณผ ํ˜ผ๋™์„ ์ดˆ๋ž˜ํ•ด์š”. ๊ทธ๋ฆฌ๊ณ  ์ฃผ์„ ๊ด€๋ฆฌ๊นŒ์ง€ ํ•ด์•ผํ•˜๋‹ˆ ๋” ๋น„์šฉ์ด ๋งŽ์ด ๋“ค์–ด๊ฐ€์š”. ๊ตณ์ด ์ฃผ์„์ด ์—†์–ด๋„ ์ดํ•ด๋˜์ง€ ์•Š๋‚˜์—ฌ?

/** *  * @param title CD ์ œ๋ชฉ * @param author CD ์ €์ž * @param tracks CD ํŠธ๋ž™ ์ˆซ์ž * @param durationInMinutes CD ๊ธธ์ด(๋‹จ์œ„:๋ถ„) */public void addCD(String title, String author,                   int tracks, int durationInMinutes) {    CD cd = new CD();    cd.title = title;    cd.author = author;    cd.tracks = tracks;    cd.duration = duration;    cdList.add(cd);}

์‚ฌ๊ฒฌ: ์œ„์™€ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚˜๋Š” ์ด์œ ๋Š” ์™œ์ผ๊นŒ..? ๊ตฌ์„ฑ์›๋“ค์ด ์ฝ”๋“œ๋ฅผ ์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ์งœ์„œ ํƒ€์ž…๊ณผ ์ด๋ฆ„์„ ์‹ ๋ขฐํ•˜์ง€ ๋ชปํ•ด์„œ ์ผ๊นŒ? ์•„๋‹ˆ๋ฉด ์ฝ”๋“œ์งœ๋Š” ์‚ฌ๋žŒ์ด CD ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋ฐ›๋„๋ก ํ–ˆ์–ด์•ผ ํ–ˆ์„๊นŒ? ์ƒ๊ฐ์ด ๋งŽ์•„์ง„๋‹ค.

  • ์ด๋ ฅ์„ ๊ธฐ๋กํ•˜๋Š” ์ฃผ์„

์ข…์ข… ๋ชจ๋“ˆ์„ ํŽธ์ง‘ํ•  ๋•Œ ์ฒซ๋จธ๋ฆฌ์— ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๋‚จ๊ฒจ์š”. ์˜ˆ์ „์—๋Š” ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๋‚จ๊ธฐ๋Š” ๊ฒƒ์ด ๊ด€๋ก€์ด๊ณ  ํ•„์š”ํ–ˆ์ง€๋งŒ, ์†Œ์Šค ์ฝ”๋“œ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ•„์š” ์—†์–ด์กŒ์œผ๋‹ˆ ์ œ๊ฑฐํ•˜๋Š” ํŽธ์ด ์ข‹์•„์š”.

  • ์žˆ์œผ๋‚˜ ๋งˆ๋‚˜ ํ•œ ์ฃผ์„

๋•Œ๋•Œ๋กœ ์žˆ์œผ๋‚˜ ๋งˆ๋‚˜ ํ•œ ์ฃผ์„์„ ์ ‘ํ•ด์š”. ๋„ˆ๋ฌด ๋‹น์—ฐํ•œ ์‚ฌ์‹ค์„ ์–ธ๊ธ‰ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ์ฃผ์ง€ ๋ชปํ•˜๋Š” ์ฃผ์„์ด์—์š”.

// ๊ธฐ๋ณธ ์ƒ์„ฑ์žprotected AnnualDateRule() {}// ์›” ์ค‘ ์ผ์žprivate int dayOfMonth;

์œ„์™€ ๊ฐ™์€ ์ฃผ์„์ด ๋งŽ์•„์ง€๋ฉด ๋„ˆ๋ฌด ์ง€๋‚˜์นœ ์ฐธ๊ฒฌ์ด๋ผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฃผ์„์„ ๋ฌด์‹œํ•˜๋Š” ์Šต๊ด€์— ๋น ์งˆ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋ฆฌ๊ณ  ์ด๋Š” ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด์„œ ์ฃผ์„์ด ๊ฑฐ์ง“์ด ๋˜์–ด ๋ฒ„๋ ค์š”.

  • ๋ฌด์„œ์šด ์žก์Œ

๋•Œ๋กœ๋Š” Javadocs๋„ ์žก์Œ์ด์—์š”. ๋‹ค์Œ์€ ์ž˜ ์•Œ๋ ค์ง„ ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ์—์š”.

/** The name. */private String name;/** The version. */private String version;/** The licenceName. */private String licenceName;/** The Info */private String info;

๊ฑฐ์˜ ๋ถ™์—ฌ๋„ฃ๊ธฐํ•œ ๊ฑฐ ๊ฐ™์•„์š”. ๋…์ž๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ์ด์ต์„ ์–ป์„ ์ˆ˜ ์žˆ์–ด ๋ณด์ด๋‚˜์š”?

  • ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ฃผ์„์„ ๋‹ฌ์ง€ ๋งˆ๋ผ

// ์ „์—ญ ๋ชฉ๋ก<smodule>์— ์†ํ•˜๋Š” ๋ชจ๋“ˆ์ด ์šฐ๋ฆฌ๊ฐ€ ์†ํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ์— ์˜์กดํ•˜๋Š”๊ฐ€?if(smodule.getDependSubsystems().contains(subSysMod.getSubSystem()))<--- ๊ฐœ์„  ํ›„ --->ArrayList moduleDependees = smodule.getDependSubsystems();String ourSubSystem = subSysMod.getSubSystem();if(moduleDependees.contains(ourSubSystem))

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ฝ”๋“œ๋ฅผ ์•Œ์•„๋ณด๊ธฐ ํž˜๋“ค์–ด์„œ ์ฃผ์„์„ ๋„ฃ์—ˆ์ง€๋งŒ, ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๋ฉด ๊ตณ์ด ์ฃผ์„์ด ํ•„์š” ์—†์–ด์š”. ๋ฌผ๋ก  ์ €์ž๊ฐ€ ์ฃผ์„์„ ๋จผ์ € ๋‹ฌ๊ณ  ์ฃผ์„์— ๋งž์ถฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์„ ์ˆ˜๋„ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์€ ์ฃผ์„์ด ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ๊ฐœ์„ ํ•˜๋Š”๊ฒŒ ์ข‹์•„์š”.

  • ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ฃผ์„

์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๋ ค๊ณ  "// Actions ///////////" ์ด๋Ÿฐ์‹์œผ๋กœ ์ฃผ์„์„ ๋‹ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด์š”. ํ•ด๋‹น ์ฃผ์„ ๋ฐฐ๋„ˆ ์•„๋ž˜์— Action๋“ค์„ ๋ชจ์•„๋†จ์„ ๊ฑฐ ๊ฐ™์•„์š”. ๋’ค์— ////๊ฐ™์€ ๊ฑฐ๋Š” ๋„ˆ๋ฌด ๋ˆˆ์— ๋„๊ณ  ๋ณ„๋ฃจ๋ผ๊ณ  ๋…์ž๊ฐ€ ๋งํ•ด์š”. ๊ทธ๋ฆฌ๊ณ  ์ €๋Ÿฐ ๋ฐฐ๋„ˆ๋Š” ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค๊ณ  ๋งํ•ด์š”. ์ € ๋˜ํ•œ ์ €๋Ÿฐ ๋ฐฐ๋„ˆ๋ฅผ ์œ ๋ช…ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์“ฐ๋Š” ๊ฑธ ๋ณธ์ ์ด ์žˆ์–ด์š”.

  • ๋‹ซ๋Š” ๊ด„ํ˜ธ์— ๋‹ค๋Š” ์ฃผ์„

์ค‘์ฒฉ์ด ์‹ฌํ•˜๊ณ  ์žฅํ™ฉํ•œ ํ•จ์ˆ˜๋ผ๋ฉด ๋‹ซ๋Š” ๊ด„ํ˜ธ๊ฐ€ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ž‘๊ณ  ์บก์Аํ™”๋œ ํ•จ์ˆ˜๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์šฐ๋ฆฌ๋“ค์—๊ฒŒ๋Š” ๊ทธ๋Ÿด ํ™•๋ฅ ์ด ์ ์–ด์š”. ๋‹ซ๋Š” ๊ด„ํ˜ธ์— ์ฃผ์„์„ ๋‹ฌ์•„์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค๋ฉด ํ•จ์ˆ˜๋ฅผ ์ค„์ด๋„๋ก ์‹œ๋„ํ•ด๋ด์š”. ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ๊ทธ ์˜ˆ์‹œ์—์š”

public class wc {    public static void main(String[] args) {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        String line;        int lineCount = 0;        int charCount = 0;        int wordCount = 0;        try {            while((line = in.readLine()) != null) {                lineCount++;                ...            } // while            System.out.println("wordCount = " + wordCount);            System.out.println("charCount= " + charCount);            System.out.println("lineCount = " + lineCount);        } // try        catch (IOException e) {            System.err.println("์—๋Ÿฌ:" + e.getMessage());        } // catch    } // main}
  • ๊ณต๋กœ๋ฅผ ๋Œ๋ฆฌ๊ฑฐ๋‚˜ ์ €์ž๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ฃผ์„

"/* ๋‹น๊ทผ์ด ์ถ”๊ฐ€ํ•จ */"๊ณผ ๊ฐ™์€ ์ฃผ์„์€ ๋”์ด์ƒ ํ•„์š” ์—†์–ด์š”. ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ๋ˆ„๊ฐ€ ์–ธ์ œ ๋ฌด์—‡์„ ์ถ”๊ฐ€ํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ์š”.

  • ์ฃผ์„์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ์ฝ”๋“œ

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

  • HTML ์ฃผ์„

์ด๊ฑฐ๋Š” ์ง„์งœ ์ฃผ์„์—์„œ <p/>, <pre/>, &quot; ๊ฐ™์€๊ฑฐ๋กœ ์ฃผ์„ ๋‹ค๋Š” ๊ฑฐ์—์š”. ์ €์ž๊ฐ€ ์—„์ฒญ ํ˜์˜คํ•˜๋Š” ๊ฑฐ์—์š”. ์ €๋„ ์ด๊ฑด ํ˜์˜ค์Šค๋Ÿฌ์›Œ์š”. ๊ตณ์ด ์˜ˆ์‹œ๋„ ์•ˆ๋ณด์—ฌ์ค„๊ฒŒ์š”. ์ •๋ง ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์„๊ฑฐ ๊ฐ™๊ธดํ•ด์š”. ์˜ˆ๋ฅผ๋“ค๋ฉด JS Docs์—์„œ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ๋ฒ•์„ ์ ์–ด์ค„ ๋•Œ์š”. ๊ทธ๋Ÿด ๋•Œ๋Š” ๋ถ„๋ช… ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

/** * Headless Select component using Render Props * * @example * ```jsx * <HeadlessSelect *   options={['Apple', 'Banana', 'Orange']} *   value={value} *   onChange={setValue} * > *   {({ value, open, toggle, select }) => ( *     <div> *       <button onClick={toggle}> *         {value ?? 'Select a fruit'} *       </button> *       {open && ( *         <ul> *           {['Apple', 'Banana', 'Orange'].map((opt) => ( *             <li key={opt} onClick={() => select(opt)}> *               {opt} *             </li> *           ))} *         </ul> *       )} *     </div> *   )} * </HeadlessSelect> * ``` */
  • ์ „์—ญ ์ •๋ณด

์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ•œ๋‹ค๋ฉด ๊ทผ์ฒ˜์— ์žˆ๋Š” ์ฝ”๋“œ๋งŒ ๊ธฐ์ˆ ํ•˜๋Š”๊ฒŒ ์ข‹์•„์š”. ์ฝ”๋“œ ์ผ๋ถ€์— ์ฃผ์„์„ ๋‹ฌ๋ฉด์„œ ์‹œ์Šคํ…œ์˜ ์ „๋ฐ˜์ ์ธ ์ •๋ณด๋ฅผ ๊ธฐ์ˆ ํ•˜๋ฉด, ํ•ด๋‹น ์ •๋ณด๊ฐ€ ๋ณ€ํ•ด๋„ ์ถ”์ ๋„ ํž˜๋“ค๊ณ  ํ†ต์ œ๋„ ๋ถˆ๊ฐ€ํ•ด์š”.

/** * ์ ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ํฌํŠธ: 8082 * @param fitnessePort */public void setFitnessePort(int fitnessePort) {    this.fitnessePort = fitnessePort;}
  • ๋„ˆ๋ฌด ๋งŽ์€ ์ •๋ณด

์ฃผ์„์— ํฅ๋ฏธ๋กœ์šด ์—ญ์‚ฌ๋‚˜ ๊ด€๋ จ ์—†๋Š” ์ •๋ณด๋ฅผ ์žฅํ™ฉํ•˜๊ฒŒ ๋Š˜์–ด๋†“์ง€ ๋งˆ์„ธ์š”. ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด RFC ๋ฒˆํ˜ธ๋ฅผ ์ œ์™ธํ•˜๋ฉด ๋…์ž์—๊ฒŒ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด์ผ ๋ฟ์ด์—์š”.

/* RFC 2045 - Multipurpose Internet Mail Extensions (MIME) 1๋ถ€: ์ธํ„ฐ๋„ท ๋ฉ”์‹œ์ง€ ๋ณธ์ฒด ํ˜•์‹ 6.8์ ˆ. Base64 ๋‚ด์šฉ ์ „์†ก ์ธ์ฝ”๋”ฉ(Content-Transfer-Encoding) ์ธ์ฝ”๋”ฉ ๊ณผ์ •์€ ์ž…๋ ฅ ๋น„ํŠธ ์ค‘ 24๋น„ํŠธ ๊ทธ๋ฃน์„ ์ธ์ฝ”๋”ฉ๋œ 4๊ธ€์ž๋กœ ๊ตฌ์„ฑ๋œ ์ถœ๋ ฅ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ง„ํ–‰ํ•ด๊ฐ€๋ฉฐ, 3๊ฐœ๋ฅผ ๋ฌถ์–ด 8๋น„ํŠธ ์ž…๋ ฅ...*/
  • ๋ชจํ˜ธํ•œ ๊ด€๊ณ„

์ฃผ์„๊ณผ ์ฝ”๋“œ ์‚ฌ์ด ๊ด€๊ณ„๊ฐ€ ๋ช…๋ฐฑํ•ด์•ผํ•ด์š”. ๊ณต๋“ค์—ฌ ์ฃผ์„์„ ๋‹ฌ์•˜๋‹ค๋ฉด ์ ์–ด๋„ ๋…์ž๊ฐ€ ์ฃผ์„๊ณผ ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ๋ฌด์Šจ ์†Œ๋ฆฌ์ธ์ง€๋Š” ์•Œ์•„์•ผ๊ฒ ์ฃ ?

/* * ๋ชจ๋“  ํ”ฝ์…€์„ ๋‹ด์„ ๋งŒํผ ์ถฉ๋ถ„ํ•œ ๋ฐฐ์—ด๋กœ ์‹œ์ž‘ํ•œ๋‹ค(์—ฌ๊ธฐ์— ํ•„ํ„ฐ ๋ฐ”์ดํŠธ๋ฅผ ๋”ํ•œ๋‹ค). * ๊ทธ๋ฆฌ๊ณ  ํ—ค๋” ์ •๋ณด๋ฅผ ์œ„ํ•ด 200๋ฐ”์ดํŠธ๋ฅผ ๋”ํ•œ๋‹ค. */this.pngBytes = new byte[((this.width + 1) * this.height * 3) + 200];

์œ„ ์ฝ”๋“œ์—์„œ ํ•„ํ„ฐ ๋ฐ”์ดํŠธ๊ฐ€ ๋ญ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋‚˜์š”? +1์ธ๊ฐ€์š”? *3์ธ๊ฐ€์š”? 200๋ฐ”์ดํŠธ๋Š” ์™œ ๋”ํ• ๊นŒ์š”? ์ฃผ์„ ์ž์ฒด๊ฐ€ ๋‹ค์‹œ ์„ค๋ช…์„ ์š”๊ตฌํ•˜๊ฒŒ๋˜์š”.

  • ํ•จ์ˆ˜ ํ—ค๋”

์งง์€ ํ•จ์ˆ˜๋Š” ๊ธด ์„ค๋ช…์ด ํ•„์š” ์—†์–ด์š”. ์งง๊ณ  ํ•œ ๊ฐ€์ง€๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ์ด๋ฆ„์„ ์ž˜ ๋ถ™์ธ ํ•จ์ˆ˜๊ฐ€ ์ฃผ์„์œผ๋กœ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•œ ํ•จ์ˆ˜๋ณด๋‹ค ๋” ์ข‹์•„์š”.

  • ๋น„๊ณต๊ฐœ ์ฝ”๋“œ์—์„œ Javadocs

๊ณต๊ฐœ API๋Š” Javadocs๊ฐ€ ์œ ์šฉํ•ด์š”. ํ•˜์ง€๋งŒ ๊ณต๊ฐœํ•˜์ง€ ์•Š์„ ์ฝ”๋“œ๋ผ๋ฉด Javadocs๊ฐ€ ์“ธ๋ชจ๊ฐ€ ์—†์–ด์š”. ์˜คํžˆ๋ ค Javadocs ์ฃผ์„์ด ์š”๊ตฌํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ๋งŒ ์‚ฐ๋งŒํ•ด์ ธ์š”.

  • ์˜ˆ์ œ

์•„๋ž˜ ์ฝ”๋“œ๋Š” ์ผ„ํŠธ ๋ฒก์ด ํ•™์ƒ๋“ค ์•ž์—์„œ ๋ฉ‹์ง„ ํ˜•ํƒœ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ์—์š”.

/** * ์ด ํด๋ž˜์Šค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ์ตœ๋Œ€ ๊ฐ’๊นŒ์ง€ ์†Œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์‚ฌ์šฉ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ * ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋‹ค. * <p> * ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค: ๊ธฐ์›์ „ 276๋…„์— ๋ฆฌ๋น„์•„ ํ‚ค๋ ˆ๋„ค์—์„œ ์ถœ์ƒ ... * ์„ค๋ช… ... * <p> * ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ƒ๋‹นํžˆ ๋‹จ์ˆœํ•˜๋‹ค. 2์—์„œ ์‹œ์ž‘ํ•˜๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด์„ ๋Œ€์ƒ์œผ๋กœ * 2์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•œ๋‹ค. ๋‹ค์Œ์œผ๋กœ ๋‚จ์€ ์ •์ˆ˜๋ฅผ ์ฐพ์•„ ์ด ์ •์ˆ˜์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์šด๋‹ค. * ์ตœ๋Œ€ ๊ฐ’์˜ ์ œ๊ณฑ๊ทผ์ด ๋  ๋•Œ๊นŒ์ง€ ์ด๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค. *  * @author Alphonse * @version 13 Feb 2002 atp * */public class GeneratePrimes {        /**     * @param maxValue๋Š” ์†Œ์ˆ˜๋ฅผ ์ฐพ์•„๋‚ผ ์ตœ๋Œ€ ๊ฐ’     * @return int[]     */    public static int[] generatePrimes(int maxValue) {        if(maxValue >= 2) { // ์œ ์ผํ•˜๊ฒŒ ์œ ํšจํ•œ ๊ฒฝ์šฐ            // ์„ ์–ธ            int s = maxValue + 1; // ๋ฐฐ์—ด ํฌ๊ธฐ            boolean[] f = new boolean[s];            int i;                        // ๋ฐฐ์—ด์„ ์ฐธ์œผ๋กœ ์ดˆ๊ธฐํ™”            for(i=0; i<s; i++) {                f[i] = true;            }                        // ์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์•Œ๋ ค์ง„ ์ˆซ์ž๋ฅผ ์ œ๊ฑฐ            f[0] = f[1] = false;                        // ์ฒด            int j;            for(i=2; i<Math.sqrt(s)+1; i++) {                if(f[i]) {  // i๊ฐ€ ๋‚จ์•„์žˆ๋Š” ์ˆซ์ž๋ผ๋ฉด ์ด ์ˆซ์ž์˜ ๋ฐฐ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.                    for(j=i*2; j<s; j+=i) {                        f[j] = false;   // ๋ฐฐ์ˆ˜๋Š” ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.                    }                }            }                        // ์†Œ์ˆ˜ ๊ฐœ์ˆ˜๋Š”?            int count = 0;            for(i=0; i<s; i++) {                if(f[i]) {                    count ++;   // ์นด์šดํŠธ ์ฆ๊ฐ€                }            }                        int[] primes = new int[count];                        // ์†Œ์ˆ˜๋ฅผ ๊ฒฐ๊ณผ ๋ฐฐ์—ด๋กœ ์ด๋™ํ•œ๋‹ค.            for(i=0, j=0; i<s; i++) {                if(f[i]) {  // ์†Œ์ˆ˜์ผ ๊ฒฝ์šฐ                    primes[j++] = i;                }            }                        return primes;  // ์†Œ์ˆ˜ ๋ฐ˜ํ™˜        } else {    // maxValue < 2            return new int[0];  // ์ž…๋ ฅ์ด ์ž˜๋ชป๋˜์–ด ๋น„์–ด ์žˆ๋Š” ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.        }    }}

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ๋ฆฌํŒฉํ„ฐ๋งํ•œ ๊ฒฐ๊ณผ์—์š”. ์ฃผ์„์ด ์ƒ๋‹นํžˆ ์ค„์–ด๋“  ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์—์š”. ์ฃผ์„์ด 2๊ฐœ๋ฐ–์— ์—†๋„ค์š”.

/** * ์ด ํด๋ž˜์Šค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ์ตœ๋Œ€ ๊ฐ’๊นŒ์ง€ ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค. * ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋‹ค. * 2์—์„œ ์‹œ์ž‘ํ•˜๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด์„ ๋Œ€์ƒ์œผ๋กœ ์ž‘์—…ํ•œ๋‹ค. * ์ฒ˜์Œ์œผ๋กœ ๋‚จ์•„ ์žˆ๋Š” ์ •์ˆ˜๋ฅผ ์ฐพ์•„ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•œ๋‹ค. * ๋ฐฐ์—ด์— ๋” ์ด์ƒ ๋ฐฐ์ˆ˜๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค. */public class PrimeGenerator {    private static boolean[] crossedOut;    private static int[] result;    public static int[] generatePrimes(int maxValue) {        if(maxValue < 2) {            return new int[0];        } else {            uncrossIntegersUpTo(maxValue);            crossOutMultiples();            putUncrossedIntegersIntoResult();            return result;        }    }    private static void uncrossIntegersUpTo(int maxValue) {        crossedOut = new boolean[maxValue + 1];        for(int i=2; i<crossedOut.length; i++) {            crossedOut[i] = false;        }    }    private static void crossOutMultiples() {        int limit = determineIterationLimit();        for(int i=2; i<=limit; i++) {            if(notCrossed(i)) {                crossOutMultiplesOf(i);            }        }    }    private static int determineIterationLimit() {                // ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐฐ์ˆ˜๋Š” ๋ฐฐ์—ด ํฌ๊ธฐ์˜ ์ œ๊ณฑ๊ทผ๋ณด๋‹ค ์ž‘์€ ์†Œ์ˆ˜์˜ ์ธ์ˆ˜๋‹ค.        // ๋”ฐ๋ผ์„œ ์ด ์ œ๊ณฑ๊ทผ๋ณด๋‹ค ๋” ํฐ ์ˆซ์ž์˜ ๋ฐฐ์ˆ˜๋Š” ์ œ๊ฑฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.        double iterationLimit = Math.sqrt(crossedOut.length);        return (int)iterationLimit;    }    private static void crossOutMultiplesOf(int i) {        for(int multiple = i*2; multiple<crossedOut.length; multiple += i) {            crossedOut[multiple] = true;        }    }    private static boolean notCrossed(int i) {        return crossedOut[i] == false;    }    private static void putUncrossedIntegersIntoResult() {        result = new int[numberOfUncrossedIntegers()];        for(int j=0, i=2; i<crossedOut.length; i++) {            if(notCrossed(i)) {                result[j++] = i;            }        }    }    private static int numberOfUncrossedIntegers() {        int count = 0;        for(int i=2; i<crossedOut.length; i++) {            if(notCrossed(i)) {                count ++;            }        }        return count;    }}

์œ„ ์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋ง์— ๋Œ€ํ•ด์„œ ์ €์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ด์š”.

  1. ์ฒซ ๋ฒˆ์งธ ์ฃผ์„์ด generatePrimes ํ•จ์ˆ˜ ์ž์ฒด์™€ ํก์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต์ด๋ผ๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฃผ์„์ด ์žˆ์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๋‚จ๊ฒผ๋‹ค.

  2. ๋‘ ๋ฒˆ์งธ ์ฃผ์„์€ ํ™•์‹คํžˆ ํ•„์š”ํ•˜๋‹ค. ๋ฃจํ”„ ํ•œ๊ณ„๊ฐ’์œผ๋กœ ์ œ๊ณฑ๊ทผ์„ ์‚ฌ์šฉํ•œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•œ๋‹ค. ๋‚˜๋กœ์„œ๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์กฐ์ •ํ•ด ์ด์œ ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ ์ œ๊ณฑ๊ทผ์˜ ์‚ฌ์šฉ์€ ๋‚˜๋งŒ์˜ ์ƒ๊ฐ์ผ์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์ œ๊ณฑ๊ทผ๊นŒ์ง€๋งŒ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉด ์ •๋ง๋กœ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ• ๊นŒ? ์ œ๊ณฑ๊ทผ ๊ณ„์‚ฐ์— ์˜คํžˆ๋ ค ์‹œ๊ฐ„์ด ๋” ๋“ค์ง€ ์•Š์„๊นŒ?

4์žฅ ๋งˆ๋ฌด๋ฆฌ

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

5์žฅ. ํ˜•์‹ ๋งž์ถ”๊ธฐ

๋šœ๊ป‘์„ ์—ด์—ˆ์„ ๋•Œ ๋…์ž๋“ค์ด ์ฝ”๋“œ๊ฐ€ ๊น”๋”, ์ผ๊ด€, ๊ผผ๊ผผํ•˜๋‹ค๊ณ  ๊ฐํƒ„ํ•˜๊ณ , ์งˆ์„œ ์ •์—ฐํ•˜๋‹ค๊ณ  ํƒ„๋ณตํ•˜๋ฉด ์ข‹๊ฒ ์ฃ ? ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“ˆ์„ ์ฝ์œผ๋ฉฐ ๋‘ ๋ˆˆ์ด ํœ˜๋‘ฅ๊ทธ๋ž˜ ๋†€๋ผ๊ณ  ์ „๋ฌธ๊ฐ€๊ฐ€ ์งฐ๋‹ค๋Š” ์ธ์ƒ์„ ์‹ฌ์–ด์ฃผ๋ฉด ์ข‹์„๊ฑฐ์—์š”. ๋ฐ˜๋Œ€๋กœ ์ˆ  ์ทจํ•œ ์‚ฌ๋žŒ์ด ์ฝ”๋“œ๋ฅผ ์ง ๊ฑฐ์ฒ˜๋Ÿผ ์–ด์ˆ˜์„ ํ•ด ๋ณด์ด๋ฉด ๋…์ž๋“ค์€ ํ”„๋กœ์ ํŠธ์˜ ๋‹ค๋ฅธ ์ธก๋ฉด๋“ค๋„ ๋ฌด์„ฑ์˜ํ•œ ํƒœ๋„๋กœ ์ฒ˜๋ฆฌํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ• ๊ฑฐ์—์š”.

์šฐ๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ(์ „๋ฌธ๊ฐ€!)์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜•์‹์„ ๊น”๋”ํ•˜๊ฒŒ ๋งž์ถฐ ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ•ด์š”. ๊ทธ๋ž˜์„œ ์ฝ”๋“œ ํ˜•์‹์„ ๋งž์ถ”๊ธฐ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๊ทœ์น™์„ ์ •ํ•˜๊ณ  ๊ทธ ๊ทœ์น™์„ ์ฐฉ์‹คํžˆ ๋”ฐ๋ผ์•ผํ•ด์š”.

ํ˜•์‹์„ ๋งž์ถ”๋Š” ๋ชฉ์ 

์ฝ”๋“œ ํ˜•์‹์€ ์ค‘์š”ํ•ด์š”! '๋Œ์•„๊ฐ€๋Š” '์ฝ”๋“œ'๊ฐ€ ๊ฐœ๋ฐœ์ž์˜ ์ผ์ฐจ์ ์ธ ์˜๋ฌด๋ผ ์—ฌ๊ธธ ์ˆ˜ ๋„ ์žˆ์ง€๋งŒ, ์ €์ž๋Š” ์˜์‚ฌ์†Œํ†ต์ด ์ „๋ฌธ ๊ฐœ๋ฐœ์ž์˜ ์ผ์ฐจ์ ์ธ ์˜๋ฌด๋ผ ์ƒ๊ฐํ•ด์š”. ๊ทธ๋ฆฌ๊ณ  ์˜์‚ฌ์†Œํ†ต์˜ ์ผํ™˜์œผ๋กœ ์ฝ”๋“œ ํ˜•์‹์ด ์žˆ์–ด์š”. ์ฝ”๋“œ๋Š” ๊ณ„์† ๋ฐ”๋€Œ๋”๋ผ๋„ ๊ฐœ๋ฐœ์ž์˜ ์Šคํƒ€์ผ๊ณผ ๊ทœ์œจ์€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ณ  ๊ฐ€๋…์„ฑ์— ์˜ํ–ฅ์„ ์ค„ ๋ฟ๋งŒ์•„๋‹ˆ๋ผ, ์œ ์ง€ ๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ๊นŒ์ง€ ์˜ํ–ฅ์„ ์ค˜์š”.

์„ธ๋กœ ํ˜•์‹ ๋งž์ถ”๊ธฐ

์ ์ ˆํ•œ ํ–‰ ๊ธธ์ด๋Š” ๋ช‡์ค„์ด ์ ๋‹ฌํ• ๊นŒ์š”? ์ €์ž๊ฐ€ ์˜›๋‚ ์— ์กฐ์‚ฌํ•ด๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค๊ณ  ํ•ด์š”.

image.webp

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

์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์„ธ๋กœ ํ˜•์‹์„ ๋งž์ถ”๋Š” ๋ฐฉ๋ฒ•๋“ค์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์”ฉ ์†Œ๊ฐœํ• ๊ฒŒ์š”.

  • ์‹ ๋ฌธ ๊ธฐ์‚ฌ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋ผ

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

  • ๊ฐœ๋…์€ ๋นˆ ํ–‰์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ผ

๊ฑฐ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์ขŒ์—์„œ ์šฐ๋กœ, ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ์–ด์š”. ๊ฐ ํ–‰์€ ์ˆ˜์‹์ด๋‚˜ ์ ˆ์„ ๋‚˜ํƒ€๋‚ด๊ณ , ์ผ๋ จ์˜ ํ–‰ ๋ฌถ์Œ์€ ํ•˜๋‚˜์˜ ์ƒ๊ฐ์„ ํ‘œํ˜„ํ•ด์š”. ๊ทธ๋ฆฌ๊ณ  ์ƒ๊ฐ ์‚ฌ์ด๋Š” ๋นˆ ํ–‰์„ ๋„ฃ์–ด ๋ถ„๋ฆฌํ•ด์•ผ ํ•ด์š”.

package fitnesse.wikitext.widgets;import java.util.regex.*;public class BoldWidget extends ParentWidget {    public static final String REGEXP = "'''.+?'''";    private static final Pattern pattern = Pattern.compile("'''(.+?)'''",    Pattern.MULTILINE + Pattern.DOTALL    );    public BoldWidget(ParentWidget parent, String text) throws Exception {        super(parent);        Matcher match = pattern.matcher(text);        match.find();        addChildWidgets(match.group(1));    }     public String render() throws Exception {         StringBuffer html = new StringBuffer("<b>");         html.append(childHtml()).append("</b>");         return html.toString();    } }

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ํŒจํ‚ค์ง€ ์„ ์–ธ๋ถ€, import ๋ฌธ, ๊ฐ ํ•จ์ˆ˜ ์‚ฌ์ด์— ๋นˆ ํ–‰์ด ๋“ค์–ด๊ฐ€์š”. ๊ฐ„๋‹จํ•œ ๊ทœ์น™์ด์ง€๋งŒ ์„ธ๋กœ ๋ ˆ์ด์•„์›ƒ์— ๋งŽ์€ ์˜ํ–ฅ์„ ์ค˜์š”. ๋นˆ ํ–‰์€ ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์‹œ๊ฐ์  ๋‹จ์„œ์—์š”. ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ๋ฅผ ์ฝ์–ด ๋‚ด๋ ค๊ฐ€๋‹ค ๋ณด๋ฉด ๋นˆ ํ–‰ ๋ฐ”๋กœ ๋‹ค์Œ ์ค„์— ๋ˆˆ๊ธธ์ด ๋ฉˆ์ถ”์ฃ . ๋งŒ์•ฝ ์œ„ ์ฝ”๋“œ๋ฅผ ๋นˆ ํ–‰ ์—†์ด ๋ถ™์—ฌ ๋ณด์„ธ์š”. ์•”ํ˜ธ๋ฌธ ์ฒ˜๋Ÿผ ๋ณด์ผ๊ฑฐ์—์š”.

  • ์„ธ๋กœ ๋ฐ€์ง‘๋„

์ค„๋ฐ”๊ฟˆ์ด ๊ฐœ๋…์„ ๋ถ€๋ฆฌํ•œ๋‹ค๋ฉด ์„ธ๋กœ ๋ฐ€์ง‘๋„๋Š” ์—ฐ๊ด€์„ฑ์„ ์˜๋ฏธํ•ด์š”. ์„œ๋กœ ๋ฐ€์ ‘ํ•œ ์ฝ”๋“œ๋Š” ์„ธ๋กœ๋กœ ๊ฐ€๊นŒ์ด ๋†“์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•ด์š”.

public class ReporterConfig {    /**    * The class name of the reporter listener    */    private String m_className;    /**    * The properties of the reporter listener    */    private List<Property> m_properties = new ArrayList<Property>();    public void addProperty(Property property) {        m_properties.add(property);    }}

์œ„ ์ฝ”๋“œ์™€ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•ด๋ด์š”. ์œ„ ์ฝ”๋“œ๋Š” ์˜๋ฏธ ์—†๋Š” ์ฃผ์„์œผ๋กœ ์ฝ”๋“œ ํ–‰์„ ๋–จ์–ด๋œจ๋ ธ๊ณ  ์•„๋ž˜ํ–‰์€ ์ฃผ์„์ด ์—†์–ด์š”. ์•„๋งˆ ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ๋” ์‰ฌ์šธ๊ฑฐ์—์š”. ๋จธ๋ฆฌ๋‚˜ ๋ˆˆ์„ ์›€์ง์ผ ํ•„์š”๋„ ์—†๊ณ , ๋ณ€์ˆ˜ 2๊ฐœ์™€ ๋ฉ”์„œ๋“œ 1๊ฐœ๋ผ๋Š” ์‚ฌ์‹ค์ด ๋ฐ”๋กœ ๋ณด์—ฌ์š”.

public class ReporterConfig {    private String m_className;    private List<Property> m_properties = new ArrayList<Property>();    public void addProperty(Property property) {        m_properties.add(property);    }}
  • ์ˆ˜์ง ๊ฑฐ๋ฆฌ

ํ•จ์ˆ˜ ์—ฐ๊ด€ ๊ด€๊ณ„์™€ ๋™์ž‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋ ค๊ณ  ์ด ํ•จ์ˆ˜์—์„œ ์ € ํ•จ์ˆ˜๋กœ ์˜ค๊ฐ€๋ฉฐ ์†Œ์Šค ํŒŒ์ผ์„ ์œ„์•„๋ž˜๋กœ ๋’ค์ง€๊ณ  ๋บ‘๋บ‘์ด๋ฅผ ๋Œ์•˜์œผ๋‚˜ ๋ฏธ๋กœ ๊ฐ™์€ ์ฝ”๋“œ ๋•Œ๋ฌธ์— ํ˜ผ๋ž€๋งŒ ๊ฐ€์ค‘๋œ ๊ฒฝํ—˜์ด ์žˆ๋‚˜์š”? (์ €์š”์ €์š” React 19 ํŒŒ์•…ํ•˜๋ คํ•˜๋Š”๋ฐ ๋„ˆ๋ฌด ๋ฏธ๋กœ๊ฐ™์•˜์–ด์š”.) ๊ฒฐ์ฝ” ๋‹ฌ๊ฐ‘์ง€ ์•Š์€ ๊ฒฝํ—˜์ด์—์š”. ์‹œ์Šคํ…œ์„ ์ดํ•ดํ•˜๊ณ  ์‹ถ์–ด๋„ ์ด ์กฐ๊ฐ ์ € ์กฐ๊ฐ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์ฐพ๊ณ  ๊ธฐ์–ตํ•˜๋А๋ผ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ๋‹ค ์จ์š”.

์„œ๋กœ ๋ฐ€์ ‘ํ•œ ๊ฐœ๋…์€ ์„ธ๋กœ๋กœ ๊ฐ€๊นŒ์ด ๋‘ฌ์•ผํ•ด์š”. ๋ฌผ๋ก  ๋‘ ๊ฐœ๋…์ด ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์†ํ•˜๋ฉด ๊ทœ์น™์ด ํ†ตํ•˜์ง€ ์•Š์•„์š”. ํ•˜์ง€๋งŒ ํƒ€๋‹นํ•œ ๊ทผ๊ฑฐ๊ฐ€ ์—†๋‹ค๋ฉด ์„œ๋กœ ๋ฐ€์ ‘ํ•œ ๊ฐœ๋…์€ ํ•œ ํŒŒ์ผ์— ์žˆ๋Š”๊ฒŒ ์ข‹์•„์š”. ์ด๊ฒŒ protected ๋ณ€์ˆ˜๋ฅผ ํ”ผํ•ด์•ผํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์—์š”(์ž๋ฐ”์˜ ์ ‘๊ทผ ์ œ์–ด์ž protected๋Š” ์ž์‹ ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผํ•˜๋‹ˆ๊นŒ ์ฝ”๋“œ ํŒŒ์•… ์–ด์ง€๋Ÿฌ์›Œ์ง! ์ธ์ •? ใ…‡ ์ธ์ •).

์ฆ‰, ๊ฐ™์€ ํŒŒ์ผ์— ์†ํ•  ์ •๋„๋กœ ๋ฐ€์ ‘ํ•œ ๋‘ ๊ฐœ๋…์€ ์„ธ๋กœ ๊ฑฐ๋ฆฌ๋กœ ์—ฐ๊ด€์„ฑ์„ ํ‘œํ˜„ํ•ด์š”. ์—ฌ๊ธฐ์„œ "์—ฐ๊ด€์„ฑ"์ด๋ž€ "ํ•œ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋‹ค๋ฅธ ๊ฐœ๋…์ด ์ค‘์š”ํ•œ ์ •๋„"์—์š”

์ˆ˜์ง ๊ฑฐ๋ฆฌ ์˜ˆ์‹œ

  • ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ๋˜๋Š” ์œ„์น˜์— ์ตœ๋Œ€ํ•œ ๊ฐ€๊น๊ฒŒ ์ •์˜

  • ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๊ธฐ ์ง์ „์— ์„ ์–ธ

  • ๋น„๊ณต๊ฐœ ํ•จ์ˆ˜๋Š” ์ฒ˜์Œ ํ˜ธ์ถœํ•œ ์งํ›„์— ์ •์˜ (์กฐ๊ธˆ๋งŒ ๋‚ด๋ ค๊ฐ€๋ฉด ๋ณด์ด๊ฒŒ), ๊ฐ€๋Šฅํ•˜๋ฉด ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋จผ์ € ๋ฐฐ์น˜ํ•˜์ž.

  • ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” ๋งจ ์ฒ˜์Œ์—(C++์—์„œ๋Š” ๋ณดํ†ต ๋งˆ์ง€๋ง‰์—) ์„ ์–ธํ•œ๋‹ค.(์ž˜ ์•Œ๋ ค์ง„ ์œ„์น˜์— ๋ชจ์œผ๋Š”๊ฒŒ ์ค‘์š”)

  • ์ƒ์ˆ˜๋Š” ์ €์ฐจ์› ํ•จ์ˆ˜์— ๋ฌปํžˆ์ง€ ๋งˆ๋ผ(์ƒ์ˆ˜๋Š” ๊ณ ์ฐจ์› ํ•จ์ˆ˜์— ๋‘๊ณ , ์ €์ฐจ์› ํ•จ์ˆ˜์—๋Š” ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ๋ผ)

  • ๊ฐœ๋…์  ์œ ์‚ฌ์„ฑ์ด ๋†’์€ ์ฝ”๋“œ๋Š” ๊ฐ€๊นŒ์ด ๋ฐฐ์น˜ํ•œ๋‹ค. (A์ฝ”๋“œ๊ฐ€ B์ฝ”๋“œ๋ฅผ ์“ฐ๋ฉด ์„œ๋กœ ์ข…์†๋˜๊ธฐ ๋•Œ๋ฌธ์— ์นœํ™”๋„๊ฐ€ ๋†’๋‹ค.)

  • ์„ธ๋กœ ์ˆœ์„œ

์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ข…์†์„ฑ์€ ์•„๋ž˜ ๋ฐฉํ–ฅ์œผ๋กœ ์œ ์ง€ํ•ด์š”. ์ฆ‰, ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ณด๋‹ค ๋‚˜์ค‘์— ๋ฐฐ์น˜๋˜์š”(C, C++์€ ๋จผ์ € ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋งŽ์Œ). ๊ทธ๋Ÿฌ๋ฉด ์†Œ์Šค ์ฝ”๋“œ ๋ชจ๋“ˆ์ด ๊ณ ์ฐจ์›์—์„œ ์ €์ฐจ์›์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‚ด๋ ค๊ฐ€์š”. ๋งˆ์น˜ ์‹ ๋ฌธ ๊ธฐ์‚ฌ์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…์„ ๊ฐ€์žฅ ๋จผ์ € ํ‘œํ˜„ํ•˜๊ณ  ์„ธ์„ธํ•œ ๋‚ด์šฉ์„ ๋งˆ์ง€๋ง‰์— ํ‘œํ˜„ํ•˜๋“ฏ์ด์š”.

๊ฐ€๋กœ ํ˜•์‹ ๋งž์ถ”๊ธฐ

ํ•œ ํ–‰์€ ๊ฐ€๋กœ๋กœ ์–ผ๋งˆ๋‚˜ ๊ธธ์–ด์•ผ ์ ๋‹นํ• ๊นŒ์š”? ์•ž์—์„œ์™€ ๊ฐ™์ด ๋ถ„์„ํ•ด๋ด์š”.

image.webp

์œ„ ๊ทธ๋ฆผ์€ 7๊ฐœ ์œ ๋ช… ํ”„๋กœ์ ํŠธ์˜ ์ž๋ฐ” ๋ผ์ธ์˜ ๊ฐ€๋กœ ๊ธธ์ด ๋ถ„ํฌ๋„์—์š”.๊ฒฐ๊ณผ๊ฐ€ ์ƒ๋‹นํžˆ ๊ทœ์น™์ ์ด์—์š”. 20-60์ž ์‚ฌ์ด์ธ ํ–‰์ด ์ด ํ–‰์ˆ˜์˜ 40%์ •๋„ ๋˜์š”. 10์ž ๋ฏธ๋งŒ์€ 30%์ •๋„๋กœ ๋ณด์ด๊ณ ์š”. ์ฆ 60์ž ์ดํ•˜๊ฐ€ 70%๊ฐ€๊นŒ์ด ์ฐจ์ง€ํ•˜๋„ค์š”. 80์ž ์ดํ›„๋Š” 10%์ •๋„๊ฐ€ ๋˜๊ณ ์š”. ์š”์ฆ˜์€ ๋ชจ๋‹ˆํ„ฐ๋„ ํฌ๊ณ  ํ•ด์„œ ์ข€๋” ๋งŽ์•„๋„ ๋ ๊ฒƒ ๊ฐ™์•„์š”. ์ €์ž๋Š” 100์ž~120์ž ์ •๋„๊นŒ์ง€ ์ œํ•œ ๋‘๋Š”๊ฒŒ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ๋งํ•ด์š”.

์ด์ œ ๊ฐ€๋กœ ํ˜•์‹ ๋งž์ถ”๋Š” ๋ฐฉ๋ฒ•๋“ค์— ๋Œ€ํ•ด์„œ ์†Œ๊ฐœํ• ๊ฒŒ์š”.

  • ๊ฐ€๋กœ ๊ณต๋ฐฑ๊ณผ ๋ฐ€์ง‘๋„

๊ฐ€๋กœ๋กœ๋Š” ๊ณต๋ฐฑ์„ ์‚ฌ์šฉํ•ด ๋ฐ€์ ‘ํ•œ ๊ฐœ๋…๊ณผ ๋А์Šจํ•œ ๊ฐœ๋…์„ ํ‘œํ˜„ํ•ด์š”.

private void measureLine(String line) {    lineCount++;    int lineSize = line.length();    totalChars += lineSize;    lineWidthHistogram.addLine(lineSize, lineCount);    recordWidestLine(lineSize);}

์œ„ ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ํ• ๋‹น ์—ฐ์‚ฐ์ž๋ฅผ ๊ฐ•์กฐํ•˜๋ ค๊ณ  ์•ž๋’ค์— ๊ณต๋ฐฑ์„ ์คฌ์–ด์š”. ํ• ๋‹น ์—ฐ์‚ฐ์ž๋Š” ์™ผ์ชฝ ์š”์†Œ์™€ ์˜ค๋ฅธ์ชฝ ์š”์†Œ๊ฐ€ ํ™•์‹คํžˆ ๋‚˜๋‰˜์–ด์š”. ๊ทธ๋ž˜์„œ ๊ณต๋ฐฑ์„ ๋„ฃ์œผ๋ฉด ๋” ๋ถ„๋ช…ํ•ด์ ธ์š”. ๋ฐ˜๋ฉด์— ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ์ด์–ด์ง€๋Š” ๊ด„ํ˜ธ ์‚ฌ์ด์—๋Š” ๊ณต๋ฐฑ์ด ์—†์–ด์š”. ์™œ๋ƒํ•˜๋ฉด ๊ณต๋ฐฑ์„ ๋„ฃ์œผ๋ฉด ๋ณ„๊ฐœ๋กœ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด์—์š”. ๊ทธ๋ฆฌ๊ณ  ์ธ์ˆ˜ ์‚ฌ์ด์˜ ์‰ผํ‘œ ๋‹ค์Œ์—๋Š” ๊ณต๋ฐฑ์„ ์ค˜์„œ ์ธ์ˆ˜๊ฐ€ ๋ณ„๊ฐœ๋ผ๋Š” ์‚ฌ์‹ค์„ ๊ฐ•์กฐํ•ด์š”. (์š”์ฆ˜์€ lint, prettier๊ฐ™์€ ๊ฑธ๋กœ ์ž๋™์œผ๋กœ ๋‹ค๋œ๋‹ค. ๊ทœ์น™ ์„ค์ •๋งŒ ์ž˜ ํ•˜๋ฉด ๋œ๋‹ค.)

public class Quadratic {    public static double root1(double a, double b, double c) {        double determinant = determinant(a, b, c);        return (-b + Math.sqrt(determinant)) / (2*a);    }    public static double root2(int a, int b, int c) {        double determinant = determinant(a, b, c);        return (-b - Math.sqrt(determinant)) / (2*a);    }    private static double determinant(double a, double b, double c) {        return b*b - 4*a*c;    }}

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ˆ˜์‹ ์ฝ๊ธฐ๊ฐ€ ํŽธํ•ด์š”. ์Šน์ˆ˜ ์‚ฌ์ด๋Š” ๊ณต๋ฐฑ์ด ์—†์–ด์š”. ๊ณฑ์…ˆ์€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’๊ธฐ ๋•Œ๋ฌธ์ด์—์š”. ํ•˜์ง€๋งŒ ํ•ญ ์‚ฌ์ด์—๋Š” ๊ณต๋ฐฑ์ด ๋“ค์–ด๊ฐ€์š”. ๋ง์…ˆ๊ณผ ๋บ„์…ˆ์€ ๊ณฑ์…ˆ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.

  • ๊ฐ€๋กœ์ •๋ ฌ

์ €์ž๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ์‹œ์ ˆ ํŠน์ • ๊ตฌ์กฐ๋ฅผ ๊ฐ•์กฐํ•˜๊ณ ์ž ๊ฐ€๋กœ ์ •๋ ฌ์„ ์‚ฌ์šฉํ–ˆ๋ฐ์š”. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ง์ด์ฃ 

public class FitNesseExpediter implements ResponseSender{    private   Socket          socket;    private   InputStream     input;    private   OutputStream    output;    private   Request         request;    private   Response        response;    private   FitNesseContext context;    protected long            requestParsingTimeLimit;    private   long            requestProgress;    private   long            requestParsingDeadline;    private   boolean         hasError;    public FitNesseExpediter(Socket s,     FitNesseContext context) throws Exception    {        this.context =            context;        socket =                  s;        input =                   s.getInputStream();        output =                  s.getOutputStream();        requestParsingTimeLimit = 10000;    }

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

๋งŒ์•ฝ ์ •๋ ฌ์ด ํ•„์š”ํ•  ์ •๋„๋กœ ๊ธธ๋‹ค๋ฉด ๋ฌธ์ œ๋Š” ๋ชฉ๋ก์˜ ๊ธธ์ด์ง€ ์ •๋ ฌ ๋ถ€์กฑ์ด ์•„๋‹ˆ์—์š”. ์ฝ”๋“œ ์„ ์–ธ๋ถ€๊ฐ€ ๊ธธ๋‹ค๋ฉด ํด๋ž˜์Šค๋ฅผ ์ชผ๊ฐœ์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์š”.

  • ๋“ค์—ฌ์“ฐ๊ธฐ

๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ํž˜๋“ค์–ด์ ธ์š”. ์ด๊ฑด ๊ตณ์ด ์„ค๋ช… ์•ˆํ•ด๋„ ์•Œ ๊ฒƒ ๊ฐ™์•„์„œ ๋„˜์–ด๊ฐˆ๊ฒŒ์š”. if๋ฌธ ์—ฌ๋Ÿฌ๊ฐœ์ธ๋ฐ ๋ชจ๋‘ ํ•œ์ค„์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด์š”. ์–ผ๋งˆ๋‚˜ ๋”์ฐํ•ด์š”. ์ €์ž๋Š” ๊ฐ€๋” 1์ค„๋กœ๋„ ๊ฐ€๋Šฅํ•œ ์งง์€ ์ฝ”๋“œ๋Š” ๋“ค์—ฌ์“ฐ๊ธฐ ์•ˆ์“ฐ๋Š” ์œ ํ˜น์— ๋น ์ง„๋‹ค๊ณ  ํ•ด์š”. ๊ทธ์น˜๋งŒ ๊ฒฐ๊ตญ ์›์ ์œผ๋กœ ๋Œ์•„๊ฐ€ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ํ•œ๋‹ค๊ณ  ํ•ด์š”.

ํŒ€ ๊ทœ์น™

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

๋ฐฅ ์•„์ €์”จ์˜ ํ˜•์‹ ๊ทœ์น™

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋ฐฅ ์•„์ €์”จ์˜ ํ˜•์‹์„ ์ž˜ ๋‚˜ํƒ€๋‚ด๋Š” ํ‘œ์ค€ ๋ฌธ์„œ ์ˆ˜์ค€์ด๋ผ๊ณ  ์ž์‹ ํ•˜๋Š” ์ฝ”๋“œ์—์š”.

public class CodeAnalyzer implements JavaFileAnalysis {     private int lineCount;    private int maxLineWidth;    private int widestLineNumber;    private LineWidthHistogram lineWidthHistogram;     private int totalChars;    public CodeAnalyzer() {        lineWidthHistogram = new LineWidthHistogram();    }    public static List<File> findJavaFiles(File parentDirectory) {         List<File> files = new ArrayList<File>();         findJavaFiles(parentDirectory, files);        return files;    }    private static void findJavaFiles(File parentDirectory, List<File> files) {        for (File file : parentDirectory.listFiles()) {            if (file.getName().endsWith(".java"))                 files.add(file);            else if (file.isDirectory())                 findJavaFiles(file, files);        }     }    public void analyzeFile(File javaFile) throws Exception {         BufferedReader br = new BufferedReader(new FileReader(javaFile));         String line;        while ((line = br.readLine()) != null)            measureLine(line);     }    private void measureLine(String line) {         lineCount++;        int lineSize = line.length();        totalChars += lineSize;         lineWidthHistogram.addLine(lineSize, lineCount);        recordWidestLine(lineSize);    }    private void recordWidestLine(int lineSize) {         if (lineSize > maxLineWidth) {            maxLineWidth = lineSize;            widestLineNumber = lineCount;         }    }    public int getLineCount() {         return lineCount;    }    public int getMaxLineWidth() {         return maxLineWidth;    }    public int getWidestLineNumber() {         return widestLineNumber;    }    public LineWidthHistogram getLineWidthHistogram() {        return lineWidthHistogram;    }    public double getMeanLineWidth() {         return (double)totalChars/lineCount;    }    public int getMedianLineWidth() {        Integer[] sortedWidths = getSortedWidths();         int cumulativeLineCount = 0;        for (int width : sortedWidths) {            cumulativeLineCount += lineCountForWidth(width);             if (cumulativeLineCount > lineCount/2)                return width;        }        throw new Error("Cannot get here");     }    private int lineCountForWidth(int width) {        return lineWidthHistogram.getLinesforWidth(width).size();    }    private Integer[] getSortedWidths() {        Set<Integer> widths = lineWidthHistogram.getWidths();         Integer[] sortedWidths = (widths.toArray(new Integer[0]));         Arrays.sort(sortedWidths);        return sortedWidths;    } }

5์žฅ ๋งˆ๋ฌด๋ฆฌ

5์žฅ์—์„œ๋Š” ์ฝ”๋“œ ํ˜•์‹๋“ค์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•ด๋ดค์–ด์š”. ๊ทธ๋Ÿฐ๋ฐ 5์žฅ์˜ ํ˜•์‹๋“ค์€ ๋Œ€๋ถ€๋ถ„ Linter๋‚˜ Prettier๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด์„œ ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์„œ ์—„์ฒญ ๋งˆ์Œ์— ์™€๋‹ฟ์ง€๋Š” ์•Š์•˜์–ด์š”. ๊ทธ๋ž˜๋„ ๋‹น์—ฐํ•œ ๊ฒƒ๋“ค๋„ ํ•œ๋ฒˆ ๋” ์ฒดํฌํ•ด๋ณด๊ณ , ๊ณผ๊ฑฐ์—๋Š” ์–ด๋–ค์ง€ ์•Œ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜์–ด์š”. ์šฐ๋ฆฌ ๋ชจ๋‘ ํด๋ฆฐ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด ์•ž์œผ๋กœ ๊ณ„์† ๋…ธ๋ ฅํ•ด๊ฐ€์š”.