Skip to content

Latest commit

ย 

History

History
452 lines (287 loc) ยท 29.4 KB

File metadata and controls

452 lines (287 loc) ยท 29.4 KB

item 01. ์ƒ์„ฑ์ž๋ฅผ ๋Œ€์‹  ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ ๋ คํ•˜๋ผ

1์žฅ ๋“ค์–ด๊ฐ€๊ธฐ

์ด ์ฑ…์€ ์„ฑ๋Šฅ์— ์ง‘์ค‘ํ•˜๋Š” ๋ถ€๋ถ„์€ ๋งŽ์ง€ ์•Š๋‹ค. ๋Œ€์‹  ํ”„๋กœ๊ทธ๋žจ์„ ๋ช…ํ™•ํ•˜๊ณ , ์ •ํ™•ํ•˜๊ณ , ์œ ์šฉํ•˜๊ณ , ๊ฒฌ๊ณ ํ•˜๊ณ , ์œ ์—ฐํ•˜๊ณ , ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์งœ๋Š”๋ฐ ์ง‘์ค‘ํ•œ๋‹ค.

๊ธฐ์ˆ  ์šฉ์–ด๋Š” ๋Œ€๋ถ€๋ถ„ ์ž๋ฐ”8์šฉ ์–ธ์–ด ๋ช…์„ธ๋ฅผ ๋”ฐ๋ฅด๋ฉฐ, ์ž๋ฐ”๊ฐ€ ์ง€์›ํ•˜๋Š” ํƒ€์ž…์€ ์ธํ„ฐํŽ˜์ด์Šค(interface), ํด๋ž˜์Šค(class), ๋ฐฐ์—ด(array), ๊ธฐ๋ณธ ํƒ€์ž…(primitive) ์ด ๋„ค ๊ฐ€์ง€๋‹ค.

์• ๋„ˆํ…Œ์ด์…˜(anntation)

์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ์ข…

์—ด๊ฑฐ ํƒ€์ž…(enum)

ํด๋ž˜์Šค์˜ ์ผ์ข…

์ฐธ์กฐ ํƒ€์ž…(Reference type)

์ธํ„ฐํŽ˜์ด์Šค, ํด๋ž˜์Šค, ๋ฐฐ์—ด

์ฆ‰, ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ๋ฐฐ์—ด์€ ๊ฐ์ฒด(object)์ธ ๋ฐ˜๋ฉด, ๊ธฐ๋ณธ ํƒ€์ž… ๊ฐ’์€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„

  1. ํ•„๋“œ(field)
  2. ๋ฉ”์„œ๋“œ(method)
  3. ๋ฉค๋ฒ„ ํด๋ž˜์Šค
  4. ๋ฉค๋ฒ„ ์ธํ„ฐํŽ˜์ด์Šค

๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜(parameter)์˜ ํƒ€์ž…๋“ค๋กœ ์ด๋ค„์ง„๋‹ค.(๋ฐ˜ํ™˜๊ฐ’์˜ ํƒ€์ž…์€ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค)

๋‹จ, ์ผ๋ถ€ ์šฉ์–ด๋Š” ์ž๋ฐ” ์–ธ์–ด ๋ช…์„ธ์™€ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค. ์ž๋ฐ” ์–ธ์–ด ๋ช…์„ธ์™€๋Š” ๋‹ฌ๋ฆฌ ์ด ์ฑ…์€ ์ƒ์†(inheritance)์„ ์„œ๋ธŒํด๋ž˜์‹ฑ(subclassing)๊ณผ ๋™์˜๋กœ ์“ด๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ์ƒ์† ๋Œ€์‹ 

โœ”๏ธ ํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค(implemetent)

โœ”๏ธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•œ๋‹ค(extend)

API(application programming interface)

ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ์ƒ์„ฑ์ž, ๋ฉค๋ฒ„, ์ง๋ ฌํ™”๋œ ํ˜•ํƒœ(serialiozed form)์„ ๋งํ•œ๋‹ค.

์‚ฌ์šฉ์ž (user)

API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์ž(์‚ฌ๋žŒ)์„ ๊ทธ API์˜ ์‚ฌ์šฉ์ž๋ผ๊ณ  ํ•จ

ํด๋ผ์ด์–ธํŠธ(client)

API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค(์ฝ”๋“œ)๋Š” ๊ทธ API์˜ ํด๋ผ์ด์–ธํŠธ

