์ด ์ฑ ์ ์ฑ๋ฅ์ ์ง์คํ๋ ๋ถ๋ถ์ ๋ง์ง ์๋ค. ๋์ ํ๋ก๊ทธ๋จ์ ๋ช ํํ๊ณ , ์ ํํ๊ณ , ์ ์ฉํ๊ณ , ๊ฒฌ๊ณ ํ๊ณ , ์ ์ฐํ๊ณ , ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ์ง๋๋ฐ ์ง์คํ๋ค.
๊ธฐ์ ์ฉ์ด๋ ๋๋ถ๋ถ ์๋ฐ8์ฉ ์ธ์ด ๋ช ์ธ๋ฅผ ๋ฐ๋ฅด๋ฉฐ, ์๋ฐ๊ฐ ์ง์ํ๋ ํ์ ์ ์ธํฐํ์ด์ค(interface), ํด๋์ค(class), ๋ฐฐ์ด(array), ๊ธฐ๋ณธ ํ์ (primitive) ์ด ๋ค ๊ฐ์ง๋ค.
์ธํฐํ์ด์ค์ ์ผ์ข
ํด๋์ค์ ์ผ์ข
์ธํฐํ์ด์ค, ํด๋์ค, ๋ฐฐ์ด
์ฆ, ํด๋์ค์ ์ธ์คํด์ค์ ๋ฐฐ์ด์
๊ฐ์ฒด(object)์ธ ๋ฐ๋ฉด, ๊ธฐ๋ณธ ํ์ ๊ฐ์ ๊ทธ๋ ์ง ์๋ค.
- ํ๋(field)
- ๋ฉ์๋(method)
- ๋ฉค๋ฒ ํด๋์ค
- ๋ฉค๋ฒ ์ธํฐํ์ด์ค
๋ฉ์๋ ์๊ทธ๋์ฒ๋ ๋ฉ์๋ ์ด๋ฆ๊ณผ ์
๋ ฅ ๋งค๊ฐ๋ณ์(parameter)์ ํ์
๋ค๋ก ์ด๋ค์ง๋ค.(๋ฐํ๊ฐ์ ํ์
์ ์๊ทธ๋์ฒ์ ํฌํจ๋์ง ์๋๋ค)
๋จ, ์ผ๋ถ ์ฉ์ด๋ ์๋ฐ ์ธ์ด ๋ช ์ธ์ ๋ค๋ฅด๊ฒ ์ฌ์ฉํ๋ค. ์๋ฐ ์ธ์ด ๋ช ์ธ์๋ ๋ฌ๋ฆฌ ์ด ์ฑ ์ ์์(inheritance)์ ์๋ธํด๋์ฑ(subclassing)๊ณผ ๋์๋ก ์ด๋ค.
์ธํฐํ์ด์ค ์์ ๋์
โ๏ธ ํด๋์ค๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค(implemetent)
โ๏ธ ์ธํฐํ์ด์ค๊ฐ ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํ๋ค(extend)
ํ๋ก๊ทธ๋๋จธ๊ฐ ํด๋์ค, ์ธํฐํ์ด์ค, ํจํค์ง๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋ ๋ชจ๋ ํด๋์ค, ์ธํฐํ์ด์ค, ์์ฑ์, ๋ฉค๋ฒ, ์ง๋ ฌํ๋ ํํ(serialiozed form)์ ๋งํ๋ค.
API๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ ์์ฑ์(์ฌ๋)์ ๊ทธ API์ ์ฌ์ฉ์๋ผ๊ณ ํจ
API๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค(์ฝ๋)๋ ๊ทธ API์ ํด๋ผ์ด์ธํธ
๊ฐ์ฒด์ ์์ฑ๊ณผ ํ๊ดด๋ฅผ ๋ค๋ฃฌ 2์ฅ์ผ๋ก, ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํ ๋์ ๋ง๋ค์ง ๋ง์์ผ ํ ๋๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ ๋ฑ์ ์์๋ด
ํด๋ผ์ด์ธํธ๊ฐ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ป๋ ์ ํต์ ์ธ ์๋จ์ public ์์ฑ์๋ค.
ํ์ง๋ง 1๊ฐ์ง ๋ ํด๋์ค๋ ์์ฑ์์ ๋ณ๋๋ก ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋(static factory method)๋ฅผ ์ ๊ณตํ ์ ์๋ค.
๊ทธ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๋จ์ํ ์ ์ ๋ฉ์๋ ๋ง์ด๋ค.
์ด ๋ฉ์๋๋ ๊ธฐ๋ณธ ํ์ ์ธ boolean ๊ฐ์ ๋ฐ์ Boolean ๊ฐ์ฒด ์ฐธ์กฐ๋ก ๋ณํํด ์ค๋ค.
public static Boolean valusOf(boolean b){
return b ? Boolean.TRUE : Boolean.FALSE;
}
โ
์ฌ๊ธฐ์ ์๊ธฐํ๋ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋์ธ ํจํด์์์ ํฉํฐ๋ฆฌ ๋ฉ์๋(Factory Method)์ ๋ค๋ฅธ๋ค. ๋์์ธ ํจํด ์ค์๋ ์ด์ ์ผ์นํ๋ ํจํด์ ์๋ค.
public static Boolean valueOf(boolean b) {
return new Boolean(b); // ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑ
}
์์ฑ์์ ๋๊ธฐ๋ ๋งค๊ฐ๋ณ์์ ์์ฑ์ ์์ฒด๋ง์ผ๋ก๋ ๋ฐํ๋ ๊ฐ์ฒด์ ํน์ฑ์ ์ ๋๋ก ์ค๋ช ๋ชปํ์ง๋ง, ์ ์ ํฉํ ๋ฆฌ์ ๊ฒฝ์ฐ, ์ด๋ฆ๋ง ์ ์ง์ผ๋ฉด ์ฝ๊ฒ ๋ฌ์ฌ ๊ฐ๋ฅํ๋ค.
๋ฟ๋ง ์๋๋ผ, ํ๋์ ์๊ทธ๋์ฒ๋ก๋ ์์ฑ์๋ฅผ ํ๋๋ง ๋ง๋ค ์ ์๋ค. ์์ฑ์๊ฐ ์ด๋ค ์ญํ ์ ํ๋ ์ง ์ ํํ ๊ธฐ์ตํ๊ธฐ ์ด๋ ค์ ์๋ฑํ ๊ฒ์ ํธ์ถํ๋ ์ค์๋ฅผ ํ ์ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด๋ฆ์ ๊ฐ์ง ์ ์๋ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฐ๋ ๊ฒ์ด ์ข๋ค. ์ด๋ฐ ์ ์ฝ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํ ํด๋์ค ์ ์๊ทธ๋์ฒ๊ฐ ๊ฐ์ ์์ฑ์๊ฐ ์ฌ๋ฌ ๊ฐ ํ์ํ ๊ฒ ๊ฐ์ผ๋ฉด, ์์ฑ์๋ฅผ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ก ๋ฐ๊พธ๊ณ ๊ฐ๊ฐ์ ์ฐจ์ด๋ฅผ ์ ๋๋ฌ๋ด๋ ์ด๋ฆ์ ์ง์ด์ฃผ์
๋๋ถ์ ๋ถ๋ณ ํด๋์ค(immutable class๏ผ ์์ดํ
17๋ ์ธ์คํด์ค๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ฑฐ๋ ์๋ก ์์ฑํ ์ธ์คํด์ค๋ฅผ ์บ์ฑํ์ฌ ์ฌํ์ฉํ๋ ์์ผ๋ก ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํ ์ ์๋ค.
๋ฐ๋ผ์๏ผํนํ ์์ฑ ๋น์ฉ์ด ํฐ) ๊ฐ์ ๊ฐ์ฒด๊ฐ ์์ฃผ ์์ฒญ๋๋ ์ํฉ ์ด๋ผ๋ฉด ์ฑ๋ฅ์ ๋์ด์ฌ๋ ค ์ค๋ค. ํ๋ผ์ด์จ์ดํธ ํจํด(Flyweight pattern)1๋ ์ด์ ๋น์ทํ ๊ธฐ๋ฒ์ด๋ผ ํ ์ ์๋ค.
์ธ์คํด์ค ํต์ ๏ผinstance-controlled) ํด๋์ค
๋ฐ๋ณต๋๋ ์์ฒญ์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ์์ผ๋ก ์ ์ ํฉํฐ๋ฆฌ ๋ฐฉ์์ ํด๋์ค๋ ์ธ์ ์ด๋ ์ธ์คํด์ค๋ฅผ ์ด์ ์๊ฒ ํ ์ง๋ฅผ ํต์ ํ ์ ์๋ค.
์ธ์คํด์ค๋ฅผ ํต์ ํ๋ ์ด์ ๋?
- ํด๋์ค๋ฅผ ์ฑ๊ธํด์ผ๋ก ๋ง๋ค์๋, ์ธ์คํด์คํ ๋ถ๊ฐ๋ก ๋ง๋ค ์๋ ์๋ค.
์ฑ๊ธํด ํจํด(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() ๊ฐ์ ์ ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ถ๋ณ ๊ฐ ํด๋์ค์์ ๋์น์ธ ์ธ์คํด์ค๊ฐ ๋จ ํ๋๋ฟ์์ ๋ณด์ฅํ ์ ์๋ค.( 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)์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํฉ๋๋ค.
- ์ธ์คํด์ค ํต์ ๋ ํ๋ผ์ด์จ์ดํธ ํจํด์ ๊ทผ๊ฐ์ด ๋๋ฉฐ, ์ด๊ฑฐ ํ์ ์ ์ธ์คํด์ค๊ฐ ํ๋๋ง ๋ง๋ค์ด์ง ๋ณด์ฅ
-
ํ๋ผ์ด์จ์ดํธ ํจํด๊ณผ ์ธ์คํด์ค ํต์
ํ๋ผ์ด์จ์ดํธ ํจํด(Flyweight Pattern)์ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๋ฒ ์์ฑํ์ง ์๊ณ , ๋์ผํ ์ํ๋ฅผ ๊ณต์ ํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋์์ธ ํจํด์ ๋๋ค. ํ๋ผ์ด์จ์ดํธ ํจํด์์ ์ธ์คํด์ค ํต์ ๊ฐ ์ค์ํ ์ด์ ๋, ๊ฐ์ฒด ์์ฑ์ด ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ฒฝ์ฐ์ ๋์ผํ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ ๊ฐ ์์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ด๋ ๊ฒ์ด ๋ชฉํ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ง์ ๋ฌธ์๋ฅผ ์ถ๋ ฅํ๋ ํ ์คํธ ํธ์ง๊ธฐ์์ ๊ฐ ๋ฌธ์๋ฅผ ๊ฐ์ฒด๋ก ํํํ๋ค๋ฉด, ๋์ผํ ๋ฌธ์์ ๋ํด ๋งค๋ฒ ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑํ์ง ์๊ณ ํ๋์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ๋๋ก ํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค. ์ด๋, ๋์ผํ ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด๋ ํญ์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
ํ๋ผ์ด์จ์ดํธ ํจํด์ ํต์ฌ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅํ ํ ๋ง์ด ๊ณต์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ด๋ ๊ฒ์ ๋๋ค. ์ธ์คํด์ค ํต์ ๋ ์ด ํจํด์ ๊ทผ๊ฐ์ ์ด๋ฃจ๋ฉฐ, ์ด๋ฅผ ํตํด ๊ฐ์ฒด ์์ฑ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํฉ๋๋ค.
์ด๊ฑฐํ(enum)๊ณผ ์ธ์คํด์ค ํ๋๋ง ์์ฑ ๋ณด์ฅ
์๋ฐ์์ ์ด๊ฑฐํ(enum)์ ์๋์ผ๋ก ์ธ์คํด์ค ํ๋๋ง ์์ฑ๋๋๋ก ๋ณด์ฅํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๊ฑฐํ์ ์๋ฐ์์ ์ฑ๊ธํด ํจํด์ ๊ตฌํํ๋ ๊ฐ์ฅ ์์ ํ๊ณ ๊ฐ๋จํ ๋ฐฉ๋ฒ ์ค ํ๋์ ๋๋ค.
์ด๊ฑฐํ์ JVM์ ์ํด ์ธ์คํด์ค๊ฐ ํ ๋ฒ๋ง ์์ฑ๋๋ฉฐ, ํ๋ก๊ทธ๋จ ๋ด์์ ํด๋น ์ธ์คํด์ค๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ ์ด๊ฑฐํ ์์๋ ํ๋์ ์ธ์คํด์ค๋ง ์ ์งํ๋ฉฐ, ๋์ผํ ์ด๊ฑฐํ ๊ฐ์ ๋ํด์๋ ํญ์ ๊ฐ์ ์ธ์คํด์ค๊ฐ ๋ฐํ๋ฉ๋๋ค.
public enum SingletonEnum {
INSTANCE;
public void someMethod() {
// ๋์ ์ ์
}
}์์ SingletonEnum ํด๋์ค๋ ์๋ฐ์์ ์ด๊ฑฐํ์ผ๋ก ๊ตฌํ๋ ์ฑ๊ธํด์
๋๋ค. INSTANCE๋ ํ๋ก๊ทธ๋จ ์คํ ์ค์ ์ค์ง ํ๋์ ์ธ์คํด์ค๋ง ์์ฑ๋์ด ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด๊ฑฐํ์ ์ฌ์ฉํ๋ฉด ์ธ์คํด์ค๊ฐ ํ๋๋ง ์์ฑ๋จ์ด ๋ณด์ฅ๋ฉ๋๋ค.
- ์ฑ๊ธํด ํจํด: ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ค์ง ํ๋๋ง ๋ง๋ค๋๋ก ๋ณด์ฅํ๋ ํจํด.
- ์ธ์คํด์คํ ๋ถ๊ฐ ํด๋์ค: ํด๋์ค์ ๊ฐ์ฒด ์์ฑ์ ๋ง๊ณ ์ ์ ๋ฉ์๋๋ก๋ง ์ฌ์ฉ๋๋๋ก ํ๋ ์ค๊ณ.
- ๋ถ๋ณ ๊ฐ ํด๋์ค์ ๋์น์ฑ ๋ณด์ฅ: ๋์ผํ ๊ฐ์ ๊ฐ์ง ์ธ์คํด์ค๋ ํ๋๋ง ์์ฑํ์ฌ
==๋น๊ต๊ฐ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ. - ํ๋ผ์ด์จ์ดํธ ํจํด: ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๋ฒ ์์ฑํ์ง ์๊ณ ์ฌ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ํจํด.
- ์ด๊ฑฐํ(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 ๋ฐฐ์ด๋ก ์์๋ฅผ ๊ด๋ฆฌํ๋ค.
- ์์๊ฐ 64๊ฐ ์ดํ๋ฉด,
- ํด๋ผ์ด์ธํธ๋ ์ด ๋ ํด๋์ค(
RegularEnumSet๊ณผJumboEnumSet)์ ์กด์ฌ๋ฅผ ๋ชจ๋ฅธ๋ค. ๋จ์งEnumSet์ธ์คํด์ค๋ง ๋ฐ๋๋ค. - ๋ง์ฝ ๋ค์ ๋ฆด๋ฆฌ์ค์์
RegularEnumSet์ด ํ์ ์์ด์ง๋ค๋ฉด, ์ด๋ฅผ ์ญ์ ํด๋ ํด๋ผ์ด์ธํธ ์ฝ๋์๋ ์ํฅ์ด ์๋ค. - ๋์๊ฐ, ์ฑ๋ฅ์ ๋ ๊ฐ์ ํ ์๋ก์ด ํด๋์ค๋ฅผ ์ถ๊ฐํ ์๋ ์๋๋ฐ, ์ญ์ ํด๋ผ์ด์ธํธ๋ ์ด๋ฅผ ์๊ฑฐ๋ ๊ณ ๋ คํ ํ์๊ฐ ์๋ค.
- ์ค์ํ ์ ์, ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ๋ ๊ฐ์ฒด๊ฐ ์ด๋ค ๊ตฌ์ฒด์ ์ธ ํ์ ํด๋์ค์ธ์ง ์ ํ์๊ฐ ์๊ณ , ์์ง ์์๋ ์ ๋๋ก ์๋ํ๋ค๋ ๊ฒ์ด๋ค.
๐ฌ ํ์ด์ ์ค๋ช ํ์๋ฉด,
-
์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋:
EnumSetํด๋์ค๋ public ์์ฑ์๋ฅผ ์ ๊ณตํ์ง ์๊ณ , ๋์ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ง์ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ ์ฐํ ๋ฐฉ๋ฒ์ผ๋ก, ์์ฑ์์ ๋ฌ๋ฆฌ ์ฌ๋ฌ ๊ฐ์ง ๋ฐํ ํ์ ์ ์ ๊ณตํ๊ฑฐ๋ ์บ์ฑ์ ํตํด ๊ฐ์ฒด ์์ฑ์ ์ ์ดํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด,
EnumSet.of()๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํดEnumSet์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์ ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ด๋ค ํน์ ํ์ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ์ ํฉํ ๋ฆฌ ๋ฉ์๋(of())๋ง ํธ์ถํ์ฌEnumSet์ ๋ฐ์ ๋ฟ์ ๋๋ค. -
๋ด๋ถ ๊ตฌํ์ ์บก์ํ:
EnumSetํด๋์ค๋ ๋ด๋ถ์ ์ผ๋ก ๋ ๊ฐ์ง ํ์ ํด๋์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.RegularEnumSet: ์์์ ๊ฐ์๊ฐ 64๊ฐ ์ดํ์ผ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ, ๋จ์ผlong๋ณ์๋ฅผ ์ฌ์ฉํด 64๋นํธ ๋ด์์ ์์๋ค์ ๊ด๋ฆฌํ ์ ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ฑ๋ฅ์ด ๋งค์ฐ ํจ์จ์ ์ ๋๋ค.JumboEnumSet: ์์์ ๊ฐ์๊ฐ 65๊ฐ ์ด์์ผ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ, ๋จ์ผlong๋ณ์๋ก๋ ๋ชจ๋ ์์๋ฅผ ๊ด๋ฆฌํ ์ ์์ผ๋ฏ๋ก long ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์์๋ค์ ๊ด๋ฆฌํฉ๋๋ค.
์ด ๊ตฌ์กฐ๋ ์ฑ๋ฅ์ ๊ทน๋ํํ๋ ค๋ ๋ชฉ์ ์์ ๋ง๋ค์ด์ก์ง๋ง, ํด๋ผ์ด์ธํธ๋ ์ด ๋ ๊ฐ์ง ํ์ ํด๋์ค์ ์กด์ฌ๋ฅผ ์ ํ ์ ํ์๊ฐ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋
EnumSetํฉํ ๋ฆฌ ๋ฉ์๋๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง๋ง, ์ค์ ๋ก ์ด๋ค ๊ตฌ์ฒด์ ์ธ ํด๋์ค(RegularEnumSet๋๋JumboEnumSet)๊ฐ ๋ฐํ๋๋์ง๋ ๋ชฐ๋ผ๋ ๊ด์ฐฎ์ต๋๋ค. ์ด๊ฒ์ด ์บก์ํ์ ํต์ฌ์ ๋๋ค. -
๋ฏธ๋์ ์ ์ฐ์ฑ:
- ๋ง์ฝ ์ถํ ๋ฆด๋ฆฌ์ค์์
RegularEnumSet์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ๊ฒฐ์ ํ๋ฉด, ์ด๋ฅผ ์ญ์ ํ๋๋ผ๋ ํด๋ผ์ด์ธํธ์ ์ฝ๋์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋EnumSetํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๋ฐํ๋ ๊ฐ์ฒด๊ฐ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ํ์ ํด๋์ค์ธ์ง๋ ์ค์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด์ฒ๋ผ ๋ด๋ถ ๊ตฌํ์ ์์ ๋กญ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ ์ ์ฐ์ฑ์ ํ๋ณดํ ์ ์์ต๋๋ค. - ๋ฐ๋๋ก, ์๋ก์ด ์ฑ๋ฅ ๊ฐ์ ๊ธฐ๋ฒ์ ์ ์ฉํ ์ธ ๋ฒ์งธ, ๋ค ๋ฒ์งธ ํด๋์ค๋ฅผ ์ถ๊ฐํ์ฌ๋ ํด๋ผ์ด์ธํธ๋ ์ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ด๋ถ ๊ตฌํ์ด ํด๋ผ์ด์ธํธ์๊ฒ ํฌ๋ช ํ๊ฒ ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค.
- ๋ง์ฝ ์ถํ ๋ฆด๋ฆฌ์ค์์
-
๋คํ์ฑ์ ํ์ฉ:
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์ ๊ฐ์ ์์คํ ์์ ์ฌ์ฉ
ํจํด์ ์ธ ๊ฐ์ง ํต์ฌ ์ปดํฌ๋ํธ
- ์๋น์ค ์ธํฐํ์ด์ค (Service Interface):
- ์๋น์ค ์ ๊ณต์๊ฐ ๊ตฌํํด์ผ ํ ๊ธฐ๋ฅ๊ณผ ๋์์ ์ ์ํ๋ ์ธํฐํ์ด์ค
- ์๋ฅผ ๋ค์ด, JDBC์์ Connection์ด ์๋น์ค ์ธํฐํ์ด์ค ์ญํ ์ ํ๋ค. ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ๋ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๋ค.
- ์ ๊ณต์ ๋ฑ๋ก API (Provider Registration API):
- ์๋น์ค ์ ๊ณต์๊ฐ ์์ ์ ๊ตฌํ์ฒด๋ฅผ ๋ฑ๋กํ๋ ๋ฐ ์ฌ์ฉํ๋ API
- ์๋ฅผ ๋ค์ด, JDBC์์
DriverManager.registerDriver()๊ฐ ์ ๊ณต์ ๋ฑ๋ก API ์ญํ ์ ํ๋ค. ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ๋ ์์ ์ ์ด API์ ๋ฑ๋กํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ ๋ค.
- ์๋น์ค ์ ๊ทผ 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์ ์์ ์ ๋ฑ๋กํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
๐ฌ ๋ณํ ๋ฐ ํ์ฅ
- ๋ธ๋ฆฌ์ง ํจํด(Bridge Pattern): ์๋น์ค ์ ๊ทผ API๋ ์๋น์ค ์ ๊ณต์๊ฐ ์ ๊ณตํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๊ธฐ๋ฅ์ ํฌํจํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ ํ๋ถํ ์ธํฐํ์ด์ค๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๊ณตํ ์ ์๋ค.
- ์์กด์ฑ ์ฃผ์ (Dependency Injection): ์์กด์ฑ ์ฃผ์ ํ๋ ์์ํฌ ๋ํ ๊ฐ๋ ฅํ ์๋น์ค ์ ๊ณต์ ํ๋ ์์ํฌ์ ๋ณํ์ผ๋ก ๊ฐ์ฃผํ ์ ์๋ค. ์ด ํ๋ ์์ํฌ๋ ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ์ฃผ์ ํด์ฃผ๋ ์์คํ ์ผ๋ก, ์๋น์ค ์ ๊ณต์์ ์ญํ ์ ์ํํ๋ค.
ServiceLoader(์๋ฐ 6๋ถํฐ ์ ๊ณต): ์๋ฐ 6๋ถํฐ๋java.util.ServiceLoader๋ผ๋ ๋ฒ์ฉ ์๋น์ค ์ ๊ณต์ ํ๋ ์์ํฌ๊ฐ ์ ๊ณต๋๋ค. ์ด๋ฅผ ํตํด ์ง์ ์๋น์ค ์ ๊ณต์ ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค ํ์ ์์ด ๊ฐํธํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ก๋ํ๊ณ ์ฌ์ฉํ ์ ์๋ค.ServiceLoader๋ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ตฌํ์ฒด๋ฅผ ์ฐพ๊ณ ๋ก๋ํ๋ ๋ฒ์ฉ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ ์๋น์ค ์ ๊ณต์๊ฐ ์กด์ฌํ๋๋ผ๋ ์์ฝ๊ฒ ์๋น์ค๋ฅผ ์ฌ์ฉํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค.
- ์ ์ฐ์ฑ: ํน์ ๊ตฌํ์ฒด์ ์์กดํ์ง ์๊ณ ๋ค์ํ ๊ตฌํ์ฒด๋ฅผ ๊ต์ฒดํ๊ฑฐ๋ ์ถ๊ฐํ ์ ์์ด ์ ์ฐํ ์ค๊ณ๊ฐ ๊ฐ๋ฅ
- ํ์ฅ์ฑ: ์๋ก์ด ๊ตฌํ์ฒด๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํด๋ ํด๋ผ์ด์ธํธ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ ์์คํ ํ์ฅ์ ์ ๋ฆฌ
- ์ฌ์ฌ์ฉ์ฑ: ๋์ผํ ์๋น์ค ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ฌ๋ฌ ์ ๊ณต์๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ด ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ ์ ์ง๋ณด์๋ฅผ ์ฝ๊ฒ ํ ์ ์๋ค.
์๋น์ค ์ ๊ณต์ ์ธํฐํ์ด์ค(Service Provider Interface)๋ ์ข ์ข ์ถ๊ฐ๋๋ ๋ค ๋ฒ์งธ ์ปดํฌ๋ํธ๋ก, ์๋น์ค ์ธํฐํ์ด์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ํฉํ ๋ฆฌ ์ญํ ์ ํ๋ค. ์๋ฐ์์๋
java.util.ServiceLoader๋ผ๋ ๋ฒ์ฉ ์๋น์ค ์ ๊ณต์ ํ๋ ์์ํฌ๊ฐ ์ ๊ณต๋จ
โ ์์์ ํ๋ ค๋ฉด, 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
-
ํ๋ผ์ด์จ์ดํธ ํจํด(Flyweight Pattern)์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํ ๋์์ธ ํจํด์ ๋๋ค. ์ด ํจํด์ ์ฃผ๋ก ๊ฐ์ ์ข ๋ฅ์ ๊ฐ์ฒด๋ฅผ ๋๋์ผ๋ก ์์ฑํ ๋ ์ ์ฉํฉ๋๋ค. ํนํ, ๊ฐ์ฒด ์์ฑ ๋น์ฉ์ด ํฌ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ์ค์ํ ์ํฉ์์ ์ฑ๋ฅ์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์์ต๋๋ค.
ํ๋ผ์ด์จ์ดํธ ํจํด์ ๊ฐ๋
ํ๋ผ์ด์จ์ดํธ ํจํด์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅํ ํ ๋ง์ด ๊ณต์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ด๋ ค๋ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ฐ์ ์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ ๊ฐ ํ์ํ ๊ฒฝ์ฐ, ํด๋น ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑํ๋ ๋์ ์ด๋ฏธ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ทจํฉ๋๋ค. โฉ