Skip to content

leehankyeol/android-code-style-guidelines-in-Korean

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

34 Commits
ย 
ย 

Repository files navigation

์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ผ์ธ

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

ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์ด ๊ทœ์น™์„ ๋”ฐ๋ฅด์ง€๋Š” ์•Š์ง€๋งŒ, ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋“ค์€ ์ด ๊ทœ์น™๋“ค์„ ๋”ฐ๋ฅผ ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•œ๋‹ค.

์ž๋ฐ” ์–ธ์–ด ๊ทœ์น™

์ž๋ฐ”์˜ ํ‘œ์ค€ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ฅด๋˜ ๋ช‡ ๊ฐ€์ง€ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

์ต์…‰์…˜(exception)์„ ๋ฌด์‹œํ•˜์ง€ ๋งˆ๋ผ

์ฝ”๋“œ๋ฅผ ์งœ๋‹ค ๋ณด๋ฉด ๋•Œ๋กœ๋Š” ์•„๋ž˜์˜ ์˜ˆ์ฒ˜๋Ÿผ ์ต์…‰์…˜์„ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜๊ณ  ์‹ถ์–ด์งˆ ๋•Œ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

void setServerPort(String value) {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) { }
}

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

๋ˆ„๊ตฌ๋“  ๋น„์–ด ์žˆ๋Š” ์บ์น˜catch ๊ตฌ๋ฌธ์„ ๋งŒ๋“ค ๋•Œ๋Š” ๋ญ”๊ฐ€ ์„ฌ๋œฉํ•œ ๊ธฐ๋ถ„์ด ๋“ค์–ด์•ผ ํ•œ๋‹ค. ๋ฌผ๋ก  ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์˜ณ์€ ๋•Œ๊ฐ€ ๋ถ„๋ช…ํžˆ ์žˆ์ง€๋งŒ, ์ ์–ด๋„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ƒ๊ฐํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ž๋ฐ”๋ฅผ ์งค ๋•Œ๋Š” ๊ทธ ์„ฌ๋œฉํ•œ ๊ธฐ๋ถ„์„ ๋ฌด์‹œํ•ด์„  ์•ˆ ๋œ๋‹ค. ์ œ์ž„์Šค ๊ณ ์Šฌ๋ง

ํ—ˆ์šฉํ•  ๋งŒํ•œ ๋Œ€์•ˆ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๋ชฉ๋ก์˜ ์œ„์— ์žˆ์„์ˆ˜๋ก ์„ ํ˜ธ๋„๊ฐ€ ๋†’์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

  • ์ต์…‰์…˜์„ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์˜ ์ฝœ๋Ÿฌ(caller)์— ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

     void setServerPort(String value) throws NumberFormatException {
         serverPort = Integer.parseInt(value);
     }
  • ์ถ”์ƒ(abstraction) ์ •๋„์— ๋งž๋Š” ์ƒˆ๋กœ์šด ์ต์…‰์…˜์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

     void setServerPort(String value) throws ConfigurationException {
         try {
             serverPort = Integer.parseInt(value);
         } catch (NumberFormatException e) {
             throw new ConfigurationException("Port " + value + " is not valid.");
         }
     }
  • ์บ์น˜ ๋ธ”๋ก ์•ˆ์—์„œ ์ ๋‹นํ•œ ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.

     /** Set port. If value is not a valid number, 80 is substituted. */
    
     void setServerPort(String value) {
         try {
             serverPort = Integer.parseInt(value);
         } catch (NumberFormatException e) {
             serverPort = 80;  // default port for server 
         }
     }
  • ์ต์…‰์…˜์„ ์บ์น˜ํ•œ ๋’ค ์ƒˆ๋กœ์šด ๋Ÿฐํƒ€์ž„์ต์…‰์…˜RuntimeException์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ์œ„ํ—˜ํ•œ ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ํ•ด๋‹น ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์˜ฌ๋ฐ”๋ฅธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ด ํฌ๋ž˜์‹œ(crash)๋ž€ ํ™•์‹ ์ด ์žˆ์„ ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๋ผ.

     /** Set port. If value is not a valid number, die. */
    
     void setServerPort(String value) {
         try {
             serverPort = Integer.parseInt(value);
         } catch (NumberFormatException e) {
             throw new RuntimeException("port " + value " is invalid, ", e);
         }
     }

    ์ปจ์ŠคํŠธ๋Ÿญํ„ฐ(constructor)์—๊ฒŒ ๋Ÿฐํƒ€์ž„์ต์…‰์…˜์ด ์ „ํ•ด์งˆ ๋•Œ ์›๋ž˜ ๋ฐœ์ƒํ•œ ์ต์…‰์…˜์ด ๊ฐ™์ด ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์— ์ฃผ๋ชฉํ•˜์ž. ์ž๋ฐ” 1.3 ๋ฏธ๋งŒ์˜ ๋ฒ„์ „์—์„œ ์ปดํŒŒ์ผ์„ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์›์ธ์ด ๋˜๋Š” ์ต์…‰์…˜์„ ์ฝ”๋“œ์—์„œ ์ œ์™ธํ•ด์•ผ ํ•œ๋‹ค.

  • ์ตœํ›„์˜ ๋ณด๋ฃจ: ์ต์…‰์…˜์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๋‹ค๋Š” ํ™•์‹ ์ด ๋“ ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•ด๋„ ์ข‹๋‹ค. ๋‹ค๋งŒ ํ•ฉ๋‹นํ•œ ์ด์œ ๋ฅผ ๊ผญ ์ฝ”๋ฉ˜ํŠธ๋กœ ๋‚จ๊ธฐ์ž.

     /** If value is not a valid number, original port number is used. */
     void setServerPort(String value) {
         try {
             serverPort = Integer.parseInt(value);
         } catch (NumberFormatException e) {
             // Method is documented to just ignore invalid user input.
             // serverPort will just be unchanged.
         }
     }

์ผ๋ฐ˜์  ์ต์…‰์…˜(generic exception)๋ฅผ ์บ์น˜ํ•˜์ง€ ๋งˆ๋ผ

์ข…์ข… ์ต์…‰์…˜์„ ์žก์•„๋‚ด๋Š” ๊ฒƒ์— ๊ฒŒ์„๋Ÿฌ์ ธ ์•„๋ž˜ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์งœ๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค.

