DevLog 😢

[μ΄νŒ©ν‹°λΈŒμžλ°”] μ•„μ΄ν…œ 01. μƒμ„±μž λŒ€μ‹  정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό κ³ λ €ν•˜λΌ λ³Έλ¬Έ

πŸ“–/Effective Java

[μ΄νŒ©ν‹°λΈŒμžλ°”] μ•„μ΄ν…œ 01. μƒμ„±μž λŒ€μ‹  정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό κ³ λ €ν•˜λΌ

dolmeng2 2023. 2. 28. 00:44

πŸ’¬ μ΄νŒ©ν‹°λΈŒμžλ°” 챕터 1을 읽고 μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.


 

βœ”οΈ 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλž€?

μš°ν…Œμ½” λ―Έμ…˜μ„ μ§„ν–‰ν•˜λ©΄μ„œ, 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό 정말 많이 μ‚¬μš©ν•˜μ˜€λ‹€. 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλž€, 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜λŠ” 정적 λ©”μ„œλ“œμ΄λ‹€. 즉, μƒμ„±μž 역할을 ν•˜λ©΄μ„œλ„ 객체λ₯Ό μƒμ„±ν•˜κΈ° 전에 1차적으둜 ν†΅κ³Όν•˜λŠ” 'λ¬Έ' 같은 μ‘΄μž¬λΌκ³ λ„ λ³Ό 수 μžˆλ‹€. 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ–΄λ–€ 점이 μ’‹μ„κΉŒ?

 

πŸ’¬ λ™μΌν•œ μ‹œκ·Έλ‹ˆμ²˜λΌλ„, 이름에 따라 μƒˆλ‘­κ²Œ 생성해쀄 수 μžˆλ‹€.

μ–΄λŠ λ‚ , μš°ν…Œμ½”μ— 크루 신청을 ν•˜κΈ° μœ„ν•΄ μ‹ μ²­μ„œλ₯Ό μž‘μ„±ν•˜κ³  μžˆμ—ˆλ‹€. μ΄λ•Œ, λ‹‰λ„€μž„μ„ 아직 μ •ν•˜μ§€ λͺ»ν•œ ν¬λ£¨λŠ” 이름과 λ‚˜μ΄, 그리고 κ³Όμ •λ§Œμ„ 가지고 크루λ₯Ό μ‹ μ²­ν•˜κ³  μ‹Άμ—ˆλ‹€.

public class Crew {
    private String name;
    private String nickname;
    private int age;
    private Course course;

    public Crew(final String name,  final int age, final Course course) {
        this.name = name;
        this.age = age;
        this.course = course;
    }
}

κ·ΈλŸ¬λ‚˜, 또 κ°œμΈμ •λ³΄ λ³΄ν˜Έμ— ꡉμž₯히 λ―Όκ°ν–ˆλ˜ ν•œ ν¬λ£¨λŠ” λ‚˜μ΄λŠ” μ•Œλ €μ£Όκ³  싢지 μ•Šμ•„μ„œ λ‹‰λ„€μž„κ³Ό 이름, 그리고 κ³Όμ •λ§Œ λ°›μ•„μ„œ 크루 μ‹ μ²˜μ—‡λ₯Ό λ‚΄λ €κ³  ν•œλ‹€.

public class Crew {
    private String name;
    private String nickname;
    private int age;
    private Course course;

    public Crew(final String name, final int age, final Course course) {
        this.name = name;
        this.age = age;
        this.course = course;
    }

    public Crew(final String name, final String nickname, final Course course) {
        this.name = name;
        this.nickname = nickname;
        this.course = course;
    }
}

κ·ΈλŸ¬λ‹€, 또 μ–΄λ–€ ν¬λ£¨λŠ” λ‹‰λ„€μž„, λ‚˜μ΄, 그리고 κ³Όμ •λ§Œμ„ 가지고 크루 μ‹ μ²­μ„œλ₯Ό λ‚΄λ €κ³  ν•œλ‹€. μ΄λ•Œ, ν•œ 가지 λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

public class Crew {
    private String name;
    private String nickname;
    private int age;
    private Course course;

    // ERROR 
    public Crew(final String name, final int age, final Course course) {
        this.name = name;
        this.age = age;
        this.course = course;
    }

    // ERROR
    public Crew(final String nickname, final int age, final Course course) {
        this.nickname = nickname;
        this.age = age;
        this.course = course;
    }