2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด

๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด๋ฅผ ๋‹ค๋ฃฌ 2์žฅ์œผ๋กœ, ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•  ๋•Œ์™€ ๋งŒ๋“ค์ง€ ๋ง์•„์•ผ ํ•  ๋•Œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์„ ์•Œ์•„๋ด„

์•„์ดํ…œ 1 : ์ƒ์„ฑ์ž ๋Œ€์‹  ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ ๋ คํ•˜๋ผ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป๋Š” ์ „ํ†ต์ ์ธ ์ˆ˜๋‹จ์€ public ์ƒ์„ฑ์ž๋‹ค.

ํ•˜์ง€๋งŒ 1๊ฐ€์ง€ ๋” ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ์ž์™€ ๋ณ„๋„๋กœ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ(static factory method)๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹จ์ˆœํ•œ ์ •์  ๋ฉ”์„œ๋“œ ๋ง์ด๋‹ค.

boolean ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ•์‹ฑํด๋ž˜์Šค์ธ boolean ์˜ˆ

์ด ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์ธ boolean ๊ฐ’์„ ๋ฐ›์•„ Boolean ๊ฐ์ฒด ์ฐธ์กฐ๋กœ ๋ณ€ํ™˜ํ•ด ์ค€๋‹ค.

public static Boolean valusOf(boolean b){
    return b ? Boolean.TRUE : Boolean.FALSE;
}

โœ… ์—ฌ๊ธฐ์„œ ์–˜๊ธฐํ•˜๋Š” ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ์ธ ํŒจํ„ด์—์„œ์˜ ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ(Factory Method)์™€ ๋‹ค๋ฅธ๋‹ค. ๋””์ž์ธ ํŒจํ„ด ์ค‘์—๋Š” ์ด์™€ ์ผ์น˜ํ•˜๋Š” ํŒจํ„ด์€ ์—†๋‹ค.

๋งŒ์•ฝ, PUBLIC ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด,

public static Boolean valueOf(boolean b) {
    return new Boolean(b);  // ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
}

์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ์„ฑ์ž ์ข‹์€ ์žฅ์  5๊ฐ€์ง€

โœ”๏ธ ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ƒ์„ฑ์ž์— ๋„˜๊ธฐ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ƒ์„ฑ์ž ์ž์ฒด๋งŒ์œผ๋กœ๋Š” ๋ฐ˜ํ™˜๋  ๊ฐ์ฒด์˜ ํŠน์„ฑ์„ ์ œ๋Œ€๋กœ ์„ค๋ช… ๋ชปํ•˜์ง€๋งŒ, ์ •์  ํŒฉํ† ๋ฆฌ์˜ ๊ฒฝ์šฐ, ์ด๋ฆ„๋งŒ ์ž˜ ์ง€์œผ๋ฉด ์‰ฝ๊ฒŒ ๋ฌ˜์‚ฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ•˜๋‚˜์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋กœ๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ƒ์„ฑ์ž๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š” ์ง€ ์ •ํ™•ํžˆ ๊ธฐ์–ตํ•˜๊ธฐ ์–ด๋ ค์›Œ ์—‰๋šฑํ•œ ๊ฒƒ์„ ํ˜ธ์ถœํ•˜๋Š” ์‹ค์ˆ˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋–„๋ฌธ์— ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ด๋Ÿฐ ์ œ์•ฝ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

โœ”๏ธ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์ง€๋Š” ์•Š์•„๋„ ๋œ๋‹ค.

๋•๋ถ„์— ๋ถˆ๋ณ€ ํด๋ž˜์Šค(immutable class๏ผ› ์•„์ดํ…œ 17๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“๊ฑฐ๋‚˜ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์บ์‹ฑํ•˜์—ฌ ์žฌํ™œ์šฉํ•˜๋Š” ์‹์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ๏ผˆํŠนํžˆ ์ƒ์„ฑ ๋น„์šฉ์ด ํฐ) ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ์ž์ฃผ ์š”์ฒญ๋˜๋Š” ์ƒํ™ฉ ์ด๋ผ๋ฉด ์„ฑ๋Šฅ์„ ๋Œ์–ด์˜ฌ๋ ค ์ค€๋‹ค. ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด(Flyweight pattern)1๋„ ์ด์™€ ๋น„์Šทํ•œ ๊ธฐ๋ฒ•์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธ์Šคํ„ด์Šค ํ†ต์ œ๏ผˆinstance-controlled) ํด๋ž˜์Šค