try {
    someComplicatedIOFunction();        // may throw IOException 
    someComplicatedParsingFunction();   // may throw ParsingException 
    someComplicatedSecurityFunction();  // may throw SecurityException 
    // phew, made it all the way 
} catch (Exception e) {                 // I'll just catch all exceptions 
    handleError();                      // with one generic handler!
}

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ์•ˆ ๋œ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์— ์ผ๋ฐ˜์ ์ธ ์ต์…‰์…˜์ด๋‚˜ ์“ฐ๋กœ์–ด๋ธ”(throwable)์„ ์บ์น˜ํ•˜๋Š” ๊ฒƒ์€ ์ ์ ˆํ•˜์ง€ ๋ชปํ•œ ์„ ํƒ์ด๋‹ค. (preferably not Throwable, because it includes Error exceptions as well.) ๋งค์šฐ ์œ„ํ—˜ํ•œ ์ฝ”๋“œ๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด ํด๋ž˜์Šค์บ์ŠคํŠธ์ต์…‰์…˜ClassCastException ๊ฐ™์€ ๋Ÿฐํƒ€์ž„์ต์…‰์…˜RuntimeExceptions ๋“ฑ์˜ ์ „ํ˜€ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ์ต์…‰์…˜์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์˜ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์—์„œ์•ผ ์บ์น˜๋  ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์€ ์ฝ”๋“œ๊ฐ€ ๋‹ค์–‘ํ•œ ์‹คํŒจ ์ƒํ™ฉ์— ๋Œ€์ฒ˜ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š”๋ฐ, ์ด๋Š” ๋ˆ„๊ตฐ๊ฐ€ ๋‹น์‹ ์˜ ์ฝ”๋“œ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๊ณณ์— ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ์ต์…‰์…˜์„ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ ์ƒˆ๋กœ์šด ์—๋Ÿฌ๋ฅผ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ค„์•ผ ํ•œ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋‹น์‹ ์—๊ฒŒ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์–ด์จŒ๋“  ๊ทธ๋ ‡๊ฒŒ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์ต์…‰์…˜์„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

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

์ผ๋ฐ˜์  ์ต์…‰์…˜์„ ์บ์น˜ํ•˜๋Š” ๋Œ€์•ˆ๋“ค:

  • ํ•˜๋‚˜์˜ ํŠธ๋ผ์ดtry๋ฌธ ๋’ค์— ๊ฐ๊ฐ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์บ์น˜ ๋ธ”๋ก์„ ์ž‘์„ฑํ•œ๋‹ค. ๋ณด๊ธฐ์— ์–ด์ƒ‰ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ํ•œ ๋ฒˆ์— ๋ชจ๋“  ์ต์…‰์…˜์„ ์บ์น˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค. ์ด ๋•Œ ๊ฐ ์บ์น˜ ๋ธ”๋ก ์•ˆ์— ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์ž‘์„ฑํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์ž.

  • ์กฐ๋ฐ€ํ•˜๊ฒŒ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋” ๋งŽ์€ ํŠธ๋ผ์ด ๋ธ”๋ก์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋ง(refactoring)ํ•˜๋ผ. Split up the IO from the parsing, handle errors separately in each case.

  • ์ต์…‰์…˜์„ ๋‹ค์‹œ ์“ฐ๋กœ์šฐ(rethrow)ํ•˜๋ผ. ๋งŽ์€ ๊ฒฝ์šฐ ์–ด์ฐจํ”ผ ํ•ด๋‹น ๋‹จ๊ณ„์—์„œ ์ต์…‰์…˜์„ ์บ์น˜ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์˜ˆ์™ธ๋Š” ์šฐ๋ฆฌ์˜ ์นœ๊ตฌ์ž„์„ ๋ช…์‹ฌํ•˜์ž. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‹น์‹ ์ด ์ต์…‰์…˜์„ ์บ์น˜ํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค๊ณ  ๋ถˆ๋งŒ์„ ํ•˜๋ฉด ์ฐŒํ‘ธ๋ฆฌ์ง€ ๋ง๊ณ  ์›ƒ์–ด๋ผ. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹น์‹ ์˜ ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„ ๋ฌธ์ œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•ด์ฃผ๊ณ ์ž ํ•  ๋ฟ์ด๋‹ค.

ํŒŒ์ด๋„๋ผ์ด์ €(finalizer)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ

ํŒŒ์ด๋„๋ผ์ด์ €๋Š” ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰์…˜๋  ๋•Œ ์‹คํ–‰๋  ์ฝ”๋“œ๋ฅผ ์งœ๋‘๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค.

์žฅ์ : ํŠนํžˆ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ํฌํ•จํ•ด ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ๋ฅผ ํ•  ๋•Œ ํŽธ๋ฆฌํ•˜๋‹ค.

๋‹จ์ : ์–ธ์ œ ํŒŒ์ด๋„๋ผ์ด์ €๊ฐ€ ํ˜ธ์ถœ๋ ์ง€, ์‹ฌ์ง€์–ด ํŒŒ์ด๋„๋ผ์ด์ €๊ฐ€ ํ˜ธ์ถœ์ด ๋˜๋Š”์ง€ ์•ˆ ๋˜๋Š”์ง€๋„ ์ •ํ™•ํžˆ ์•Œ๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

๊ฒฐ๋ก : ํŒŒ์ด๋„๋ผ์ด์ €๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํŒŒ์ด๋„๋ผ์ด์ €๊ฐ€ ํ•  ์ผ์€ ์˜ฌ๋ฐ”๋ฅธ ์ต์…‰์…˜ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ • ํ•„์š”ํ•˜๋‹ค๋ฉด close() ๋ฉ”์†Œ๋“œ๋‚˜ ๊ทธ ๋น„์Šทํ•œ ๊ฒƒ์„ ์ •์˜ํ•˜๊ณ  ์ •ํ™•ํžˆ ์–ธ์ œ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋ฌธ์„œ๋กœ ์ž‘์„ฑํ•˜๋ผ. See InputStream for an example. In this case it is appropriate but not required to print a short log message from the finalizer, as long as it is not expected to flood the logs.

์ž„ํฌํŠธimport๋Š” ๋๊นŒ์ง€ ๋ช…์‹œํ•˜๋ผ