    public Crew(final String name, final String nickname, final Course course) {
        this.name = name;
        this.nickname = nickname;
        this.course = course;
    }
}

λ°”λ‘œ, λ™μΌν•œ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό 가진 μƒμ„±μžλ₯Ό 또 μ„ μ–Έν•  수 μ—†λŠ” 것이닀. κ·ΈλŸ¬λ‚˜, 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜λ©΄ μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄μ†Œν•  수 μžˆλ‹€. μ΄λ•Œ, 각각의 차이λ₯Ό 잘 λ“œλŸ¬λ‚΄λŠ” 이름을 지어쀀닀면 더 λ² μŠ€νŠΈμ΄λ‹€.

public class Crew {
    private String name;
    private String nickname;
    private int age;
    private Course course;

    private Crew() {
        // μ™ΈλΆ€μ—μ„œ μΈμŠ€ν„΄μŠ€ν™” 막기
    }

    public static Crew createByName(final String name, final int age, final Course course) {
        Crew crew = new Crew();
        crew.name = name;
        crew.age = age;
        crew.course = course;
        return crew;
    }

    public static Crew createByNickname(final String nickname, final int age, final Course course) {
        Crew crew = new Crew();
        crew.nickname = nickname;
        crew.age = age;
        crew.course = course;
        return crew;
    }
}

μœ„μ™€ 같이 λ©”μ„œλ“œλͺ…에 따라 μ›ν•˜λŠ” ν•„λ“œλ₯Ό μ£Όμž…λ°›μ•„ μƒˆλ‘œμš΄ 객체λ₯Ό 생성해쀄 수 있으며, λ™μΌν•œ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό 가지더라도 μ›ν•˜λŠ” νŠΉμ„±μ„ κ°€μ§€λŠ” 객체λ₯Ό λ§Œλ“€μ–΄λ‚Ό 수 있게 λœλ‹€. (μƒμ„±μžλ₯Ό 톡해 ν•΄κ²°ν•˜λ €κ³  ν–ˆλ‹€λ©΄, μ•„λ§ˆ flagλ₯Ό λ‘κ±°λ‚˜ 인자둜 λ‹€ λ°›μ•„μ„œ μ²˜λ¦¬ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μ½”λ“œκ°€ 맀우 λ³΅μž‘ν•˜κ³  λ”λŸ¬μ›Œμ‘Œμ„ 것이닀 πŸ₯²)


 

πŸ’¬ 호좜될 λ•Œλ§ˆλ‹€ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜κ²Œ 되면, newλ₯Ό 톡해 계속 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ²Œ 되기 λ•Œλ¬Έμ— κΌ­ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€κ°€ ν•„μš”ν•œ 상황이 μ•„λ‹ˆλΌλ©΄ λ‚­λΉ„κ°€ 될 μˆ˜λ„ μžˆλ‹€. μ΄λ•Œ, 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜λ©΄ μΈμŠ€ν„΄μŠ€λ₯Ό 미리 λ§Œλ“€μ–΄ λ‘κ±°λ‚˜, ν˜Ήμ€ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μΊμ‹±ν•˜μ—¬ μž¬ν™œμš©ν•˜λŠ” μ‹μœΌλ‘œ λΆˆν•„μš”ν•œ 객체 생성을 ν”Όν•  수 μžˆλ‹€. (ex. ν”ŒλΌμ΄μ›¨μ΄νŠΈ νŒ¨ν„΄) μ΄λŠ”, λ°˜λ³΅λ˜λŠ” μš”μ²­μ— λŒ€ν•΄ 같은 객체λ₯Ό λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ—, μΈμŠ€ν„΄μŠ€μ— λŒ€ν•΄ ν†΅μ œκ°€ κ°€λŠ₯해진닀.

 

 

πŸ’‘ ν”ŒλΌμ΄μ›¨μ΄νŠΈ νŒ¨ν„΄μ΄λž€?

: μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λŠ₯ν•œλ§ŒνΌ κ³΅μœ ν•˜μ—¬, newλ₯Ό ν†΅ν•œ λ©”λͺ¨λ¦¬ λ‚­λΉ„λ₯Ό μ€„μ΄λŠ” 방식이닀.