๋ฐ˜๋ณต๋˜๋Š” ์š”์ฒญ์— ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‹์œผ๋กœ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฐฉ์‹์˜ ํด๋ž˜์Šค๋Š” ์–ธ์ œ ์–ด๋А ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ด์•„ ์žˆ๊ฒŒ ํ• ์ง€๋ฅผ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธ์Šคํ„ด์Šค๋ฅผ ํ†ต์ œํ•˜๋Š” ์ด์œ ๋Š”?

  1. ํด๋ž˜์Šค๋ฅผ ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๋งŒ๋“ค์ˆ˜๋„, ์ธ์Šคํ„ด์Šคํ™” ๋ถˆ๊ฐ€๋กœ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด(Singleton Pattern)

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

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

public class Singleton {
    // ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค
    private static final Singleton INSTANCE = new Singleton();

    // private ์ƒ์„ฑ์ž: ์™ธ๋ถ€์—์„œ ์ธ์Šคํ„ด์Šคํ™” ๊ธˆ์ง€
    private Singleton() {}

    // ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

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

  • ์ธ์Šคํ„ด์Šคํ™” ๋ถˆ๊ฐ€

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

public class UtilityClass {
    // private ์ƒ์„ฑ์ž: ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๊ธˆ์ง€ํ•จ
    private UtilityClass() {
        throw new AssertionError("Cannot instantiate this class.");
    }

    // static ๋ฉ”์„œ๋“œ
    public static void utilityMethod() {
        // ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
    }
}

์œ„์™€ ๊ฐ™์ด ์ƒ์„ฑ์ž๋ฅผ private์œผ๋กœ ์„ ์–ธํ•˜์—ฌ, UtilityClass๋Š” ์ธ์Šคํ„ด์Šคํ™”๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์˜ค์ง utilityMethod() ๊ฐ™์€ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  1. ๋ถˆ๋ณ€ ๊ฐ’ ํด๋ž˜์Šค์—์„œ ๋™์น˜์ธ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹จ ํ•˜๋‚˜๋ฟ์ž„์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.( a == b๋•Œ๋งŒ, a.equals(b)๊ฐ€ ์„ฑ๋ฆฝ)

๋ถˆ๋ณ€ ํด๋ž˜์Šค(Immutable Class)๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ์ดํ›„ ๊ทธ ์ƒํƒœ๊ฐ€ ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ๋™์น˜์ธ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹จ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ธ์Šคํ„ด์Šค ํ†ต์ œ(instance control)๋ผ๊ณ  ํ•˜๋ฉฐ, ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„ ์ธ์Šคํ„ด์Šค๋Š” ํ•ญ์ƒ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด a == b์ผ ๋•Œ๋งŒ a.equals(b)๊ฐ€ ์„ฑ๋ฆฝํ•˜๋„๋ก ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ’์ด ๋™์ผํ•œ ๊ฐ์ฒด๋Š” ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

public final class Boolean {
    public static final Boolean TRUE = new Boolean(true);
    public static final Boolean FALSE = new Boolean(false);

    private final boolean value;

    private Boolean(boolean value) {
        this.value = value;
    }

    public static Boolean valueOf(boolean value) {
        return value ? TRUE : FALSE; // ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
    }
}

์œ„ ์ฝ”๋“œ์—์„œ Boolean ํด๋ž˜์Šค๋Š” ๋ถˆ๋ณ€ ํด๋ž˜์Šค์ด๋ฉฐ, valueOf() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด true ๋˜๋Š” false ๊ฐ’์— ๋”ฐ๋ผ ๋ฏธ๋ฆฌ ์ •์˜๋œ TRUE ๋˜๋Š” FALSE ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, a == b๊ฐ€ a.equals(b)์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  1. ์ธ์Šคํ„ด์Šค ํ†ต์ œ๋Š” ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด์˜ ๊ทผ๊ฐ„์ด ๋˜๋ฉฐ, ์—ด๊ฑฐ ํƒ€์ž…์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค์–ด์ง ๋ณด์žฅ
  • ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด๊ณผ ์ธ์Šคํ„ด์Šค ํ†ต์ œ

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

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

ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด์˜ ํ•ต์‹ฌ์€ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์ด ๊ณต์œ ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ํ†ต์ œ๋Š” ์ด ํŒจํ„ด์˜ ๊ทผ๊ฐ„์„ ์ด๋ฃจ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • ์—ด๊ฑฐํ˜•(enum)๊ณผ ์ธ์Šคํ„ด์Šค ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ ๋ณด์žฅ

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

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

public enum SingletonEnum {
    INSTANCE;