ํŒจํ‚ค์ง€ foo์˜ ํด๋ž˜์Šค Bar๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ž„ํฌํŠธ๋ฅผ ํ•  ๋•Œ ๋‘ ๊ฐ€์ง€ ์„ ํƒ์ง€๊ฐ€ ์žˆ๋‹ค.

  1. import foo.*;

    ์žฅ์ : ์ž„ํฌํŠธ๋ฌธ์˜ ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

  2. import foo.Bar;

    ์žฅ์ : ์ •ํ™•ํžˆ ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•˜๋‹ค.

๊ฒฐ๋ก : ๋ชจ๋“  ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํ›„์ž์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ผ. ํŠน๋ณ„ํ•œ ์˜ˆ์™ธ๋ฅผ ๋‘”๋‹ค๋ฉด ์ž๋ฐ” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(java.util.*, java.io.*, etc.)๋‚˜ ์œ ๋‹› ํ…Œ์ŠคํŠธ ์ฝ”๋“œ(junit.framework.*) ์ •๋„๋‹ค.

์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ทœ์น™

์•ˆ๋“œ๋กœ์ด๋“œ์˜ ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํˆด์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋„ ์ง€์ผœ์•ผ ํ•  ์ปจ๋ฒค์…˜์ด ์žˆ๋‹ค. ์ปจ๋ฒค์…˜์˜ ํ•ต์‹ฌ์ ์ธ ์‚ฌํ•ญ์ด ๋ฐ”๋€Œ์–ด ์ด์ „์˜ ์ฝ”๋“œ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์‚ฌ๋ผ์งˆ(deprecated) ํŒจํ„ด์ด๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์งœ์—ฌ์ ธ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ํ˜„์žฌ ์œ ์ง€๋˜๊ณ  ์žˆ๋Š” ์Šคํƒ€์ผ์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ดœ์ฐฎ์œผ๋‚˜ ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์งค ๋•Œ๋Š” ์ ˆ๋Œ€ ์‚ฌ๋ผ์งˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ.

์ž๋ฐ” ์Šคํƒ€์ผ ๊ทœ์น™

์ž๋ฐ”๋…(Javadoc) ํ‘œ์ค€ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

๋ชจ๋“  ํŒŒ์ผ์€ ์ €์ž‘๊ถŒ์— ๋Œ€ํ•œ ๊ธฐ์ˆ ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ ๋’ค๋กœ ํŒจํ‚ค์ง€์™€ ์ž„ํฌํŠธ์— ๊ด€ํ•œ ๋ฌธ๊ตฌ๊ฐ€ ์ด์–ด์ง€๋Š”๋ฐ ๊ฐ ๋ธ”๋ก์€ ํ•œ ์ค„์„ ๋„์šด๋‹ค. ๊ทธ ์•„๋ž˜๋กœ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ ์ž๋ฐ”๋… ์ฝ”๋ฉ˜ํŠธ๋กœ ๊ฐ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€๋ฅผ ๊ธฐ์ˆ ํ•˜๋ผ.

/*
 * Copyright (C) 2013 The Android Open Source Project 
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at 
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and 
 * limitations under the License.
 */

package com.android.internal.foo;

import android.os.Blah;
import android.view.Yada;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Does X and Y and provides an abstraction for Z.
 */

public class Foo {
    ...
}

๋‹น์‹ ์ด ๋งŒ๋“  ๋ชจ๋“  ํด๋ž˜์Šค์™€ ์ด๋ฆ„์œผ๋กœ ๋ดค์„ ๋•Œ ๊ธฐ๋Šฅ์ด ์ž๋ช…ํ•˜์ง€ ์•Š์€(nontrivial) ํผ๋ธ”๋ฆญ ๋ฉ”์†Œ๋“œ์—๋Š” ๊ฐ ํด๋ž˜์Šค์™€ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฌด์Šจ ์ผ์„ ํ•˜๋Š”์ง€ ์ ์–ด๋„ ํ•œ ์ค„ ์ด์ƒ์˜ ์ž๋ฐ”๋… ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‹ฌ์ž. ์ด ๋•Œ ๊ฐ ์ฝ”๋ฉ˜ํŠธ๋Š” 3์ธ์นญ ๋‹จ์ˆ˜ํ˜• ๋™์‚ฌ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.

์˜ˆ:

/** Returns the correctly rounded positive square root of a double value. */
static double sqrt(double a) {
    ...
}

๋˜๋Š”

/**
 * Constructs a new String by converting the specified array of 
 * bytes using the platform's default character encoding.
 */
public String(byte[] bytes) {
    ...
}

์ฝ”๋ฉ˜ํŠธ์˜ ๋‚ด์šฉ์ด ๋‹จ์ง€ "Foo๋ฅผ ์„ค์ •ํ•œ๋‹ค(sets Foo)" ๋“ฑ ์ž๋ช…ํ•œ ์ด๋ฆ„์˜ ๊ฒŸ(get)๊ณผ ์…‹(set) ๋ฉ”์†Œ๋“œ์—๋Š” ์ž๋ฐ”๋… ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‹ฌ ํ•„์š”๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•œ ์ผ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ฐ•ํ™”ํ•œ๋‹ค๊ฑฐ๋‚˜ ์ค‘๋Œ€ํ•œ ๋ถ€์ž‘์šฉ์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—” ๊ผญ ๋ฌธ์„œํ™”๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ "Foo"๋ผ๋Š” ์†์„ฑ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๊ฐ€ ์ž๋ช…ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋„ ๋ฌธ์„œํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

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

์•ˆ๋“œ๋กœ์ด๋“œ๋Š” ํ˜„์žฌ ์ž๋ฐ”๋… ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์‚ฌ์šฉํ•จ์— ์žˆ์–ด ํŠน์ •ํ•œ ์Šคํƒ€์ผ์„ ์ œ์‹œํ•˜๊ณ  ์žˆ์ง„ ์•Š์ง€๋งŒ ์ž๋ฐ”๋… ํˆด์„ ์œ„ํ•œ ๋ฌธ์„œํ™”(How to Write Doc Comments for the Javadoc Tool) ์˜ ์ง€์‹œ ์‚ฌํ•ญ์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋ฉ”์†Œ๋“œ๋ฅผ ์งง๊ฒŒ ์œ ์ง€ํ•˜๋ผ

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

์ •ํ•ด์ง„ ์œ„์น˜์— ํ•„๋“œ๋ฅผ ์ •์˜ํ•˜๋ผ

