JiwonDev

4-1 ์ƒ์†, ์ธํ„ฐํŽ˜์ด์Šค, ํด๋ž˜์Šค์˜ ๊ถŒํ•œ ์ตœ์†Œํ™”(+Java9 ๋ชจ๋“ˆ)

by JiwonDev

์ ‘๊ทผ์ œ์–ด์ž๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๋ผ. (์ „๋ถ€๋‹ค Public์œผ๋กœ ๋งŒ๋“ค์ง€ ๋งˆ๋ผ)

 

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

 

# public ํด๋ž˜์Šค์—๋Š” ํ•„๋“œ ์ ‘๊ทผ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ.

getter setter๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๋ง์ž…๋‹ˆ๋‹ค. ๋ถˆ๋ณ€ ํ•„๋“œ๋ผ๊ณ  ํ•ด๋„ ๊ตณ์ด ๋…ธ์ถœ์‹œ์ผœ์„œ ์บก์Šํ™”๋ฅผ ๊บจ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  inner private ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ๋Š” ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ตณ์ด getter๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค, ํ•„๋“œ๋กœ ๋ฐ”๋กœ ์ ‘๊ทผํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

 

 

# ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ(side-effect)๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ผ

  • ํ•„์š”์—†๋Š” setter ๋ฉ”์„œ๋“œ๋Š” ์ œ๊ณตํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ์ƒ์†๋ฐ›์„ ์ผ์ด ์—†๋Š” ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์—†๋„๋ก ์ œํ•œํ•˜์‹ญ์‹œ์˜ค. (final ํด๋ž˜์Šค, private ์ƒ์„ฑ์ž)
  • ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ•„๋“œ๋ฅผ final๊ณผ private๋กœ ์„ ์–ธํ•˜์‹ญ์‹œ์˜ค.

 

# ์ƒ์†๋ณด๋‹ค๋Š” ์ปดํฌ์ง€์…˜(ํ•„๋“œ๋กœ ๋ฐ›์•„์˜ค๊ธฐ)๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.

์ƒ์†์€ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ is-a ๊ด€๊ณ„์ผ ๋•Œ, ์ฆ‰ ์ฒ˜์Œ ์„ค๊ณ„๋ถ€ํ„ฐ ์ƒ์†์œผ๋กœ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•˜์„ธ์š”.

๊ตณ์ด ํ•„์š”์—†๋Š” ํด๋ž˜์Šค๋“ค์„ ์ƒ์†๊ด€๊ณ„๋กœ ๋งŒ๋“ค์ง€ ๋ง๊ณ , ํ•„๋“œ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์œผ์„ธ์š”. ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ํ™•์žฅ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ  ํ•„์š”์—†๋Š” ์ƒ์†์€ ์บก์Šํ™”๋ฅผ ํ•ด์นฉ๋‹ˆ๋‹ค.

  • ์ƒ์†ํ•  ํด๋ž˜์Šค์˜ API์— ๊ฒฐํ•จ์ด ์—†๋Š”๊ฐ€?
  • ๊ฒฐํ•จ์ด ์žˆ๋‹ค๋ฉด, ์ž์‹ ํด๋ž˜์Šค์˜ API๊นŒ์ง€ ์ „ํŒŒ๋ผ๋„ ๊ดœ์ฐฎ์€๊ฐ€?
  • is-a ๊ด€๊ณ„๋ผ๊ณ  ํ•ด๋„ ๋ฌธ์„œํ™” ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ํ™•์žฅ์„ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š์•˜๋‹ค๋ฉด ์ปดํฌ์ง“(๋ฐ์ฝ”๋ ˆ์ดํ„ฐ) ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ž

Composit(Decorator)๋Š” ์ž์‹ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑ์ž ์ธ์ž๋กœ ๋„˜๊ฒจ ํ•„๋“œ์— ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. new Beverage(new Cream(New Mocha))) ์ฒ˜๋Ÿผ ์‚ฌ์šฉ. 

 

 

# ์ƒ์†์„ ๊ณ ๋ คํ•ด ์„ค๊ณ„ํ•˜๊ณ , ๋ฌธ์„œํ™”ํ•˜๋ผ. (๊ทธ๋Ÿฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ƒ์†์„ ํ•˜์ง€๋งˆ๋ผ)

์ƒ์†์šฉ ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•˜๋Š”๊ฑด ์–ด๋ ค์šด ์ผ์ž…๋‹ˆ๋‹ค. ํ•„์š”์—†๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ final class๋กœ ์ƒ์†์„ ๋ฐฉ์ง€ํ•˜์„ธ์š”.

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

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

 

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