    public void someMethod() {
        // ๋™์ž‘ ์ •์˜
    }
}

์œ„์˜ SingletonEnum ํด๋ž˜์Šค๋Š” ์ž๋ฐ”์—์„œ ์—ด๊ฑฐํ˜•์œผ๋กœ ๊ตฌํ˜„๋œ ์‹ฑ๊ธ€ํ„ด์ž…๋‹ˆ๋‹ค. INSTANCE๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ์˜ค์ง ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑ๋˜์–ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋จ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

์š”์•ฝ

  1. ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด: ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์˜ค์ง ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค๋„๋ก ๋ณด์žฅํ•˜๋Š” ํŒจํ„ด.
  2. ์ธ์Šคํ„ด์Šคํ™” ๋ถˆ๊ฐ€ ํด๋ž˜์Šค: ํด๋ž˜์Šค์˜ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ง‰๊ณ  ์ •์  ๋ฉ”์„œ๋“œ๋กœ๋งŒ ์‚ฌ์šฉ๋˜๋„๋ก ํ•˜๋Š” ์„ค๊ณ„.
  3. ๋ถˆ๋ณ€ ๊ฐ’ ํด๋ž˜์Šค์˜ ๋™์น˜์„ฑ ๋ณด์žฅ: ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ์ธ์Šคํ„ด์Šค๋Š” ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜์—ฌ == ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•.
  4. ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด: ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์™€ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ํŒจํ„ด.
  5. ์—ด๊ฑฐํ˜•(enum): ์ž๋ฐ”์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ๊ตฌ์กฐ๋กœ, ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•.

์ด ์•ˆ์— ์žˆ๋Š” ๋‚ด์šฉ๋“ค์€ ๋’ค์— ์ž์„ธํžˆ ๋‚˜์˜ด

โœ”๏ธ ๋ฐ˜ํ™˜ ํƒ€์ž…์˜ ํ•˜์œ„ ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ์žˆ๋‹ค.

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

์ž๋ฐ” 8 ์ด์ „์—๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์  ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€์˜€์Œ ์ž๋ฐ” 8๋ถ€ํ„ฐ ์ œํ•œ์ด ํ’€๋ ธ๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šคํ™” ๋ถˆ๊ฐ€ ๋™๋ฐ˜ ํด๋ž˜์Šค๋ฅผ ๋‘˜ ์ด์œ ๊ฐ€ ์—†๋‹ค. ๋™๋ฐ˜ ํด๋ž˜์Šค์— ๋‘์—ˆ๋˜ public ์ •์  ๋ฉค๋ฒ„๋“ค ์ƒ๋‹น์ˆ˜๋ฅผ ๊ทธ๋ƒฅ ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด์— ๋‘๋ฉด ๋จ

  • ์ž๋ฐ” 8 ์ด์ „: ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†์–ด์„œ, ์ •์  ๋ฉ”์„œ๋“œ๋Š” ๋™๋ฐ˜ ํด๋ž˜์Šค(Companion Class)์— ์ •์˜
  • ์ž๋ฐ” 8 ์ดํ›„: ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด์— public static ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋™๋ฐ˜ ํด๋ž˜์Šค๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ์ž๋ฐ” 9 ์ดํ›„: ์ธํ„ฐํŽ˜์ด์Šค์— private static ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด, ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ” 8 ์ด์ „ ์ฝ”๋“œ ์˜ˆ์‹œ:

// ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜
public interface MyInterface {
    void doSomething();
}

// ๋™๋ฐ˜ ํด๋ž˜์Šค(Companion Class) - ์ •์  ๋ฉ”์„œ๋“œ ์ œ๊ณต
public class MyInterfaceUtils {
    public static void printInfo() {
        System.out.println("MyInterface Utils method");
    }
}
  • MyInterface์—๋Š” doSomething()์ด๋ผ๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€๋งŒ, ์ •์  ๋ฉ”์„œ๋“œ๋Š” ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ณ„๋„์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค(MyInterfaceUtils)๋ฅผ ๋งŒ๋“ค์–ด ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ด์•ผ ํ–ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ:

public class Main {
    public static void main(String[] args) {
        // ๋™๋ฐ˜ ํด๋ž˜์Šค์˜ ์ •์  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
        MyInterfaceUtils.printInfo();
    }
}

์ž๋ฐ” 8 ์ดํ›„ ์ฝ”๋“œ ์˜ˆ์‹œ:

// ์ž๋ฐ” 8 ์ดํ›„ ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์  ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
public interface MyInterface {
    void doSomething();