map을 ν†΅ν•΄μ„œ 관리λ₯Ό μ§„ν–‰ν•˜κ³ , ν•˜λ‚˜μ˜ νŠΉμ„±μ„ key둜 μž‘μ•„, ν•΄λ‹Ή keyκ°€ μ‘΄μž¬ν•œλ‹€λ©΄ 이미 μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜κ³ , μ•„λ‹ˆλΌλ©΄ μƒˆλ‘œ μƒμ„±ν•΄μ£ΌλŠ” 방법이닀. λ‹€λ§Œ, 이 방법은 μΈμŠ€ν„΄μŠ€κ°€ 맀우 많이 ν•„μš”ν•˜λ©΄μ„œλ„ μ‚¬μš©λ˜λŠ” νšŸμˆ˜κ°€ 많고, λͺ¨λ‘ λ™μΌν•œ 둜직으둜 μ œμ–΄κ°€ κ°€λŠ₯ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

 

μ΄λŠ”, 객체듀을 κ³΅μœ ν•˜κ³  있기 λ•Œλ¬Έμ—, μ„œλ‘œ λ‹€λ₯Έ 객체이더라도 동일성을 μ–΄λ–€ μ‹μœΌλ‘œ μ²΄ν¬ν•˜λŠ”μ§€μ— 따라 λ™μΌν•œ 객체라고 받아듀일 수 있기 λ•Œλ¬Έμ—, μ›¬λ§Œν•˜λ©΄ 곡유 객체듀을 μ‚¬μš©ν•˜λ”λΌλ„ λ¬Έμ œκ°€ μ—†λŠ” 경우 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

ν”ŒλΌμ΄μ›¨μ΄νŠΈ νŒ¨ν„΄μ„ μ‚¬μš©ν•œ λŒ€ν‘œμ μΈ μ˜ˆμ‹œλŠ”, μžλ°”μ˜ 래퍼 ν΄λž˜μŠ€λ“€μ˜ valueOf() λ©”μ„œλ“œλ₯Ό μ˜ˆμ‹œλ‘œ λ“€ 수 μžˆλ‹€. 

// Boolean.java
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);

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

Boolean의 경우 true, false만 가지고 있기 λ•Œλ¬Έμ— 인자둜 λ“€μ–΄μ˜¨ 값에 λ”°λΌμ„œ 미리 μ„ μ–Έλœ TRUE, FALSE μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜κ²Œ λœλ‹€. 즉, μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μΊμ‹±ν•˜μ—¬ λ°˜ν™˜ν•΄μ£ΌλŠ” ν˜•νƒœμΈ 것이닀.

κ·Έλž˜μ„œ λŒ€λΆ€λΆ„μ˜ wrapper 클래슀의 경우, newλ₯Ό 톡해 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  valueOf둜 μƒμ„±ν•˜λŠ” 것을 ꢌμž₯ν•œλ‹€. 상단에 주석을 보면, 이 μƒμ„±μžλŠ” ꡉμž₯히 λΆ€μ μ ˆν•˜κ³  '정적 νŒ©ν„°λ¦¬' valueOf을 ν†΅ν•΄μ„œ μƒμ„±ν•˜λΌκ³  적힌 것을 λ³Ό 수 μžˆλ‹€ ☺️


 

πŸ’¬ λ°˜ν™˜ νƒ€μž…μ˜ ν•˜μœ„ νƒ€μž… 객체λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ μ œμ–΄ν•  수 μžˆλ‹€.

class Circle extends Shape {
    @Override
    public String hello() {
        return "I'm Circle!";
    }
}

Circleμ΄λΌλŠ” μžμ‹ ν΄λž˜μŠ€κ°€ μžˆλ‹€. μ΄λŠ” ShapeλΌλŠ” λΆ€λͺ¨ 클래슀λ₯Ό 상속받은 μžμ‹ ν΄λž˜μŠ€μ΄λ‹€.

class Shape {
    public String hello() {
        return "I'm Shape!";
    }

    public static Shape create() {
        return new Circle();
    }
}

μ΄λ•Œ, Shape의 정적 λ©”μ„œλ“œμ—μ„œ createλ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œ λ‚΄λΆ€μ μœΌλ‘œ Circle()μ΄λΌλŠ” κ΅¬ν˜„μ²΄λ₯Ό λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— μ™ΈλΆ€μ—μ„œ ν•΄λ‹Ή create() λ©”μ„œλ“œλ₯Ό μ ‘κ·Όν–ˆμ„ λ•Œ κ΅¬ν˜„ ν΄λž˜μŠ€μ— λŒ€ν•œ 정보가 없더라도 ν•΄λ‹Ή 객체λ₯Ό λ°˜ν™˜ν•  수 있게 λœλ‹€.