ํ•„๋“œ๋Š” ํŒŒ์ผ์˜ ์ƒ๋‹จ์ด๋‚˜, ๊ทธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ ๋ฐ”๋กœ ์ง์ „์— ์ •์˜๋˜์–ด์•ผ ํ•œ๋‹ค.

๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„(scope)๋ฅผ ์ œํ•œํ•˜๋ผ

์ง€์—ญ(local) ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๋Š” ์ตœ์†Œํ•œ์œผ๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ ๊ทธ๋Ÿผ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์˜ ํŽธ์ด์„ฑ์ด ๋†’์•„์งˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—๋Ÿฌ์˜ ๊ฐ€๋Šฅ์„ฑ๋„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ฒ”์œ„๋ฅผ ๋ชจ๋‘ ๊ฐ์Œ€ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์•ˆ์ชฝ์˜ ๋ธ”๋ก์—์„œ ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค.

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

์ด ๊ทœ์น™์— ํ•œ ๊ฐ€์ง€ ์˜ˆ์™ธ๊ฐ€ ์žˆ๋‹ค๋ฉด ํŠธ๋ผ์ดtry-์บ์น˜catch ๋ฌธ์„ ์‚ฌ์šฉํ•  ๋•Œ๋‹ค. ๋งŒ์•ฝ ์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋  ๊ฒฝ์šฐ ํŠธ๋ผ์ด ๋ธ”๋ก ์•ˆ์—์„œ ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ๋‹ค์Œ ์˜ˆ์™€ ๊ฐ™์ด ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ํŠธ๋ผ์ด ๋ธ”๋ก ๋ฐ”๊นฅ์—์„œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” ํŠธ๋ผ์ด ๋ธ”๋ก ์ด์ „์— ์ดˆ๊ธฐํ™” ์—†์ด ์„ ์–ธ๋  ์ˆ˜ ์žˆ๋‹ค.

// Instantiate class cl, which represents some sort of Set 
Set s = null;
try {
    s = (Set) cl.newInstance();
} catch(IllegalAccessException e) {
    throw new IllegalArgumentException(cl + " not accessible");
} catch(InstantiationException e) {
    throw new IllegalArgumentException(cl + " not instantiable");
}

// Exercise the set 
s.addAll(Arrays.asList(args));

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋„ ํŠธ๋ผ์ด-์บ์น˜ ๋ธ”๋ก ์ž์ฒด๋ฅผ ๋ฉ”์†Œ๋“œ์— ์ธ์บก์Š๋ ˆ์ด์…˜ํ•จ์œผ๋กœ์จ ๋ณ€์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

Set createSet(Class cl) {
    // Instantiate class cl, which represents some sort of Set 
    try {
        return (Set) cl.newInstance();
    } catch(IllegalAccessException e) {
        throw new IllegalArgumentException(cl + " not accessible");
    } catch(InstantiationException e) {
        throw new IllegalArgumentException(cl + " not instantiable");
    }
}

...

// Exercise the set 
Set s = createSet(cl);
s.addAll(Arrays.asList(args));

๋ฐ˜๋ณต๋ฌธ์— ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋Š” ๊ผญ ๊ทธ๋Ÿฌ์ง€ ๋ง์•„์•ผ ํ•  ์ด์œ ๊ฐ€ ์—†๋Š” ํ•œ ๋ฐ˜๋ณต๋ฌธ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค.

for (int i = 0; i < n; i++) {
    doSomething(i);
}

๊ฐ™์€ ์˜ˆ๋‹ค.

for (Iterator i = c.iterator(); i.hasNext(); ) {
    doSomethingElse(i.next());
}

์ž„ํฌํŠธimport๋ฌธ์˜ ์ˆœ์„œ

์ž„ํฌํŠธ๋ฌธ์€ ๋‹ค์Œ์˜ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•œ๋‹ค.

  1. ์•ˆ๋“œ๋กœ์ด๋“œ ์ž„ํฌํŠธ

  2. ์จ๋“œํŒŒํ‹ฐ ์ž„ํฌํŠธ(com, junit, net, org)

  3. java์™€ javax

IDE ์„ค์ •๊ณผ ์ •ํ™•ํžˆ ๋งž์ถ”๊ธฐ ์œ„ํ•œ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  • ๊ฐ๊ฐ์˜ ๊ทธ๋ฃน ๋‚ด์—์„œ๋Š” ์•ŒํŒŒ๋ฒณ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. ๋Œ€๋ฌธ์ž๊ฐ€ ์†Œ๋ฌธ์ž ์•ž์— ์˜จ๋‹ค. (์ฆ‰ Z๊ฐ€ a๋ณด๋‹ค ์•ž์ด๋‹ค.)

  • ์ฃผ์š” ๊ทธ๋ฃน์€ ํ•œ ์ค„ ๋„์–ด์ค€๋‹ค. (android, com, junit, net, org, java, javax).

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

๊ทธ๋ ‡๊ฒŒ ์ •ํ•ด์ง„ ์Šคํƒ€์ผ์€ ๋‹ค์Œ์˜ ๋ชฉ์ ์„ ๋งŒ์กฑ์‹œํ‚ค๊ณ ์ž ํ–ˆ๋‹ค:

  • ์‚ฌ๋žŒ๋“ค์ด ๋จผ์ € ๋ณด๊ธฐ ์›ํ•˜๋Š” ์ž„ํฌํŠธ๋Š” ์ƒ์œ„์— ์œ„์น˜ํ•œ๋‹ค. (์˜ˆ: android)

  • ๊ทธ๋‹ค์ง€ ๋ณผ ํ•„์š”๊ฐ€ ์—†๋Š” ์ž„ํฌํŠธ๋Š” ํ•˜๋‹จ์— ์œ„์น˜ํ•œ๋‹ค. (์˜ˆ: java)

  • ์‚ฌ๋žŒ๋“ค์ด ์Šคํƒ€์ผ์„ ์‰ฝ๊ฒŒ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

  • ๋‹ค์–‘ํ•œ IDE๋„ ์Šคํƒ€์ผ์„ ์‰ฝ๊ฒŒ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