    // ์ •์  ๋ฉ”์„œ๋“œ ์ •์˜
    static void printInfo() {
        System.out.println("MyInterface static method");
    }
}
  • ์ด์ œ MyInterface ์•ˆ์— ์ •์  ๋ฉ”์„œ๋“œ printInfo()๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋” ์ด์ƒ ๋™๋ฐ˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ:

public class Main {
    public static void main(String[] args) {
        // ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ •์  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
        MyInterface.printInfo();
    }
}

โœ”๏ธ ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋งค๋ฒˆ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

// ์ฃผ์ค‘๋งŒ ํฌํ•จํ•˜๋Š” EnumSet
EnumSet<Day> weekdays = EnumSet.of(Day.MONDAY, Day.TUESDAY, Day.WEDNESDAY, Day.THURSDAY, Day.FRIDAY);

  • EnumSet ํด๋ž˜์Šค๋Š” public ์ƒ์„ฑ์ž ์—†์ด ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋กœ๋งŒ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • EnumSet์€ ์›์†Œ์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ๋‘ ๊ฐ€์ง€ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•œ๋‹ค.
    • ์›์†Œ๊ฐ€ 64๊ฐœ ์ดํ•˜๋ฉด, RegularEnumSet์„ ์‚ฌ์šฉํ•˜์—ฌ long ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•ด ์›์†Œ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
    • ์›์†Œ๊ฐ€ 65๊ฐœ ์ด์ƒ์ด๋ฉด, JumboEnumSet์„ ์‚ฌ์šฉํ•ด long ๋ฐฐ์—ด๋กœ ์›์†Œ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ๋‘ ํด๋ž˜์Šค(RegularEnumSet๊ณผ JumboEnumSet)์˜ ์กด์žฌ๋ฅผ ๋ชจ๋ฅธ๋‹ค. ๋‹จ์ง€ EnumSet ์ธ์Šคํ„ด์Šค๋งŒ ๋ฐ›๋Š”๋‹ค.
  • ๋งŒ์•ฝ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ RegularEnumSet์ด ํ•„์š” ์—†์–ด์ง„๋‹ค๋ฉด, ์ด๋ฅผ ์‚ญ์ œํ•ด๋„ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—๋Š” ์˜ํ–ฅ์ด ์—†๋‹ค.
  • ๋‚˜์•„๊ฐ€, ์„ฑ๋Šฅ์„ ๋” ๊ฐœ์„ ํ•œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์—ญ์‹œ ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฅผ ์•Œ๊ฑฐ๋‚˜ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ์ค‘์š”ํ•œ ์ ์€, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ๊ตฌ์ฒด์ ์ธ ํ•˜์œ„ ํด๋ž˜์Šค์ธ์ง€ ์•Œ ํ•„์š”๊ฐ€ ์—†๊ณ , ์•Œ์ง€ ์•Š์•„๋„ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ’ฌ ํ’€์–ด์„œ ์„ค๋ช…ํ•˜์ž๋ฉด,

  1. ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ:

    • EnumSet ํด๋ž˜์Šค๋Š” public ์ƒ์„ฑ์ž๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ , ๋Œ€์‹  ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋งŒ์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์œ ์—ฐํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ, ์ƒ์„ฑ์ž์™€ ๋‹ฌ๋ฆฌ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์บ์‹ฑ์„ ํ†ตํ•ด ๊ฐ์ฒด ์ƒ์„ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด, EnumSet.of() ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด EnumSet์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์–ด๋–ค ํŠน์ • ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ์ € ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ(of())๋งŒ ํ˜ธ์ถœํ•˜์—ฌ EnumSet์„ ๋ฐ›์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

  2. ๋‚ด๋ถ€ ๊ตฌํ˜„์˜ ์บก์Аํ™”:

