๊ท์น1 : ์์ฑ์ ๋์ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ์๊ฐํด๋ณด๋ผ
๊ท์น1 : ์์ฑ์ ๋์ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ์๊ฐํด๋ณด๋ผ ๊ด๋ จ
Consider static factory methods instead of consturctors
ํด๋์ค๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ(public
์์ฑ์ ์ด์ฉ)๋ง๊ณ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๋ค. ๋ฐ๋ก public static factory method๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
์ฒซ ๋ฒ์งธ ์ฅ์ ์, ์์ฑ์์๋ ๋ฌ๋ฆฌ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋์๋ ์ด๋ฆ(name)์ด ์๋ค
์์ฑ์์ ์ ๋ฌ๋๋ ์ธ์(parameter
)๋ค์ ์ด๋ค ๊ฐ์ฒด๊ฐ ์์ฑ๋๋์ง๋ฅผ ์ค๋ช
ํ์ง ๋ชปํ์ง๋ง, ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ ์ด๋ฆ์ ์ ์ง๊ธฐ๋ง ํ๋ค๋ฉด ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ํด๋ผ์ด์ธํธ ์ฝ๋์ ๊ฐ๋
์ฑ๋ ๋์์ง๋ค. ์๋ฅผ๋ค์ด, ์์์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ BigInteger
๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ฑ์ BigInteger(int, int, Random)
๋ BigInteger.probablePrime
๊ณผ ๊ฐ์ ์ด๋ฆ์ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ก ํํํ์ผ๋ฉด ๋ ์ดํดํ๊ธฐ ์ฌ์ ์ ๊ฒ์ด๋ค.
์ด ๋ฉ์๋๋ JDK 1.4 ๋ฒ์ ์ ๊ฒฐ๊ตญ ์ถ๊ฐ๋จ
๊ฐ์ ์๊ทธ๋์ฒ(๋ฉ์๋์ ํํ๊ฐ ๊ฐ์)๋ฅผ ๊ฐ๋ ์์ฑ์๋ฅผ ์ฌ๋ฌ ๊ฐ ์ ์ํ ํ์๊ฐ ์์ ๋๋ ๊ทธ ์์ฑ์๋ค์ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ก ๋ฐ๊พธ๊ณ , ๋ฉ์๋ ์ด๋ฆ์ ๋ณด๋ฉด ์ฐจ์ด๊ฐ ๋ช ํํ ๋๋ฌ๋๋๋ก ์๋ช ์ ์ ๊ฒฝ์ฐ์.
๋ ๋ฒ์งธ ์ฅ์ ์, ์์ฑ์์๋ ๋ฌ๋ฆฌ ํธ์ถํ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์๊ฐ ์๋ค.
์์ ์ดํด๋ณธ Boolean.valueOf(Boolean)
๋ฉ์๋๋ ์ด ๊ธฐ๋ฒ์ ํ์ฉํ ์ข์ ์ฌ๋ก๋ค. ๊ฒฐ์ฝ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๋๋ค. ๋์ผํ ๊ฐ์ฒด๊ฐ ์์ฒญ๋๋ ์ผ์ด ์ฆ๊ณ , ํนํ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋น์ฉ์ด ํด ๋ ์ ์ฉํ๋ฉด ์ฑ๋ฅ์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์๋ค.
์ธ ๋ฒ์งธ ์ฅ์ ์, ์์ฑ์์๋ ๋ฌ๋ฆฌ ๋ฐํ๊ฐ ์๋ฃํ(return type)์ ํ์ ์๋ฃํ ๊ฐ์ฒด(an object of any subtype)๋ฅผ ๋ฐํํ ์ ์๋ค
๋ฐ๋ผ์ ๋ฐํ๋๋ ํด๋์ค๋ฅผ ์ ํํ ์ ์๋ ์ ์ฐํจ(flexibility)์ ์ ๊ณตํ๋ค. ์ด๊ฑธ ํ์ฉํ๋ฉด public
์ผ๋ก ์ ์ธ๋์ง ์์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ API๋ฅผ ๋ง๋ค ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ๊ตฌํ ์ธ๋ถ์ฌํญ์ ๊ฐ์ถ ์ ์์ผ๋ฏ๋ก ์์ฃผ ๊ฐ๊ฒฐํ API๊ฐ ๊ฐ๋ฅํ๋ค. ์ด ๊ธฐ๋ฒ์ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ ํ๋ ์์ํฌ (interface-based-framework) ๊ตฌํ์ ์ ํฉํ๋ฐ, ์ด ํ๋ ์์ํฌ์์ ์ธํฐํ์ด์ค๋ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋์ ๋ฐํ๊ฐ ์๋ฃํ์ผ๋ก ์ด์ฉ๋๋ค. ์ธํฐํ์ด์ค๋ ์ ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก (Prior to Java 8, interfaces couldn't habve static methods), ๊ด์ต์ ๋ฐํ๊ฐ ์๋ฃํ์ด Type์ด๋ผ๋ ์ด๋ฆ์ ์ธํฐํ์ด์ค์ธ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ Types๋ผ๋ ์ด๋ฆ์ ๊ฐ์ฒด ์์ฑ ๋ถ๊ฐ๋ฅ ํด๋์ค ์์ ๋๋ค.
public class Collections {
// Suppresses default constructor, ensuring non-instantiability.
private Collections() {}
// ...
public static <T> Collection<T> synchronizedCollection(Collection<T> c) {
return new SynchronizedCollection<>(c);
}
static <T> Collection<T> synchronizedCollection(Collection<T> c, Object mutex) {
return new SynchronizedCollection<>(c, mutex);
}
/**
* @serial include
*/
static class SynchronizedCollection<E> implements Collection<E>, Serializable {
private static final long serialVersionUID = 3053995032091335093L;
final Collection<E> c; // Backing Collection
final Object mutex; // Object on which to synchronize
SynchronizedCollection(Collection<E> c) {
this.c = Objects.requireNonNull(c);
mutex = this;
}
// ...
}
}
์๋ฅผ ๋ค์ด, ์๋ฐ์ ์ปฌ๋ ์
ํ๋ ์์ํฌ์๋ 45๊ฐ์ ์ปฌ๋ ์
์ธํฐํ์ด์ค ๊ตฌํ์ฒด๊ฐ ๋ค์ด ์๋๋ฐ, ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ ์ปฌ๋ ์
๊ณผ ๋๊ธฐํ๋ (synchronized) ์ปฌ๋ ์
๋ฑ์ด๋ค. ์ด ๊ตฌํ์ฒด๋ค ๊ฑฐ์ ์ ๋ถ๋ java.util.Collections
๋ผ๋ ๊ฐ์ฒด ์์ฑ ๋ถ๊ฐ๋ฅ ํด๋์ค์ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ํตํด ์ด์ํ๋๋ฐ, ๋ฐํ๋๋ ๊ฐ์ฒด์ ์ค์ ํด๋์ค๋ public
์ด ์๋๋ค. ๊ตฌํ์ฒด๋ณ๋ก 45๊ฐ์ public ํด๋์ค๋ค์ ๋ง๋ค์๋ค๋ฉด ์ปฌ๋ ์
ํ๋ ์์ํฌ API์ ๊ท๋ชจ๋ ๋ ์ปค์ก์ ๊ฒ์ด๋ค.
์ธํฐํ์ด์ค ๊ธฐ๋ฐ ํ๋ ์์ํฌ ๊ธฐ๋ฒ์ ๋จ์ํ API ๊ท๋ชจ๊ฐ ์ค์ด๋ ๊ฒ ์๋๋ผ ๊ฐ๋ ์์ ๋ฌด๊ฒ๊ฐ(conceptual weight)๊ฐ ์ค์ ๊ฒ์ด๋ค. API ์ฌ์ฉ์๋ ๋ฐํ๋ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค์ ๊ท์ ๋ ๋ด์ฉ์ ์ ํํ๊ฒ ๋ฐ๋ฅธ๋ค๋ ์ฌ์ค์ ์๊ณ ์๋ค. ๋ํ ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ๋ ํด๋์ค๊ฐ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ฐธ์กฐํด์ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ ์ผ๋ฐ์ ์ผ๋ก ์ข์ ์ต๊ด์ด๋ค.
3rd edition ์ถ๊ฐ
As of Java 8, the restriction that interfaces cannot contain static
methods was eliminated, so there is typically little reason to provide a noninstantiable companion class for an interface. Many public
static members that would have been at home in such a class should instead be put in the interface itself. Note, however that it may still be necessary to put the bulk of the implementation code behind these static methods in a separate package-private class. This is because Java 8 requires all static members of an interface to be public
. Java 9 allows private static
methods, but static
fields and static member classes are still required to be public
.
์๋ฐ8 ๋ถํฐ๋ ์ธํฐํ์ด์ค์
static
๋ฉ์๋๋ฅผ ํฌํจ์ํฌ ์ ์๋ ์ ์ฝ์ด ์ฌ๋ผ์ก๋ค. ๊ทธ๋์Collection
์ธํฐํ์ด์ค๋ฅผ ์ํดCollections
๊ฐ์ด noninstantiable companion class๋ฅผ ์ ๊ณตํ ์ด์ ๊ฐ ์ค์๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ์ธํฐํ์ด์ค ๋์ ์ ๋ณ๋์ ํด๋์ค์ ๊ตฌํ ์ฝ๋๋ฅผ ๋ค๋ก ๋๋ ๊ฒ์ ํ์ํ๋ค. ์๋ฐ8 ์ธํฐํ์ด์ค์static
๋ฉค๋ฒ๋ค์ด ๋คpublic
์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ธํฐํ์ด์ค์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ฉด, ์ธํฐํ์ด์ค์์ ์์ฑ๋ ๊ตฌํ ํด๋์ค๋ฅผ ์ธํฐํ์ด์ค๊ฐ ์ง์ ์์กดํ๊ฒ ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ธํฐํ์ด์ค๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์์กดํ๋ ๋ฐฉ์์ด ์ข์๋ณด์ด์ง ์๋๋ค. ์๋ฐ9 ๋ถํฐ๋private static
๋ฉ์๋๋ฅผ ํ์ฉํ์ง๋งstatic
ํ๋๋ค andstatic
๋ฉค๋ฒ ํด๋์ค๋ ์ฌ์ ํpublic
์ด๋ค.
A fourth advantage of static factories is that the class of the returned object can vary from call to call as a fuction of the input parameters
๋ค๋ฒ ์งธ ์ฅ์ ์ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋ ์ธ์์ ๋ฐ๋ผ ๋ฐํ๋ ๊ฐ์ฒด๋ฅผ ๋ค์ํ๊ฒ ํ ์ ์๋ค. ๋ฉ์๋์ ์ฃผ์ด์ง๋ ์ธ์๋ฅผ ์ด์ฉํ๋ฉด ์ด๋ค ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ง๋ ๋์ ์ผ๋ก ๊ฒฐ์ ํ ์ ์๋ค. ๋ฐํ๋ ๊ฐ์ฒด์ ํด๋์ค๊ฐ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋์ ๋ฐํ๊ฐ ์๋ฃํ์ ๋ถํฉํ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ๋ฆด๋ฆฌ์ฆ๋ง๋ค ๋ฐํ๋๋ ํด๋์ค๊ฐ ๋ฌ๋ผ์ง ์๋ ์๋ค. EnumSet
์๋ public
์์ฑ์๋ค์ด ์์ผ๋ฉฐ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ค ๋ฟ์ด๋ค.
OpenJDK ๊ตฌํ์ฒด์์ enum ์์ ๊ฐ์์ ๋ฐ๋ผ ๋ ๊ฐ ๊ตฌํ์ฒด ๊ฐ์ด๋ฐ ํ๋๋ฅผ ๊ณจ๋ผ ํด๋น ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ฐํํ๋ค. enum ์์๋ค์ด 64๊ฐ ์ดํ์ผ ๊ฒฝ์ฐ(๋๋ถ๋ถ์ด ๊ทธ๋ ๋ค) ํฉํ ๋ฆฌ ๋ฉ์๋๋ RegularEnumSet ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ฐ, ์ด ๊ฐ์ฒด๋ ๋ด๋ถ์ ์ผ๋ก long ๋ณ์ ํ๋๋ง์ ์ฌ์ฉํ๋ค. enum ์์๋ค์ด 64๊ฐ๋ณด๋ค ๋ง์ ๊ฒฝ์ฐ์๋ JumboEnumSet ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ฐ, ์ด ๊ฐ์ฒด๋ ๋ด๋ถ์ ์ผ๋ก long ํ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
ํด๋ผ์ด์ธํธ๋ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด์ ์ค์ ํด๋์ค๋ฅผ ์ ์๋ ์๊ณ , ์ ํ์๋ ์๋ค. ๋จ์ง EnumSet์ ํ์ ํด๋์ค๋ผ๋ ์ฌ์ค๋ง ์ค์ํ ๋ฟ์ด๋ค.
A fifth advantage of static factories is that the class of the returned object need not exist when the class containing the method is written
๋ค์ฏ๋ฒ ์งธ ์ฅ์ ์ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด์ ํด๋์ค๋ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ์ ์๋ ํด๋์ค์ ์ฝ๋๊ฐ ์์ฑ๋๋ ์๊ฐ์ ์กด์ฌํ์ง ์์๋ ๋ฌด๋ฐฉํ๋ค. JDBC์ ๊ฐ์ ์๋น์ค ์ ๊ณต์ ํ๋ ์์ํฌ์ ๊ทผ๊ฐ์ ์ด๋ฃจ๋ ๊ฒ์ด ๋ฐ๋ก ์ ์ฐํ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ค์ด๋ค.
Service Provider Framework๋ ์ธ ๊ฐ์ง์ ํต์ฌ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋๋ค.
- service interface:
Connection
(์๋น์ค ์ ๊ณต์๊ฐ ๊ตฌํํ๋ค). - provider registration api:
DriverManager.registerDriver
(๊ตฌํ์ฒด๋ฅผ ์์คํ ์ ๋ฑ๋กํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ ์๋๋ก ํ๋ค). - service access api:
DriverManager.getConnection
(ํด๋ผ์ด์ธํธ์๊ฒ ์ค์ ์๋น์ค ๊ตฌํ์ฒด๋ฅผ ์ ๊ณตํ๋ค). - service provider interface(option):
Driver
(์๋น์ค ์ ๊ณต์๊ฐ ๊ตฌํํ๊ณ ์๋น์ค ๊ตฌํ์ฒด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ฒ์ด๋ค. ์๋น์ค ์ ๊ณต์ ์ธํฐํ์ด์ค๊ฐ ์๋ ๊ฒฝ์ฐ ๊ตฌํ์ฒด๋ ํด๋์ค ์ด๋ฆ์ผ๋ก ๋ฑ๋ก๋๋ฉฐ ์๋ฐ์ ๋ฆฌํ๋ ์ ๊ธฐ๋ฅ์ ํตํด ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ง๋ค.)
Connection conn = null;
try {
String url = "jdbc:mysql://localhost:3306/jdbcTest";
String id = "testid";
String pw = "testpw";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,id,pw);
...
์๋น์ค ์ ๊ณต์ ์ธํฐํ์ด์ค์ ๋๋ต์ ์ธ ๋ชจ์ต
// ์๋น์ค ์ธํฐํ์ด์ค ex)Connection
public interface Service {
// ... ์๋น์ค์ ๊ณ ์ ํ ๋ฉ์๋๋ค์ด ์ด ์๋ฆฌ์ ์จ๋ค.
}
// ์๋น์ค ์ ๊ณต์ ์ธํฐํ์ด์ค ex) Driver (์๋น์ค ๊ตฌํ์ฒด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ๊ฒ)
public interface Provider {
Service newService();
}
// ์๋น์ค ๋ฑ๋ก๊ณผ ์ ๊ทผ์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด ์์ฑ ๋ถ๊ฐ๋ฅ ํด๋์ค ex) DriverManager
public class Services {
private Services() {}
// ์๋น์ค ์ด๋ฆ๊ณผ ์๋น์ค ๊ฐ ๋์๊ด๊ณ ๋ณด๊ด
private static final Map<String, Provider> providers =
new ConcurrentHashMap<String, Provider>();
public static final String DEFAULT_PROVIDER_NAME = "<def>";
// ์ ๊ณต์ ๋ฑ๋ก API ex) DriverManager.registerDriver
public static void registerDefaultProvider(Provider p){
registerProvider(DEFAULT_PROVIDER_NAME, p);
}
public static void registerProvider(String name, Provider p){
providers.put(name,p);
}
//์๋น์ค ์ ๊ทผ API ex) DriverManager.getConnection
public static Service newInstance(){
return newInstance(DEFAULT_PROVIDER_NAME);
}
public static Service newInstance(String name) {
Provider p = providers.get(name);
if (p == null) {
throw new IllegalArgumentException("No provider registered with name: "+name);
}
return p.newService();
}
}
์๋ฐ6๋ถํฐ service provider framework๋ฅผ ์ง์ํ๋ ServiceLoader
๊ฐ ์ง์๋๋ค. ๊ทธ๋์ ์ง์ ๋ง๋ค ํ์๋ ์๋ค. JDBC๋ ServiceLoader
๋ณด๋ค ๋จผ์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ServiceLoader
๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ง ์๋ ํด๋์ค๋ฅผ ๋ง๋ค๋ฉด ์๊ธฐ๋ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋, public
์ด๋ protected
๋ก ์ ์ธ๋ ์์ฑ์๊ฐ ์์ผ๋ฏ๋ก ํ์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด, java.util.Collections
์ ๊ตฌํ๋ ํด๋์ค๋ค์ ํธํ๊ฒ ์ฐ๊ธฐ ์ํ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค. ๊ทธ๋ฐ๋ฐ ์ด๊ฑด ํ๋ฆผ์์ด ์ถ๋ณต์ด ๋ ์ ์๋ค. ์๋ํ๋ฉด ์์๋ณด๋ค๋ ๊ตฌ์ฑ(to use composition instead of inheritance)์ด ๋ ์ข๊ธฐ ๋๋ฌธ์ด๋ค.
๋ ๋ฒ์งธ ๋จ์ ์ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ๋ค๋ฅธ ์ ์ ๋ฉ์๋์ ํ์ฐํ ๊ตฌ๋ถ๋์ง ์๋๋ค.
์ง๊ธ์ผ๋ก์ ํด๋์ค๋ ์ธํฐํ์ด์ค ์ฃผ์์ ํตํด ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋์์ ๋๋ฆฌ ์๋ฆฌ๊ฑฐ๋, ์ด๋ฆ์ ์ง์ ๋ ์กฐ์ฌํ๋ ์๋ฐ์ ์๋ค. ๋ณดํต ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋์ ์ด๋ฆ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ ์ฌ์ฉํ๋ค.
A type-conversion method that takes a single parameter and returns a corresponding instance of this type
Date d = Date.from(instant);
ํ๋ณํ ๋ฉ์๋.
BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
valueOf
๋ฅผ ๋ ๊ฐ๋จํ๊ฒ ์ด๊ฒ์ด๋ค. EnumSet
๋๋ถ์ ์ธ๊ธฐ๋ฅผ ๋ชจ์ ์ด๋ฆ์ด๋ค.
Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING);
์ธ์์ ๊ธฐ์ ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ์ง๋ง, ์ธ์์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง ์์ ์๋ ์๋ค. ์ฑ๊ธํค์ผ ๊ฒฝ์ฐ, ์ด ๋ฉ์๋๋ ์ธ์ ์์ด ํญ์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
StackWalker luke = StackWalker.getInstance(options);
getInstance
์ ๊ฐ์ง๋ง ํธ์ถํ ๋๋ง๋ค ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
Object newArray = Array.newInstance(classObject, arrayLen);
getInstance
์ ๊ฐ์ง๋ง, ๋ฐํ๋ ๊ฐ์ฒด์ ํด๋์ค์ ๋ค๋ฅธ ํด๋์ค์ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ์์ ๋ ์ฌ์ฉํ๋ค. Type
์ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ๋ฐํํ ๊ฐ์ฒด์ ์๋ฃํ์ด๋ค.
FileStore fs = Files.getFileStore(path);
newInstance
์ ๊ฐ์ง๋ง, ๋ฐํ๋ ๊ฐ์ฒด์ ํด๋์ค์ ๋ค๋ฅธ ํด๋์ค์ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ์์ ๋ ์ฌ์ฉํ๋ค. Type
์ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ๋ฐํํ ๊ฐ์ฒด์ ์๋ฃํ์ด๋ค.
BufferedReader br = Files.newBufferedReader(path);
A concise alternative to getType
and newType
List<Complaint> litany = Collections.list(legacyLitany);
์์ฝ
์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋์ public
์์ฑ์๋ ์ฉ๋๊ฐ ์๋ก ๋ค๋ฅด๋ฉฐ, ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ๊ณ ๋ คํด ๋ณด์ง๋ ์๊ณ ๋ฌด์กฐ๊ฑด public
์์ฑ์๋ฅผ ๋ง๋๋ ๊ฒ์ ์ผ๊ฐ๊ธฐ ๋ฐ๋๋ค.