์Šคํƒœํ‹ฑ(static) ์ž„ํฌํŠธ์˜ ์œ„์น˜๋Š” ๋‹ค์†Œ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์—ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ž„ํฌํŠธ ์‚ฌ์ด์— ๋ฐฐ์น˜ํ•˜์ž๋Š” ์˜๊ฒฌ๋„ ์žˆ์—ˆ๊ณ  ๋‹ค๋ฅธ ์ž„ํฌํŠธ๋“ค์˜ ์ตœ์ƒ๋‹จ์ด๋‚˜ ์ตœํ•˜๋‹จ์— ๋†“์ž๋Š” ์˜๊ฒฌ๋„ ์žˆ์—ˆ๋‹ค. ๋˜ํ•œ, ๋ชจ๋“  IDE๊ฐ€ ์ด ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์•„์ง ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ์ธ ๋งŒํผ ์•Œ์•„์„œ ํŒ๋‹จํ•˜๋˜ ์ผ๊ด€์„ฑ๋งŒ ์œ ์ง€ํ•˜๋ฉด ๋œ๋‹ค.

๋“ค์—ฌ์“ฐ๊ธฐ์—๋Š” ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

๋ธ”๋ก ๋“ค์—ฌ์“ฐ๊ธฐ์—๋Š” 4๊ฐœ์˜ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํƒญ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ๋‹น์‹ ์ด ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š” ์ฝ”๋“œ์˜ ๊ธฐ์กด ๋ฐฉ์‹์„ ์œ ์ง€ํ•˜๋ผ.

ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด๋‚˜ ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ ๋“ฑ์— ์ค„๋ฐ”๊ฟˆ์„ ํ•  ๋•Œ๋Š” 8๊ฐœ์˜ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์•„๋ž˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ ์˜ˆ๋‹ค.

Instrument i =
        someLongExpression(that, wouldNotFit, on, one, line);

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜๋Š” ์ž˜๋ชป๋œ ์˜ˆ๋‹ค.

Instrument i =
    someLongExpression(that, wouldNotFit, on, one, line);

ํ•„๋“œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ฅด๋ผ

  • ํผ๋ธ”๋ฆญ์ด๋‚˜ ์Šคํƒœํ‹ฑ์ด ์•„๋‹Œ ํ•„๋“œ์˜ ์ด๋ฆ„์€ m์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

  • ์Šคํƒœํ‹ฑ ํ•„๋“œ ์ด๋ฆ„์€ s๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

  • ๋‹ค๋ฅธ ํ•„๋“œ๋Š” ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

  • ํผ๋ธ”๋ฆญ ์Šคํƒœํ‹ฑ ํ•„๋“œ(์ƒ์ˆ˜)๋Š” ๋ชจ๋‘ ๋Œ€๋ฌธ์ž์— ์–ธ๋”์Šค์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์˜ˆ:

public class MyClass {
    public static final int SOME_CONSTANT = 42;
    public int publicField;
    private static MyClass sSingleton;
    int mPackagePrivate;
    private int mPrivate;
    protected int mProtected;
}

์ •ํ•ด์ง„ ์ค‘๊ด„ํ˜ธ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋ผ

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

class MyClass {
    int func() {
        if (something) {
            // ...
        } else if (somethingElse) {
            // ...
        } else {
            // ...
        }
    }
}

์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์›์น™์ด๋‹ค. ๋‹จ, ์กฐ๊ฑด๋ฌธ์˜ ๋ชจ๋“  ๋‚ด์šฉ์ด ํ•œ ์ค„๋กœ ๊ธฐ์ˆ ์ด ๊ฐ€๋Šฅํ•˜๋ฉด, ํ•œ ์ค„์— ์“ฐ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์•„๋ž˜๋Š” ๊ฐ€๋Šฅํ•œ ์˜ˆ๋‹ค.

if (condition) {
    body(); 
}

์•„๋ž˜์˜ ์˜ˆ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

if (condition) body();

ํ•˜์ง€๋งŒ ์•„๋ž˜์˜ ์˜ˆ๋Š” ์ž˜๋ชป๋˜์—ˆ๋‹ค.

if (condition)
    body();  // bad!

ํ–‰ ๊ธธ์ด๋ฅผ ์ œํ•œํ•˜๋ผ

์ฝ”๋“œ์˜ ํ•œ ํ–‰์˜ ๊ธธ์ด๋Š” ์ตœ๋Œ€ 100๊ธ€์ž๋กœ ์ œํ•œ๋˜์–ด์•ผ ํ•œ๋‹ค.

๋งŽ์€ ํ† ๋ก ์ด ์žˆ์—ˆ์ง€๋งŒ ์ตœ์ข…์ ์œผ๋กœ ์ตœ๋Œ€ 100๊ธ€์ž์—์„œ ์ œํ•œํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ๋‹ค.

์˜ˆ์™ธ: ์ปค๋งจ๋“œ๋‚˜ URL์„ ํฌํ•จํ•œ ์ฝ”๋ฉ˜ํŠธ์˜ ๊ฒฝ์šฐ ํ•œ ์ค„์— 100๊ธ€์ž๊ฐ€ ๋„˜๋”๋ผ๋„ ๋ณต์‚ฌ, ๋ถ™์—ฌ๋„ฃ๊ธฐ ๋“ฑ์˜ ํŽธ์ด๋ฅผ ์œ„ํ•ด ๊ธธ์ด๋ฅผ ์ œํ•œํ•˜์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ์™ธ: ์ž„ํฌํŠธ๋ฌธ์˜ ๊ฒฝ์šฐ ์‚ฌ๋žŒ์ด ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ ๊ธฐ ๋•Œ๋ฌธ์— 100๊ธ€์ž ์ด์ƒ์˜ ์ฝ”๋“œ๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค. This also simplifies tool writing.

์ž๋ฐ” ํ‘œ์ค€ ์ฃผ์„(annotation)์„ ์‚ฌ์šฉํ•˜๋ผ

์ฃผ์„์€ ๋‹ค๋ฅธ ๋ชจ๋””ํŒŒ์ด์–ด(modifier)๋ณด๋‹ค ์„ ํ–‰ํ•œ๋‹ค. @Override ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์ฃผ์„์€ ๋‹ค๋ฅธ ์–ธ์–ด ์š”์†Œ(language element)์™€ ๊ฐ™์€ ์ค„์— ์œ„์น˜ํ•ด๋„ ๋œ๋‹ค. ์ฃผ์„์ด ์—ฌ๋Ÿฌ ๊ฐœ์ด๊ฑฐ๋‚˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๋Š” ์ฃผ์„์ธ ๊ฒฝ์šฐ, ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ ๋Š” ๊ฒƒ์ด ์›์น™์ด๋‹ค.