์ƒ์†๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ณ„์ธต๊ตฌ์กฐ๊ฐ€ ์—†๊ณ , ๋‹ค์ค‘ ์ƒ์†์— ์•ˆ์ „ํ•œ ํ•˜๋‹ˆ๊นŒ์š”.

๊ฑฐ๊ธฐ์— ์ถ”๊ฐ€๋กœ ๊ฐ€๋Šฅํ•˜๋ฉด ํด๋ž˜์Šค์˜ ๊ณจ๊ฒฉ ๊ตฌ์กฐ ๊ตฌํ˜„์€ ์ธํ„ฐํŽ˜์ด์Šค์™€ default, private(java9์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋ฐฉ์ง€ ๋ฉ”์„œ๋“œ)๋ฅผ ์ด์šฉํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

 

๊ฐ€๋Šฅํ•˜๋ฉด ์ด๋ผ๋Š” ๋ง์„ ๋ถ™์ธ ์ด์œ ๋Š”, ๊ตฌํ˜„์ƒ ์ธํ„ฐํŽ˜์ด์Šค ์ œ์•ฝ ๋•Œ๋ฌธ์— ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

public class VendingMachine extends AbstractVending {
    @Override
    public void chooseProduct() {
        System.out.println("์Œ๋ฃŒ์ˆ˜๋ฅผ ์„ ํƒ ํ•œ๋‹ค.");
    }
}
public interface VendingService {
    void start();
    void chooseProduct();
    void stop();
    void process();
}

public abstract class AbstractVending implements VendingService{

    @Override
    public void process() { // default ๋ฉ”์„œ๋“œ๋ฅผ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์œผ๋‹ˆ๊นŒ์š”.
        start();
        chooseProduct();
        start();
    }
    
    @Override
    public void start() {
        System.out.println("์Œ๋ฃŒ์ˆ˜ ์„ ํƒ ์‹œ์ž‘");
    }

    @Override
    public void stop() {
        System.out.println("์Œ๋ฃŒ์ˆ˜ ์„ ํƒ ๋");
    }
}

 

 

# ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„ํ•˜๋Š” ์ž…์žฅ์„ ๊ณ ๋ คํ•ด์„œ ์„ค๊ณ„ํ•˜๋ผ.

default ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ธฐ์กด์˜ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌํ˜„์ฒด์—์„œ ์ž˜ ๋™์ž‘ํ• ์ง€๋Š” ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ์—๋Š” `์ด๋ฏธ ๊ตฌํ˜„๋˜์—ˆ๊ฑฐ๋‚˜, ๊ตฌํ˜„ํ•˜๊ณ ์žํ•˜๋Š” ๊ฐ์ฒด`์˜ ์ž…์žฅ์„ ๊ณ ๋ คํ•ด์„œ ์„ค๊ณ„ํ•˜์„ธ์š”.

 

๋งŒ์•ฝ default๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์ง€์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด Java9์˜ private ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

# ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์ˆ˜์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ. (ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ)

์ธํ„ฐํŽ˜์ด์Šค์— ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ ํ•ด์„œ, ์ƒ์ˆ˜์šฉ ์œ ํ‹ธ ๊ฐ์ฒด๋ฅผ interface๋กœ ๋งŒ๋“œ๋Š”๊ฑด ์ข‹์ง€์•Š์Šต๋‹ˆ๋‹ค. ์• ์ดˆ์— ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‚ด๋ถ€๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๊ตณ์ด ํด๋ž˜์Šค์˜ ๊ณต์šฉ API (์ƒ์ˆ˜)๋กœ ๋…ธ์ถœ์‹œํ‚ค๋Š”๊ฑด ๋‚˜์œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

public interface Constants { // NOPE!! ์œ ํ‹ธ ํด๋ž˜์Šค๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.
    static final double AVG = 6.2345235123;
    static final double AVG = 9.11111115222;
    static final double AVG = 1.3542345235;
}

 

 

 

# ํƒœ๊ทธ(์ฃผ์„)๊ฐ€ ๋‹ฌ๋ฆฐ ๋ฒ”์šฉ ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•˜์ง€ ๋งˆ๋ผ. ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋ผ

์•„๋ž˜์™€ ๊ฐ™์ด ํƒœ๊ทธ๊ฐ€ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋ฅผ ์จ์•ผํ•˜๋Š” ์ƒํ™ฉ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ์“ฐ๊ณ ์žˆ๋‹ค๋ฉด ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ํƒœ๊ทธ๋ฅผ ์—†์• ๊ณ  ์ƒ์†์„ ์ด์šฉํ•ด ๊ณ„์ธต๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// ์ƒ์†์„ ์ด์šฉํ•œ ๊ณ„์ธต๊ตฌ์กฐ๋กœ ๋ถ„๋ฆฌํ•ด์•ผํ•˜๋Š” ํด๋ž˜์Šค.
// ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์†์—†์ด ๋Œ€์ถฉ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. ๋ฆฌํŽ™ํ† ๋ง์ด ํ•„์š”ํ•˜๋‹ค.
public class Animal {
   enum Type{ DOG, CAT }// ??? ๋ญ์•ผ ์ด๊ฑด?
   
   final Type type;
   
   //dog์—์„œ๋งŒ ์“ฐ๋Š” ํ•„๋“œ..?
   final String name;
   
   //cat์—์„œ๋งŒ ์“ฐ๋Š” ํ•„๋“œ...???
   final int age;
   
   //dog์šฉ ์ƒ์„ฑ์ž
   public Animal(String name){
       this.name = name;
   }
   
   //cat์šฉ ์ƒ์„ฑ์ž
   public Animal(int age){
       this.age = age;
   }
}

 

 

# ๋ฉค๋ฒ„ ํด๋ž˜์Šค (inner ํด๋ž˜์Šค)๋Š” static์œผ๋กœ ๋งŒ๋“ค์–ด๋ผ.

๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ outer ํด๋ž˜์Šค์˜ ํ•„๋“œ(์ธ์Šคํ„ด์Šค)๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค๋ฉด non-static์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉด static์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค. static์„ ๊ฐ€์ง€๋ฉด outer ํด๋ž˜์Šค์˜ ์ฐธ์กฐ๊ฐ€ ํ•„์š”์—†์–ด์ง‘๋‹ˆ๋‹ค.

  • ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ์ˆจ์€ ์ฐธ์กฐ (outer ์ธ์Šคํ„ด์Šค)๋ฅผ ๊ฐ€์ง€๊ฒŒ๋˜๊ณ  ์ด๋Š” ๋” ๋งŽ์€ ๋น„์šฉ๊ณผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • GC๊ฐ€ outer ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆ˜๊ฑฐ ๋ชปํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. (์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์ฐพ๊ธฐ๋„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.)

 

 

# ํ•œ ํŒŒ์ผ (.java)ํŒŒ์ผ์—๋Š” ํ•œ ํด๋ž˜์Šค๋งŒ ๋‹ด์œผ์„ธ์š”.

inner ํด๋ž˜์Šค๋ฅผ ๋งํ•˜๋Š”๊ฒŒ ์•„๋‹™๋‹ˆ๋‹ค. Top level ํด๋ž˜์Šค์—์„œ๋Š” ํ•œ ํŒŒ์ผ์— ํ•œ ํด๋ž˜์Šค๋งŒ ๋‹ด์œผ์„ธ์š”.

์• ์ดˆ์— ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํŒŒ์ผ ๋‹จ์œ„(.java)๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค ๋‹จ์œ„(CLASS)๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ ํŒŒ์ผ(.class)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์ž๋ฐ”์ฝ”๋“œ์— ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ๋‹ด๊ฒŒ๋˜๋ฉด ์ˆ˜์ •ํ•˜์ง€๋„ ์•Š์€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๊ฐ™์ด ์ปดํŒŒ์ผ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

 

# Java 9์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ

์•„์ง ์‚ฌ์šฉํ•˜๊ธฐ ์ด๋ฅด๊ธดํ•˜์ง€๋งŒ, Java9 ๋ถ€ํ„ฐ ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ง„ `๋ชจ๋“ˆ`์ด๋ผ๋Š” ๊ฐœ๋…์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. Java9 ์ดํ›„๋ถ€ํ„ฐ ์ž๋ฐ” ์•ฑ์€ ๋ฐ˜๋“œ์‹œ ์ž๋ฐ” ๋ชจ๋“ˆ๋กœ ํŒจํ‚ค์ง• ๋˜๋„๋ก ๋ณ€๊ฒฝํ•  ์˜ˆ์ •์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
(Gradle ๊ณผ ๋น„์Šทํ•œ ์ž๋ฐ” ์ž์ฒด์˜ ๋ชจ๋“ˆ์‹œ์Šคํ…œ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.)

  • ์ด๋ฆ„์ด ๋ฌด์—‡์ธ๊ฐ€? (module name)
  • ์ด ๋ชจ๋“ˆ์€ ์–ด๋–ค๊ฒƒ์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? (export)
  • ์ด ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ค๊ฒƒ๋“ค์ด ํ•„์š”ํ•œ๊ฐ€ ? (require)
  • ์ด ๋ชจ๋“ˆ์ด ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“ˆ๋“ค์„ ์™ธ๋ถ€์˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ๊ฐ€? (opens)