    • EnumSet ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋‘ ๊ฐ€์ง€ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
      • RegularEnumSet: ์›์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 64๊ฐœ ์ดํ•˜์ผ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๋‹จ์ผ long ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด 64๋น„ํŠธ ๋‚ด์—์„œ ์›์†Œ๋“ค์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ์™€ ์„ฑ๋Šฅ์ด ๋งค์šฐ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
      • JumboEnumSet: ์›์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 65๊ฐœ ์ด์ƒ์ผ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๋‹จ์ผ long ๋ณ€์ˆ˜๋กœ๋Š” ๋ชจ๋“  ์›์†Œ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ long ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์›์†Œ๋“ค์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    ์ด ๊ตฌ์กฐ๋Š” ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋ ค๋Š” ๋ชฉ์ ์—์„œ ๋งŒ๋“ค์–ด์กŒ์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ๋‘ ๊ฐ€์ง€ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์กด์žฌ๋ฅผ ์ „ํ˜€ ์•Œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” EnumSet ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ ์–ด๋–ค ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค(RegularEnumSet ๋˜๋Š” JumboEnumSet)๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š”์ง€๋Š” ๋ชฐ๋ผ๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์บก์Аํ™”์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

  3. ๋ฏธ๋ž˜์˜ ์œ ์—ฐ์„ฑ:

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

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

์ž๋ฐ” 8 ์ด์ „ ์Šคํƒ€์ผ: ๋™๋ฐ˜ ํด๋ž˜์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ (์ด ์„ค๋ช…๊ณผ ์—ฐ๊ด€ ์—†์Œ)

public enum Color {
    RED, GREEN, BLUE;
}

EnumSet<Color> set = EnumSet.of(Color.RED, Color.GREEN);

์ž๋ฐ” 8 ์ดํ›„ ์Šคํƒ€์ผ: ๋‚ด๋ถ€์ ์œผ๋กœ ๋‘ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ชจ๋ฆ„

// ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
EnumSet<Color> set = EnumSet.of(Color.RED, Color.GREEN);

// ๋‚ด๋ถ€์—์„œ์˜ ๊ตฌํ˜„ ์˜ˆ์‹œ (OpenJDK ๋‚ด๋ถ€์  ์ฒ˜๋ฆฌ)
if (enumConstants.length <= 64) {
    return new RegularEnumSet<>(...);  // long์œผ๋กœ ์ฒ˜๋ฆฌ
} else {
    return new JumboEnumSet<>(...);    // long ๋ฐฐ์—ด๋กœ ์ฒ˜๋ฆฌ
}
  • ํด๋ผ์ด์–ธํŠธ๋Š” RegularEnumSet ๋˜๋Š” JumboEnumSet ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋Š” ๋‚ด๋ถ€์—์„œ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๊ตฌํ˜„์ฒด๋ฅผ ์„ ํƒํ•ด ์ œ๊ณตํ•œ๋‹ค.

โœ”๏ธ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‹œ์ ์—๋Š” ๋ฐ˜ํ™˜ํ•  ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

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

ํŒจํ„ด์˜ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ

  1. ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค (Service Interface):
    • ์„œ๋น„์Šค ์ œ๊ณต์ž๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ๊ณผ ๋™์ž‘์„ ์ •์˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
    • ์˜ˆ๋ฅผ ๋“ค์–ด, JDBC์—์„œ Connection์ด ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•œ๋‹ค. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋Š” ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  2. ์ œ๊ณต์ž ๋“ฑ๋ก API (Provider Registration API):
    • ์„œ๋น„์Šค ์ œ๊ณต์ž๊ฐ€ ์ž์‹ ์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” API
    • ์˜ˆ๋ฅผ ๋“ค์–ด, JDBC์—์„œ DriverManager.registerDriver()๊ฐ€ ์ œ๊ณต์ž ๋“ฑ๋ก API ์—ญํ• ์„ ํ•œ๋‹ค. ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋Š” ์ž์‹ ์„ ์ด API์— ๋“ฑ๋กํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค.
  3. ์„œ๋น„์Šค ์ ‘๊ทผ API (Service Access API):
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋น„์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” API์ž…
    • ์˜ˆ๋ฅผ ๋“ค์–ด, JDBC์—์„œ๋Š” DriverManager.getConnection()์ด ์„œ๋น„์Šค ์ ‘๊ทผ API๋กœ, ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ํŠน์ • ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ฐ์ฒด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์ด API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ •ํ•œ ์กฐ๊ฑด์— ๋งž๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ๋ช…์‹œํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋ฅผ ์–ป๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ฒด๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์ด ํŒจํ„ด์—๋Š” ์„œ๋น„์Šค ์ œ๊ณต์ž ์ธํ„ฐํŽ˜์ด์Šค(Service Provider Interface)๋ผ๋Š” ๋„ค ๋ฒˆ์งธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ ์„œ๋น„์Šค์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—†์œผ๋ฉด ๊ตฌํ˜„์ฒด๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ ๋ฆฌํ”Œ๋ ‰์…˜(Reflection)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, JDBC์—์„œ๋Š” Driver๊ฐ€ ์„œ๋น„์Šค ์ œ๊ณต์ž ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•œ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ฐ์ฒด(Connection)์„ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๐Ÿ’ฌ ์ž๋ฐ”์˜ ์˜ˆ์‹œ (JDBC)

  • ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค: Connection
  • ์ œ๊ณต์ž ๋“ฑ๋ก API: DriverManager.registerDriver()
  • ์„œ๋น„์Šค ์ ‘๊ทผ API: DriverManager.getConnection()
  • ์„œ๋น„์Šค ์ œ๊ณต์ž ์ธํ„ฐํŽ˜์ด์Šค: Driver

JDBC๋Š” ์ž๋ฐ”์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ API์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค ๋‹ค๋ฅธ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ์ด๋“ค์€ ๋ชจ๋‘ ๊ฐ™์€ Connection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋Š” DriverManager์— ์ž์‹ ์„ ๋“ฑ๋กํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๐Ÿ’ฌ ๋ณ€ํ˜• ๋ฐ ํ™•์žฅ

  1. ๋ธŒ๋ฆฌ์ง€ ํŒจํ„ด(Bridge Pattern): ์„œ๋น„์Šค ์ ‘๊ทผ API๋Š” ์„œ๋น„์Šค ์ œ๊ณต์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋” ํ’๋ถ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection): ์˜์กด์„ฑ ์ฃผ์ž… ํ”„๋ ˆ์ž„์›Œํฌ ๋˜ํ•œ ๊ฐ•๋ ฅํ•œ ์„œ๋น„์Šค ์ œ๊ณต์ž ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ณ€ํ˜•์œผ๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ฃผ์ž…ํ•ด์ฃผ๋Š” ์‹œ์Šคํ…œ์œผ๋กœ, ์„œ๋น„์Šค ์ œ๊ณต์ž์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  3. ServiceLoader (์ž๋ฐ” 6๋ถ€ํ„ฐ ์ œ๊ณต): ์ž๋ฐ” 6๋ถ€ํ„ฐ๋Š” java.util.ServiceLoader๋ผ๋Š” ๋ฒ”์šฉ ์„œ๋น„์Šค ์ œ๊ณต์ž ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ œ๊ณต๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์„œ๋น„์Šค ์ œ๊ณต์ž ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค ํ•„์š” ์—†์ด ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„์ฒด๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ServiceLoader๋Š” ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ตฌํ˜„์ฒด๋ฅผ ์ฐพ๊ณ  ๋กœ๋“œํ•˜๋Š” ๋ฒ”์šฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค ์ œ๊ณต์ž๊ฐ€ ์กด์žฌํ•˜๋”๋ผ๋„ ์†์‰ฝ๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์žฅ์ 

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

์„œ๋น„์Šค ์ œ๊ณต์ž ์ธํ„ฐํŽ˜์ด์Šค(Service Provider Interface)๋Š” ์ข…์ข… ์ถ”๊ฐ€๋˜๋Š” ๋„ค ๋ฒˆ์งธ ์ปดํฌ๋„ŒํŠธ๋กœ, ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ์—ญํ• ์„ ํ•œ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” java.util.ServiceLoader๋ผ๋Š” ๋ฒ”์šฉ ์„œ๋น„์Šค ์ œ๊ณต์ž ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ œ๊ณต๋จ

๋‹จ์  2๊ฐ€์ง€

โŒ ์ƒ์†์„ ํ•˜๋ ค๋ฉด, public์ด๋‚˜ protected ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ˆ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋งŒ ์ œ๊ณตํ•˜๋ฉด ํ•˜์œ„ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค.