์ž๋ฐ”์—์„œ ์„ ์ •์˜๋œ(predefined) ์„ธ ๊ฐ€์ง€ ์ฃผ์„์— ๋Œ€ํ•ด ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ์ •ํ•œ ๊ธฐ์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • @Deprecated: @Deprecated ์ฃผ์„์€ ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์š”์†Œ์˜ ์‚ฌ์šฉ์ด ์ž์ œ๋˜์–ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ๋งŒ์•ฝ @Deprecated ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋ฉด @deprecated ์ž๋ฐ”๋…(Javadoc) ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค์–ด ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉ๋  ๋ฉ”์†Œ๋“œ๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ, @Deprecated ์ฒ˜๋ฆฌ๋œ ๋ฉ”์†Œ๋“œ๋“ค์€ ์—ฌ์ „ํžˆ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๋„ ์žŠ์ง€ ๋งˆ๋ผ.

    ์ด์ „ ์ฝ”๋“œ์—์„œ @deprecated ์ž๋ฐ”๋… ํƒœ๊ทธ๋ฅผ ๋ณธ๋‹ค๋ฉด @Deprecated ์ฃผ์„์„ ๋‹ฌ์•„๋‘์ž.

  • @Override: @Override ์ฃผ์„์€ ์Šˆํผํด๋ž˜์Šค์— ๊ตฌํ˜„ ๋˜๋Š” ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ(override)ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, @inheritdocs ์ž๋ฐ”๋… ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†์„ ๋ฐ›์„ ๊ฒฝ์šฐ์—” ๊ฐ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ฃผ์„์œผ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค.

  • @SuppressWarnings: @SuppressWarnings ์ฃผ์„์€ ๊ฒฝ๊ณ (warning)์„ ์—†์• ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ๊ณ ๊ฐ€ ์ฝ”๋“œ ์ƒ์— ์‹ค์žฌํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ฃผ์„์ด๋‹ค.

    @SuppressWarnings ์ฃผ์„์€ "๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ" ์ƒํ™ฉ์„ ์„ค๋ช…ํ•˜๋Š” TODO ์ฃผ์„๊ณผ ๊ฐ™์ด ์ž‘์„ฑ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ํ†ตํ•ด ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ์ด์ƒํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

     // TODO: The third-party class com.third.useful.Utility.rotate() needs generics 
     @SuppressWarnings("generic-cast")
     List<String> blix = Utility.rotate(blax);

    @SuppressWarnings ์ฃผ์„์ด ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—”, ์ฃผ์„์ด ์ ์šฉ๋˜๋Š” ๋ฒ”์œ„์˜ ์ฝ”๋“œ๋Š” ๋ฆฌํŒฉํ† ๋ง(refactoring)๋˜์–ด์•ผ ํ•œ๋‹ค.

๋‘๋ฌธ์ž์–ด(acronym)์„ ์ผ๋ฐ˜ ๋‹จ์–ด๋กœ ์ทจ๊ธ‰ํ•˜๋ผ

๋ณ€์ˆ˜์™€ ๋ฉ”์†Œ๋“œ, ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ์ง€์„ ๋•Œ ๋‘๋ฌธ์ž์–ด์™€ ์•ฝ์–ด(abbreviation)๋ฅผ ์ผ๋ฐ˜์ ์ธ ๋‹จ์–ด๋กœ ์ทจ๊ธ‰ํ•˜๋ผ. ๋” ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ์ด๋ฆ„์„ ์ง€์„ ์ˆ˜ ์žˆ๋‹ค.

์ข‹์€ ์˜ˆ ๋‚˜์œ ์˜ˆ
XmlHttpRequest XMLHTTPRequest
getCustomerId getCustomerID
class Html class HTML
String url String URL
long id long ID

JDK์™€ ์•ˆ๋“œ๋กœ์ด๋“œ ์ฝ”๋“œ๋Š” ์ด ๋‘๋ฌธ์ž์–ด์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ์—์„œ ๊ต‰์žฅํžˆ ์ผ๊ด€์ ์ด์ง€ ๋ชปํ•œ ํŽธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์‹ค์ƒ ๋‹น์‹ ์ด ์ ‘ํ•  ๋ชจ๋“  ์ฝ”๋“œ์—์„œ ์ด ๊ทœ์น™์„ ์ง€ํ‚ค๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋Ÿฐ ๋งŒํผ, ์–ด๊ธˆ๋‹ˆ๋ฅผ ์งˆ๋ˆ ๋ฌผ๊ณ , ๋ชจ๋“  ๋‘๋ฌธ์ž์–ด๋ฅผ ์ผ๋ฐ˜ ๋‹จ์–ด๋กœ ์ทจ๊ธ‰ํ•˜์ž.

TODO ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

TODO ์ฝ”๋ฉ˜ํŠธ๋Š” ์ผ์‹œ์ ์ด๊ฑฐ๋‚˜ ๋‹จ๊ธฐ์ ์ธ ํ•ด๊ฒฐ์ฑ…, ์™„๋ฒฝํ•˜์ง„ ์•Š์ง€๋งŒ ์šฐ์„ ์€ ๊ดœ์ฐฎ์€ ์ฝ”๋“œ ๋“ฑ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

TODO๋Š” ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•˜๋ฉฐ ํ•ญ์ƒ ์ฝœ๋ก (:)์ด ๋’ค๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.

// TODO: Remove this code after the UrlTable2 has been checked in.

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋‹ค.

// TODO: Change this to use a flag instead of a constant.

"์–ธ์ œ๊นŒ์ง€ ์–ด๋–ค ๊ฒƒ์„ ํ•ด์•ผ ํ•œ๋‹ค"๋Š” ์‹์œผ๋กœ TODO๋ฅผ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ ์•„์ฃผ ์ž์„ธํ•œ ์ผ์ •์ด๋‚˜("2005๋…„ 11์›”๊นŒ์ง€ ์ˆ˜์ •") ์ž์„ธํ•œ ํ•  ์ผ("๋ชจ๋“  ๊ด€๊ณ„์ž๋“ค์ด 7๋ฒ„์ „์˜ ํ”„๋กœํ† ์ฝœ์„ ์ดํ•ดํ•œ ๋’ค์—์•ผ ์ด ์ฝ”๋“œ๋ฅผ ์‚ญ์ œ")์„ ๋ณ‘๊ธฐํ•œ๋‹ค.

