๋„์„œ ๐Ÿ“š/Effective Java

[Effective Java] Item 01. ์ƒ์„ฑ์ž ๋Œ€์‹  ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ ๋ คํ•˜๋ผ

HEY__ 2024. 5. 27. 14:08
728x90

์ด ๊ธ€์€ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ๋‚ด์šฉ๋“ค์„ ๊ธฐ๋กํ•˜๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋‚˜ ๊ณ ์ณ์•ผ ํ•  ์‚ฌํ•ญ๋“ค์ด ์žˆ๋‹ค๋ฉด ์ง€์  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋งˆ์ง€๋ง‰ ์ˆ˜์ •: 2024.05.27

โœ… 1. ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ (static factory method)๋ž€?

ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ •์  ๋ฉ”์„œ๋“œ(static method)๋ฅผ ๋งํ•œ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ java์˜ Wrapper class๋“ค์€ .valueOf()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.
Boolean.valueOf(), String.valueOf()์ด ๊ทธ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ด๋ฉฐ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Wrapper class์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.


โœ… 2. ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์žฅ์ 

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

์–ด๋–ค ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด, ํ•˜๋‚˜์˜ ์ƒ์„ฑ์ž๋กœ๋Š” ์ด๋ฅผ ์ถฉ๋ถ„ํžˆ ํ‘œํ˜„ํ•˜๊ธฐ ํž˜๋“ค ๊ฒƒ์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด User์ด๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ์„ค์ •๋˜๋Š” ํ•„๋“œ์˜ ๊ฐ’์ด ๋‹ค๋ฅด๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.
์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ java์—์„œ๋Š” public User(String name){} public User(String nickname) {}๊ณผ ๊ฐ™์ด ์ƒ์„ฑ์ž๋ฅผ ์ค‘๋ณต์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๊ฐ€ ๋งŽ์€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

public class User {
    private String name;
    private String nickname;

    public static User withName (String name) {  
        User user = new User();  
        user.name = name;  
        return user;  
    }  

    public static User withNickname (String nickname) {  
        User user = new User();  
        user.nickname = nickname;  
        return user;  
    }  
}

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

โœจ ์„ฑ๋Šฅ์„ ๋Œ์–ด์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๋ถˆ๋ณ€ ํด๋ž˜์Šค(Immutable class; item 17)์˜ ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋†“๊ฑฐ๋‚˜, ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ cachingํ•˜์—ฌ ์žฌํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
ํŠน์ • ํด๋ž˜์Šค์˜ ์š”์ฒญ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋ฉด ์„ฑ๋Šฅ ๋ถ€๋ถ„์—์„œ ์ด๋“์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ,
ํŠนํžˆ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ ๋น„์šฉ์ด ํฐ ๊ฒฝ์šฐ ์„ฑ๋Šฅ์„ ๋”์šฑ ๋Œ์–ด์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฉด์—์„œ Flyweight pattern๋„ ์ด์™€ ๋น„์Šทํ•œ ๊ธฐ๋ฒ•์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

โœจ ์ธ์Šคํ„ด์Šค ํ†ต์ œ(instance-controlled) ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋ฐ˜๋ณต๋˜๋Š” ์š”์ฒญ์— ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด, ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ์–ธ์ œ ์–ด๋Š ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ด์•„์žˆ๊ฒŒ ํ• ์ง€ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šค ํ†ต์ œ(instance-controlled) ํด๋ž˜์Šค๋ผ๊ณ  ํ•œ๋‹ค.

๐Ÿค” ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ต์ œํ•˜๋ฉด ๋ฌด์—‡์ด ์ข‹์„๊นŒ?

โœ… ํด๋ž˜์Šค๋ฅผ ์‹ฑ๊ธ€ํ„ด(Singleton; item 3)์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
โœ… ์ธ์Šคํ„ด์Šคํ™” ๋ถˆ๊ฐ€(noninstantiable; item 4)๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
โœ… ๋ถˆ๋ณ€ ํด๋ž˜์Šค(immutable class; item 17)์—์„œ ๋™์น˜์ธ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜ ๋ฟ์ž„์„ ๋ณด์žฅ ๊ฐ€๋Šฅ