์•ž์„œ ์ด์•ผ๊ธฐํ•œ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ตฌํ˜„ ํด๋ž˜์Šค๋“ค์€ ์ƒ์†ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ด์•ผ๊ธฐ๋‹ค

์–ด์ฐŒ ๋ณด๋ฉด ์ด ์ œ์•ฝ์€ ์ƒ์†๋ณด๋‹ค ์ปดํฌ์ง€์…˜์„ ์‚ฌ์šฉ(์•„์ดํ…œ 18ํ•˜๋„๋ก ์œ ๋„ํ•˜๊ณ  ๋ถˆ๋ณ€ ํƒ€์ž…(์•„์ดํ…œ 17์œผ๋กœ ๋งŒ๋“ค๋ ค๋ฉด ์ด ์ œ์•ฝ์„ ์ง€์ผœ์•ผ ํ•œ๋‹ค๋Š” ์ ์—์„œ ์˜คํžˆ๋ ค ์žฅ์ ์œผ๋กœ ๋ฐ›์•„๋“ค์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

โŒ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฐพ๊ธฐ ์–ด๋ ต๋‹ค.

API ๋ฌธ์„œ๋ฅผ ์ž˜ ์จ๋†“๊ณ  ๋ฉ”์„œ๋“œ ์ด๋ฆ„๋„ ๋„๋ฆฌ ์•Œ๋ ค์ง„ ๊ทœ์•ฝ์„ ๋”ฐ๋ผ ์ง“๋Š” ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์ด์ •์  ๋ฉ”์„œ๋“œ๋กœ ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ๋“ค

๋ฉ”์„œ๋“œ ์„ค๋ช… ์˜ˆ์‹œ
from ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋ฐ›์•„์„œ ํ•ด๋‹น ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜• ๋ณ€ํ™˜ ๋ฉ”์„œ๋“œ. Date d = Date.from(instant);
of ์—ฌ๋Ÿฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„ ์ ํ•ฉํ•œ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ง‘๊ณ„ ๋ฉ”์„œ๋“œ. Set faceCards = EnumSet.of(JACK, QUEEN, KING);
valueOf from๊ณผ of์˜ ๋” ์ž์„ธํ•œ ๋ฒ„์ „. BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
instance / getInstance ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ช…์‹œํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ, ๊ฐ™์€ ์ธ์Šคํ„ด์Šค์ž„์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Œ. StackWalker luke = StackWalker.getInstance(options);
create / newInstance instance ํ˜น์€ getInstance์™€ ๊ฐ™์ง€๋งŒ, ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜ํ•จ์„ ๋ณด์žฅํ•จ. Object newArray = Array.newInstance(classObject, arrayLen);
getType getInstance์™€ ๊ฐ™์œผ๋‚˜, ์ƒ์„ฑํ•  ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ. 'Type'์€ ๋ฐ˜ํ™˜ํ•  ๊ฐ์ฒด์˜ ํƒ€์ž…. FileStore fs = Files.getFileStore(path);
newType newInstance์™€ ๊ฐ™์œผ๋‚˜, ์ƒ์„ฑํ•  ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ. 'Type'์€ ๋ฐ˜ํ™˜ํ•  ๊ฐ์ฒด์˜ ํƒ€์ž…. BufferedReader br = Files.newBufferedReader(path);
type getType๊ณผ newType์˜ ๊ฐ„๊ฒฐํ•œ ๋ฒ„์ „. List litany = Collections.list(legacyLitany);

โ— ํ•ต์‹ฌ ์ •๋ฆฌ

์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ์™€ public ์ƒ์„ฑ์ž๋Š” ๊ฐ์ž์˜ ์“ฐ์ž„์ƒˆ๊ฐ€ ์žˆ์œผ๋‹ˆ ์ƒ๋Œ€์ ์ธ ์žฅ๋‹จ์ ์„ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์ •์  ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์œ ๋ฆฌํ•œ ๊ฒฝ์šฐ ๊ฐ€ ๋” ๋งŽ์œผ๋ฏ€๋กœ ๋ฌด์ž‘์ • public ์ƒ์„ฑ์ž๋ฅผ ์ œ๊ณตํ•˜๋˜ ์Šต๊ด€์ด ์žˆ๋‹ค๋ฉด ๊ณ ์น˜์ž.

Footnotes

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

    ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด์˜ ๊ฐœ๋…

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