๋กœ๊ทธ๋Š” ์•„๊ปด ์จ๋ผ

๋กœ๊ทธ๋Š” ํ•„์ˆ˜์ ์ธ ์ž‘์—…์ด์ง€๋งŒ ์งœ์ž„์ƒˆ์žˆ๊ฒŒ ์ฝ”๋”ฉํ•˜์ง€ ์•Š์œผ๋ฉด ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ์ฃผ๊ณ  ๊ทธ ์ˆœ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์žƒ์–ด๋ฒ„๋ฆฌ๊ฒŒ ๋œ๋‹ค. ์ž๋ฐ”์˜ ๋กœ๊ทธ ํผ์‹ค๋ฆฌํ‹ฐ(log facility)๋Š” 5๋‹จ๊ณ„์˜ ๋กœ๊ทธ๋ฅผ ์ง€์›ํ•œ๋‹ค.

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

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

  • INFORMATIVE: ๊ผญ ์—๋Ÿฌ๊นŒ์ง€๋Š” ์•„๋‹ˆ๋”๋ผ๋„ ๊ทธ ํšจ๊ณผ๊ฐ€ ๋‹ค๋ฐฉ๋ฉด์œผ๋กœ ํผ์ง€๋Š” ์ƒํ™ฉ์ฒ˜๋Ÿผ ๋งŽ์€ ์ˆ˜์˜ ์‚ฌ๋žŒ๋“ค์ด ์ฃผ์ง€ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— ์‚ฌ์šฉํ•˜๋Š” ๋‹จ๊ณ„๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์˜ํ•œ ์ค‘๋ณต ๋กœ๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋‹จ๊ณ„์˜ ๋กœ๊ทธ๋Š” ํ•ด๋‹น ์˜์—ญ์—์„œ ๋กœ๊ทธ๋ฅผ ํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ ์ ˆํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง€๋Š”(most authoritative) ๋ชจ๋“ˆ์— ์˜ํ•ด ์ž‘์„ฑ๋˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•ญ์ƒ ๊ธฐ๋ก๋˜์–ด์•ผ ํ•˜๋Š” ๋กœ๊ทธ๋‹ค.

  • DEBUG: ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๊ฑฐ๋‚˜ ์กฐ์‚ฌํ•  ๋•Œ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๊ธฐ๋ก์— ์‚ฌ์šฉํ•˜๋Š” ๋‹จ๊ณ„๋‹ค. ํ•ด๋‹น ์ง€์ ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์–ป๋Š”๋ฐ ํ•„์š”ํ•œ ์ •๋„๋กœ๋งŒ ๊ธฐ๋กํ•ด์•ผ ํ•˜๋ฉฐ ์ „์ฒด ๋กœ๊ทธ ์–‘์— ๋น„ํ•ด ์ด ๋‹จ๊ณ„์˜ ๋กœ๊ทธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์งˆ ๊ฒฝ์šฐ์—” VERBOSE ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

    ๋ฆด๋ฆฌ์ฆˆ ๋นŒ๋“œ์—์„œ๋„ ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ธฐ๋ก๋˜์–ด์•ผ ํ•˜์ง€๋งŒ if (LOCAL_LOG) ๋˜๋Š” if (LOCAL_LOGD) ๋ธ”๋ก ๋“ฑ์œผ๋กœ ๊ฐ์‹ธ์„œ LOCAL_LOG[D]๋ฅผ ์ •์˜ํ•˜๋Š” ํด๋ž˜์Šค๋‚˜ ์„œ๋ธŒ์ปดํฌ๋„ŒํŠธ ๋“ฑ์ด ์›ํ•œ๋‹ค๋ฉด ๋ชจ๋“  ๋””๋ฒ„๊ทธ ๋กœ๊ทธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ if (LOCAL_LOG) ๋ธ”๋ก ์•ˆ์—๋Š” ์œ ํšจํ•œ ๋กœ์ง์ด ๋“ค์–ด๊ฐ€์„œ๋Š” ์•ˆ ๋˜๊ณ  ๋กœ๊ทธ์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด์€ if (LOCAL_LOG) ๋ธ”๋ก ์•ˆ์— ๋“ค์–ด๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. The logging call should not be re-factored out into a method call if it is going to cause the string building to take place outside of the if (LOCAL_LOG) block.

    ์•„์ง๋„ if (localLOGV) ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ๋น„๋ก ํ‘œ์ค€์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ๋„ค์ด๋ฐ์ด์ง€๋งŒ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋‹ค.

  • VERBOSE: ๋‚˜๋จธ์ง€ ๋ชจ๋“  ๊ฒƒ์„ ๋กœ๊ทธํ•  ๋•Œ ์“ฐ๋Š” ๋‹จ๊ณ„๋‹ค. ์ด ๋กœ๊ทธ๋Š” ๋””๋ฒ„๊ทธ ๋นŒ๋“œ์—์„œ๋งŒ ๊ธฐ๋ก๋˜์–ด์•ผ ํ•˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํŒŒ์ผ์—์„œ ์ œ์™ธ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— if (LOCAL_LOGV) ๋ธ”๋ก ๋˜๋Š” ๊ทธ์™€ ๋™์น˜์ธ ๋ธ”๋ก ๋“ฑ์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์—ฌ์•ผ ํ•œ๋‹ค. DEBUG์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฆด๋ฆฌ์ฆˆ ๋นŒ๋“œ์—์„œ๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด์ด ์ œ์™ธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊ทธ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ž์—ด๋“ค์€ if (LOCAL_LOGV) ๋ธ”๋ก ๋‚ด๋ถ€์— ์ž‘์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.