๋˜ํ•œ ์ธ์Šคํ„ด์Šค ํ†ต์ œ๋Š” Flyweight pattern์˜ ๋ฒ ์ด์Šค๊ฐ€ ๋œ๋‹ค.


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

โœจ ์ด ๋Šฅ๋ ฅ์„ ํ†ตํ•ด ๋ฐ˜ํ™˜ํ•  ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์—„์ฒญ๋‚œ ์œ ์—ฐ์„ฑ ๊ฐ•์ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฐ•์ ์€ API๋ฅผ ๋งŒ๋“ค ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
Java 8๋ถ€ํ„ฐ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ,
์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ(item 20)์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ java.util.Collections๋ฅผ ๋“ค ์ˆ˜ ์žˆ๋‹ค.
์ž๋ฐ” ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ˆ˜์ • ๋ถˆ๊ฐ€(Unmodifiable)๋‚˜ ๋™๊ธฐํ™” ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ 45๊ฐœ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌํ˜„์ฒด๋“ค์„ java.util.Collections์—์„œ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€์œผ๋ฉฐ,
์ด์ฒ˜๋Ÿผ ๊ตฌํ˜„์ฒด๊ฐ€ ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•˜๊ฒŒ ํ•˜์—ฌ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ตํ˜€์•ผํ•˜๋Š” ๊ฐœ๋…์˜ ์ˆ˜์™€ ๋‚œ์ด๋„๊ฐ€ ๋‚ฎ์•„์กŒ๋‹ค.

๋˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๊ฐ์ฒด๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋Œ€๋กœ ๋™์ž‘ํ•  ๊ฒƒ์ž„์„ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,

public static <T> List<T> unmodifiableList(List<? extends T> list) {
    if (list.getClass() == UnmodifiableList.class || list.getClass() == UnmodifiableRandomAccessList.class) {
        return (List<T>) list;
    }

    return (list instanceof RandomAccess ?
        new UnmodifiableRandomAccessList<>(list) :
        new UnmodifiableList<>(list));
}

์œ„์˜ ์ฝ”๋“œ๋Š” Collections์—์„œ ๊ฐ€์ ธ์˜จ ํ•˜๋‚˜์˜ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์ด๋‹ค.
Collections์—์„œ๋Š” ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ(List, Set, Map ๋“ฑ)๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋“ค์ด ์กด์žฌํ•œ๋‹ค.

์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค(List)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” Collections.unmodifiableList()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•œ List๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.


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

๋ฐ˜ํ™˜ ํƒ€์ž…์ด ํ•˜์œ„ ํƒ€์ž…(์ƒ์†๋ฐ›์€ ์ž์‹ ํƒ€์ž…)์ด๋ผ๋ฉด, ์–ด๋–ค ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋“  ์ƒ๊ด€์—†๋‹ค.

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

public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
    Enum<?>[] universe = getUniverse(elementType);
    if (universe == null)
        throw new ClassCastException(elementType + " not an enum");

    if (universe.length <= 64)
         new RegularEnumSet<>(elementType, universe);
    else
        return new JumboEnumSet<>(elementType, universe);
}

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


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

๋‹ค์„ฏ๋ฒˆ์งธ ์ด์ ์€ ์„œ๋น„์Šค ์ œ๊ณต์ž ํ”„๋ ˆ์ž„์›Œํฌ(Service Provider Framework)์˜ ๊ทผ๊ฐ„์ด ๋œ๋‹ค.
ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ œ๊ณต์ž(Provider)๋Š” ์„œ๋น„์Šค์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ด์•ผ๊ธฐํ•˜๋Š”๋ฐ,
ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ด ๊ตฌํ˜„์ฒด๋“ค์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ํ†ต์ œ(control)ํ•˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌํ˜„์ฒด๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•ด์ค€๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ JDBC๋ฅผ ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋น„์Šค ์ œ๊ณต์ž ํ”„๋ ˆ์ž„์›Œํฌ์—๋Š” ๋ฐ‘๊ณผ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ๋ณ€ํ˜•๋“ค์ด ์กด์žฌํ•œ๋‹ค.

  1. Bridge Pattern
  2. Dependency Injection
  3. java.util.ServiceLoader- ๋ฒ”์šฉ ์„œ๋น„์Šค ์ œ๊ณต์ž ํ”„๋ ˆ์ž„์›Œํฌ