module-info.java์— ์ž‘์„ฑํ•  ๋‚ด์šฉ๋“ค (์•„๋ž˜)

// ๋ชจ๋“ˆ์€ ํŒจํ‚ค์ง€์™€ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ๊ฐ™๋‹ค. ํด๋”์ฒ˜๋Ÿผ ๊ตฌ์„ฑํ•˜๋ฉด ๋œ๋‹ค.
// ๋‹ค๋งŒ ๋ชจ๋“ˆ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ž๋ฐ”์ฝ”๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
module com.modules.example {
    // ์‚ฌ์šฉํ•˜๋Š” ํ•„์š”ํ•œ ๋ชจ๋“ˆ ์ •์˜
    requires com.other.modules;

    // ์™ธ๋ถ€์— ๋…ธ์ถœํ•  ๋ชจ๋“ˆ ์ •์˜.
    exports com.modules.example; // ํ•˜์œ„ ํŒจํ‚ค์ง€ ํฌํ•จ ์•ˆ๋˜๊ณ  example ๋ฐ”๋กœ ํ•˜์œ„์— ์žˆ๋Š” ๊ฒƒ๋งŒ

    exports com.modules.example.a.b; // ๋ถ€๋ชจ ํŒจํ‚ค์ง€(a) export ์•ˆ ํ•˜๊ณ  (b)๋งŒ export ๊ฐ€๋Šฅ

}

 

ํŒจํ‚ค์ง€ ๋‹จ์œ„๋กœ ์บก์Šํ™”ํ•˜๊ณ , ํ•„์š”ํ•œ ๋ชจ๋“ˆ์„ JVM start-up ํƒ€์ž„์— ๊ฒ€์‚ฌํ•œ๋‹ค. ์ด์ „์—๋Š” missing classes (์กด์žฌํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ์— ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ์ง€๋งŒ, ์ด์ œ JVM์ด ์‹œ์ž‘ํ•˜๋Š” ์‹œ์ ์— ์ด๋ฅผ ๋ชจ๋“ˆ์˜ ์ •๋ณด๋กœ ํ™•์ธํ•ด์ค๋‹ˆ๋‹ค.

 

Java 8์˜ ๊ฒฝ์šฐ, ๋ชจ๋“  ํŒจํ‚ค์ง€๋“ค์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์„œ ๋ณด์•ˆ์ƒ ๋…ธ์ถœ์ด ๋˜์ง€๋ง์•„์•ผํ•  ํŒจํ‚ค์ง€๋„ ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Java9๋ถ€ํ„ฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•˜์ง€๋ง์•„์•ผํ•  ํŒจํ‚ค์ง€๋ฅผ ๋ชจ๋“ˆ ๋‚ด๋ถ€์— ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฆ‰ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด Java9์—์„œ๋Š” ์ ‘๊ทผ์ œ์–ด์ž๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ธ๋ถ„ํ™” ๋ฉ๋‹ˆ๋‹ค.

  • ์™ธ๋ถ€์— ๋ชจ๋‘ Public (public to everyone who reads this module (exports))
  • ํŠน์ • ๋ชจ๋“ˆ์—๋งŒ Public (public to some modules that read this module (exports to))
  • ๋ชจ๋“ˆ ๋‚ด๋ถ€๋งŒ Public (public to every other class within the module itself)
  • private
  • default
  • protected

์•„์ง์€ Java8์ด ๋Œ€์„ธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ๊ถ๊ธˆํ•˜๋‹ค๋ฉด Project Jigsaw๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

 

Java 9 ์™€ Project Jigsaw ์†Œ๊ฐœ 1

์˜์—ญ, ์˜ค์—ญ, ์ง์—ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.์ด ํฌ์ŠคํŠธ๋Š” ์›์ €์ž์˜ ๋™์˜๋ฅผ ์–ป์–ด ํ•œ๊ธ€๋กœ ๋ฒˆ์—ญํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. This post is a translation of this original article [https://blog.codecentric.de/en/2015/11/first-steps-wi

infoscis.github.io

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