๋…ธํŠธ:

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

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

  • ์–ด๋–ค ๋กœ๊ทธ๊ฐ€ ๋‹ค๋ฐœ์ ์œผ๋กœ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ •๋‹นํ™”๋˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด, ๊ฐ™์€ (๋˜๋Š” ์•„์ฃผ ๋น„์Šทํ•œ) ์ •๋ณด๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ธฐ๋ก๋˜์–ด ๋กœ๊ทธ๊ฐ€ ๋„˜์ณ๋‚˜๋Š” ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋น„์œจ ์ œํ•œ(rate-limiting) ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๋ฉด ์ข‹๋‹ค.

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

  • ์จ๋“œํŒŒํ‹ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ์กด์žฌํ•˜๋Š”, ๋˜๋Š” ์จ๋“œํŒŒํ‹ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด์„œ๋Š” INFORMATIVE๋ณด๋‹ค ์ƒ์œ„ ๋‹จ๊ณ„์—์„œ ๋กœ๊ทธํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

  • ์‹ ๋ขฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ชจ๋“  ์†Œ์Šค(๊ณต์œ  ์ €์žฅ์†Œ์˜ ๋ชจ๋“  ํŒŒ์ผ๋“ค๊ณผ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•œ ๋ชจ๋“  ์ˆ˜์‹  ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จ)๋กœ๋ถ€ํ„ฐ ์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ƒํ™ฉ์ด๊ธฐ ๋•Œ๋ฌธ์— DEBUG๋ณด๋‹ค ์ƒ์œ„ ๋‹จ๊ณ„์—์„œ ๋กœ๊ทธ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ ๋กœ๊ทธ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ตœ๋Œ€ํ•œ ์ œํ•œ๋˜์–ด์•ผ ํ•œ๋‹ค.

  • + ์—ฐ์‚ฐ์ž๊ฐ€ ๋ฌธ์ž์—ดString์— ์‚ฌ์šฉ๋˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ 16๊ธ€์ž์˜ ๊ธฐ๋ณธ ๋ฒ„ํผ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฐ–๋Š” ์ŠคํŠธ๋ง๋นŒ๋”StringBuilder๋ฅผ ํฌํ•จํ•ด ์ž„์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๋ฌธ์ž์—ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ์‚ฌ์‹ค์— ์œ ๋…ํ•˜๋ผ. ์‚ฌ์‹ค ๊ธฐ๋ณธ + ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ช…์‹œ์ ์œผ๋กœ(explicitly) ์ŠคํŠธ๋ง๋นŒ๋”๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค. Also keep in mind that code that calls Log.v() is compiled and executed on release builds, including building the strings, even if the logs aren't being read.

  • ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋ณด๋„๋ก ๋ฆด๋ฆฌ์ฆˆ ๋นŒ๋“œ์—์„œ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ชจ๋“  DEBUG ๋‹จ๊ณ„๊นŒ์ง€์˜ ๋กœ๊ทธ๋Š” ๊ทธ ์˜๋ฏธ๋ฅผ ์ˆจ๊ธฐ์ง€ ์•Š์œผ๋ฉด์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ๊ฐ„๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

  • ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋กœ๊ทธ๋Š” ํ•œ ์ค„์—์„œ ๋๋‚˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 80100์ž ์ •๋„์˜ ๋กœ๊ทธ๊นŒ์ง€๋Š” ์ถฉ๋ถ„ํžˆ ํ—ˆ์šฉ๋  ๋งŒํ•˜๋ฉฐ ํƒœ๊ทธ ๊ธธ์ด๋ฅผ ํฌํ•จํ•ด 130160์ž ์ •๋„๋˜๋Š” ๋กœ๊ทธ๋Š” ๋˜๋„๋ก ํ”ผํ•ด์•ผ ํ•œ๋‹ค.

  • ์„ฑ๊ณต(successes)์„ ๋ณด๊ณ ํ•˜๋Š” ๋กœ๊ทธ๋Š” VERBOSE๋ณด๋‹ค ์ƒ์œ„์˜ ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

  • ์žฌ์ƒ์‚ฐํ•˜๊ธฐ ์–ด๋ ค์šด ์ด์Šˆ๋ฅผ ์ ๊ฒ€ํ•˜๊ธฐ ์œ„ํ•œ ์ผ์‹œ์ ์ธ ๋กœ๊ทธ๋Š” DEBUG ๋˜๋Š” VERBOSE ๋‹จ๊ณ„์— ๋จธ๋ฌผ๋Ÿฌ์•ผ ํ•˜๋ฉฐ, ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ „๋ถ€ ๋น„ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ๊ฒŒ๋” ์กฐ๊ฑด๋ฌธif ๋ธ”๋ก์œผ๋กœ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค.

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

  • System.out.println() ๋˜๋Š” printf() ๋“ฑ์€ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค. System.out๊ณผ System.err์€ /dev/null๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๋Ÿฐ ๊ฐ€์‹œ์  ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†์Œ์—๋„ ์—ฌ์ „ํžˆ ์œ ํšจํ•˜๊ฒŒ ์‹คํ–‰๋˜๋Š” ๋ฌธ์žฅ๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ๋กœ๊ทธ์˜ ํ™ฉ๊ธˆ๋ฅ ์€, ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ๋กœ๊ทธ๊ฐ€ ๋‹น์‹ ์˜ ๋กœ๊ทธ๋ฅผ ๋ฐฉํ•ดํ•ด๋„ ์•ˆ ๋˜๋“ฏ์ด ๋‹น์‹ ์˜ ๋กœ๊ทธ๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ๋กœ๊ทธ๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ฐ€๋กœ๋ง‰์•„์„œ๋Š”(push out of the buffer) ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ผ

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

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

์ž๋ฐ”ํ…Œ์ŠคํŠธ ์Šคํƒ€์ผ ๊ทœ์น™

ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ฅด๋ผ

ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ์— ์ด๋ฆ„์„ ๋ถ™์ผ ๋•Œ๋Š” ๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ๋Š”์ง€์™€ ํ…Œ์ŠคํŠธ์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ํŠน์ • ๊ฒฝ์šฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์–ธ๋”์Šค์ฝ”์–ด_๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ด ์Šคํƒ€์ผ์„ ๋”ฐ๋ฅด๋ฉด ์–ด๋–ค ์ผ€์ด์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ๊ฐ€ ์‰ฝ๋‹ค.

์˜ˆ:

testMethod_specificCase1 testMethod_specificCase2

void testIsDistinguishable_protanopia() {
    ColorMatcher colorMatcher = new ColorMatcher(PROTANOPIA)
    assertFalse(colorMatcher.isDistinguishable(Color.RED, Color.BLACK))
    assertTrue(colorMatcher.isDistinguishable(Color.X, Color.Y))
}

About

Translation of Code style guidelines for contributors

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published