โœ… 3. ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ๋‹จ์ 

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

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

ํ•˜์ง€๋งŒ ์–ด์ฉŒ๋ฉด ์ด ์ œ์•ฝ์„ ํ†ตํ•ด ์ƒ์†๋ณด๋‹ค ์ปดํฌ์ง€์…˜; item 18์„ ์‚ฌ์šฉํ•˜๋„๋ก ์œ ๋„ํ•˜๊ณ , ๋ถˆ๋ณ€ ํƒ€์ž…; item 17๋กœ ๋งŒ๋“ค๋ ค๋ฉด
์ด ์ œ์•ฝ์ด ์˜คํžˆ๋ ค ์žฅ์ ์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

๐Ÿค” ๊ทธ๋ ‡๋‹ค๋ฉด ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ + public(protected) ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋ ๊นŒ?
A. ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ด๋„ ์ž˜ ๋‚˜์˜ค์งˆ ์•Š๋Š”๋‹ค... ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์  ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ œ์•ฝ์„ ๊ฑฐ๋Š” ๊ฒƒ์ด๋ผ๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™์€๋ฐ...!
์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”๊ฐ€ ์กฐ์‚ฌ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ , ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ด์•ผ๊ฒ ๋‹ค!

2๏ธโƒฃ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฐพ๊ธฐ ํž˜๋“ค๋‹ค.

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

์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ช… ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ธˆ์ด๋ผ๋„ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.


โœ… 4. ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ์—์„œ ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ช… ๋ฐฉ์‹

- from: ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋ฐ›์•„์„œ ํ•ด๋‹น ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜•๋ณ€ํ™˜ ๋ฉ”์„œ๋“œ

Date date = Date.from(instant);

- of: ์—ฌ๋Ÿฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„ ์ ํ•ฉํ•œ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ง‘๊ณ„ ๋ฉ”์„œ๋“œ

Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING);

- valueOf: from๊ณผ of์˜ ๋” ์ž์„ธํ•œ ๋ฒ„์ „

// valueOf()๋ผ๋Š” ๋„ค์ด๋ฐ์„ ํ†ตํ•ด ๊ฐ’์„ ๋ฐ›์•„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž„์„ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ๋‹ค.
String string = String.valueOf(3);

- instance or getInstance: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ช…์‹œํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ, ๊ฐ™์€ ์ธ์Šคํ„ด์Šค ์ž„์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

- create or newInstance: getInstance์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•จ์„ ๋ณด์žฅํ•œ๋‹ค.

// ํ•ญ์ƒ ์ƒ์„ฑ์ž ํ‚ค์›Œ๋“œ(new)๋ฅผ ํ†ตํ•ด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ

- getType: getInstance์™€ ๊ฐ™์œผ๋‚˜, ์ƒ์„ฑํ•  ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ Type์€ ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๊ฐ์ฒด์˜ ํƒ€์ž…์ด๋‹ค.

// Files ํด๋ž˜์Šค์— FileStore ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๊ณ , ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ›์Œ์ด ๋ณด์žฅ๋˜์–ด์žˆ์ง€ ์•Š์„ ๋•Œ
FileStore fileStore = Files.getFileStore(path);

- newType: newInstance์™€ ๊ฐ™์œผ๋‚˜, ์ƒ์„ฑํ•  ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ Type์€ ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๊ฐ์ฒด์˜ ํƒ€์ž…์ด๋‹ค.

// Files ํด๋ž˜์Šค์— BufferedReader ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๊ณ , ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•จ์ด ๋ณด์žฅ๋˜์–ด์žˆ์„ ๋•Œ
BufferedReader reader = Files.newBufferedReader(path);

- type: getType๊ณผ newType์˜ ๊ฐ„๊ฒฐํ•œ ๋ฒ„์ „

// ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ํŠน์ • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉ
List<Complaint> litany = Collections.list(legacyLitany);
728x90