public static void main(String[] args) throws IOException {
        Shape shape = Shape.create();
        System.out.println(shape.hello()); // I'm circle!
}

μœ„ μ˜ˆμ œμ—μ„œλŠ” κ°„λ‹¨ν•˜κ²Œ 클래슀 κ°„ 상속 관계λ₯Ό μ‚¬μš©ν•˜μ˜€μ§€λ§Œ, μΈν„°νŽ˜μ΄μŠ€μ—μ„œλ„ λ§ˆμ°¬κ°€μ§€μ΄λ‹€. μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ°˜ν™˜νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ 객체에 λŒ€ν•΄ API에 λ…ΈμΆœμ„ ν•˜μ§€ μ•Šμ•„λ„ 되고,  내뢀적인 κ΅¬ν˜„ 둜직이 μˆ¨κ²¨μ§„λ‹€λŠ” μž₯점도 μ‘΄μž¬ν•œλ‹€. (보톡, μΈν„°νŽ˜μ΄μŠ€κ°€ λ°˜ν™˜ νƒ€μž…μ΄λΌλŠ” 것은 ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 리턴함을 μ˜λ―Έν•œλ‹€.)

 

πŸ’‘ κ΅¬ν˜„ 둜직이 μˆ¨κ²¨μ§€λŠ” 것이 μ™œ μž₯점일까?

μΆ”μƒν™”μ˜ μž₯점을 생각해보면 μ’‹λ‹€. μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  λ•Œ κ΅¬ν˜„ 클래슀의 μ½”λ“œκ°€ λ‚˜νƒ€λ‚˜λŠ” 것은 λ³„λ‘œ 쒋지 μ•Šμ€ ꡬ쑰이닀. λ§Œμ•½ κ΅¬ν˜„ ν΄λž˜μŠ€κ°€ 변경될 경우, ν•΄λ‹Ή μ™ΈλΆ€ μ ‘κ·Ό μ½”λ“œλ„ ν•¨κ»˜ μˆ˜μ •λ˜μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 영ν–₯이 컀지기 λ•Œλ¬Έμ΄λ‹€. 반면, μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ¦¬ν„΄ν•˜κ²Œ 되면 λ‚΄λΆ€μ˜ κ΅¬ν˜„ ν΄λž˜μŠ€κ°€ λ³€κ²½λ˜λ”λΌλ„ μ™ΈλΆ€μ—μ„œλŠ” 항상 μΈν„°νŽ˜μ΄μŠ€λ§Œ 바라보고 있기 λ•Œλ¬Έμ— λ…λ¦½μ μœΌλ‘œ λ‚΄λΆ€ κ΅¬ν˜„μ²΄μ— λŒ€ν•΄ λ³€κ²½ν•  수 있으며, λ³΅μž‘λ„κ°€ 떨어지고 μœ μ—°ν•œ 섀계가 κ°€λŠ₯ν•˜κ²Œ λœλ‹€!

 

λ˜ν•œ, λ°˜ν™˜κ°’μ΄ μΈν„°νŽ˜μ΄μŠ€λΌλ©΄ 정적 νŒ©ν„°λ¦¬λ₯Ό μž‘μ„±ν•˜λŠ” μ‹œμ μ—λŠ” 였직 'μΈν„°νŽ˜μ΄μŠ€'λ§Œμ„ λ°˜ν™˜ν•˜λ„λ‘ ν•˜λ©΄ 되기 λ•Œλ¬Έμ—, λ³„λ„μ˜ κ΅¬ν˜„ 클래슀λ₯Ό μƒμ„±ν•˜μ§€ μ•Šλ”λΌλ„ 개발이 계속 κ°€λŠ₯ν•˜κ²Œ λœλ‹€. 이λ₯Ό μ΄μš©ν•œ 게 JDBC 같은 μ„œλΉ„μŠ€ 제곡자 ν”„λ ˆμž„ μ›Œν¬μ΄λ©°, ν΄λΌμ΄μ–ΈνŠΈκ°€ κ΅¬ν˜„λœ μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•˜λ”λΌλ„ λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–€ ν΄λž˜μŠ€κ°€ μžˆλŠ”μ§€ λͺ°λΌλ„ λœλ‹€! 

// DriverManager.java
public static Connection getConnection(String url,
	java.util.Properties info) throws SQLException {

    return (getConnection(url, info, Reflection.getCallerClass()));
}

μ½”λ“œκ°€ λ³΅μž‘ν•˜κΈ° λ•Œλ¬Έμ— κΈΈκ²ŒλŠ” μ•ˆ λ‹€λ£¨μ§€λ§Œ, DriverManagerλΌλŠ” ν΄λž˜μŠ€μ—μ„œ Connection 정보λ₯Ό 얻을 수 있으며, ν”„λ‘œνΌν‹° 정보에 따라 그에 λ§žλŠ” κ΅¬ν˜„μ²΄λ₯Ό λ°˜ν™˜ν•˜κ²Œ λœλ‹€.

 


βœ”οΈ 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œμ˜ 단점

λ¬Όλ‘ , λ‹Ήμ—°νžˆ μ΄λŸ¬ν•œ 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œμ—λ„ 단점은 μ‘΄μž¬ν•œλ‹€. 기본적으둜 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό λ§Œλ“ λ‹€λŠ” 것은 μƒμ„±μžλ₯Ό private둜 λ§Œλ“€κ² λ‹€λŠ” μ˜λ―Έμ΄λ‹€. κ·ΈλŸ¬λ‚˜, 상속을 μœ„ν•΄μ„œλŠ” public / protected μƒμ„±μžκ°€ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ—, ν•˜μœ„ 클래슀λ₯Ό λ§Œλ“€ 수 μ—†λ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” protected / default μƒμ„±μžλ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜, ν˜Ήμ€ 상속받지 μ•ŠλŠ” 것도 ν•˜λ‚˜μ˜ 방법이닀. (μ‹€μ œλ‘œ, μš”μ¦˜μ€ 상속받지 μ•ŠλŠ” 것이 κ½€ νŠΈλ Œλ“œμ΄λ‹€. (μ½”ν‹€λ¦°μ˜ 경우 상속 κΈˆμ§€κ°€ κΈ°λ³Έμ΄λ‹ˆκΉŒ)

 

λ˜ν•œ, λͺ…ν™•ν•˜κ²Œ λ“œλŸ¬λ‚˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ°ΎκΈ° μ–΄λ ΅λ‹€λŠ” 단점도 μ‘΄μž¬ν•œλ‹€. κ·ΈλŸ¬λ‚˜, μ΄λŠ” 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œμ— λŒ€ν•œ 넀이밍을 잘 지킨닀면 해결될 수 있기 λ•Œλ¬Έμ— 넀이밍을 μž˜ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€! πŸ₯Ή

 

μ»¨λ²€μ…˜ μ‚¬μš©λ²• μ˜ˆμ‹œ
from λ§€κ°œλ³€μˆ˜λ₯Ό ν•˜λ‚˜ λ°›μ•„μ„œ, ν•΄λ‹Ή νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€ λ°˜ν™˜ Date date = Date.from(instant)
of μ—¬λŸ¬ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›μ•„μ„œ 적합합 νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€ λ°˜ν™˜ Set<Rank> 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
맀번 μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•¨μ„ 보μž₯ν•œλ‹€. Object newArray = Array.newInstance(classObject, arrayLen)
getType getInstance와 λ™μΌν•˜μ§€λ§Œ, 생성할 ν΄λž˜μŠ€κ°€ μ•„λ‹Œ λ‹€λ₯Έ ν΄λž˜μŠ€μ— νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•Œ μ‚¬μš©ν•œλ‹€. μ—¬κΈ°μ„œ λ“€μ–΄κ°€λŠ” Type은 νŒ©ν„°λ¦¬ λ©”μ„œλ“œκ°€ λ°˜ν™œν•  객체의 νƒ€μž…μ„ μ˜λ―Έν•œλ‹€. FileStore fs = Files.getFileStore(path);
newType newInstance와 κ°™μ§€λ§Œ, 생성할 ν΄λž˜μŠ€κ°€ μ•„λ‹Œ λ‹€λ₯Έ ν΄λž˜μŠ€μ— νŒ©ν„°λ¦¬ λ©”μ„œλ“œ μ •μ˜ μ‹œ μ‚¬μš©ν•œλ‹€ (getTypeκ³Ό λΉ„μŠ·) BufferedReader br = Files.newBufferedReader(path);
type getType, newType의 κ°„κ²°ν•œ 버전 List<Complain> litany = Collections.list(legacyLitany)

 

Comments