Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable

Amenable's Blog

๋‹ค ์“ด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ7)]
๐Ÿ“‚ JAVA/์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”

๋‹ค ์“ด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ7)]

2022. 12. 25. 20:03

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

1. Stack์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ & ํ•ด๊ฒฐ์ฑ…

public class Stack{
    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    
    public Stack(){
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }
    
    public void push(Object e){
        ensureCapacity();
        elements[size++] = e;
    }
    
    public Object pop(){
        if(size == 0)
            throw new EmptyStackException();
        return elements[--size];
    }
    
    /**
     * ์›์†Œ๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์„ ์ ์–ด๋„ ํ•˜๋‚˜ ์ด์ƒ ํ™•๋ณดํ•œ๋‹ค.
     * ๋ฐฐ์—ด ํฌ๊ธฐ๋ฅผ ๋Š˜๋ ค์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ๋Œ€๋žต ๋‘ ๋ฐฐ์”ฉ ๋Š˜๋ฆฐ๋‹ค.
     */
    private void ensureCapacity(){
        if(elements.length == size)
            elements = Arrays.copyOf(elements, 2 * size + 1);
    }
}

  ํ•ด๋‹น ์ฝ”๋“œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ์–ด๋””์—์„œ ์ผ์–ด๋‚ ๊นŒ? ์ด ์ฝ”๋“œ์—์„œ๋Š” ์Šคํƒ์ด ์ปค์กŒ๋‹ค๊ฐ€ ์ค„์–ด๋“ค์—ˆ์„ ๋•Œ ์Šคํƒ์—์„œ ๊บผ๋‚ด์ง„ ๊ฐ์ฒด๋“ค์„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ํšŒ์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ทธ ๊ฐ์ฒด๋“ค์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ํ•ด๋‹น ์Šคํƒ์ด ๊ทธ ๊ฐ์ฒด๋“ค์˜ ๋‹ค ์“ด ์ฐธ์กฐ(obsolete reference)๋ฅผ ์—ฌ์ „ํžˆ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๊ฐ์ฒด๋“ค์„ ํšŒ์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. (๋‹ค ์“ด ์ฐธ์กฐ = ์•ž์œผ๋กœ ๋‹ค์‹œ ์“ฐ์ง€ ์•Š์„ ์ฐธ์กฐ)

  ๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด๋‹น ์ฐธ์กฐ๋ฅผ ๋‹ค ์ผ์„ ๋•Œ null ์ฒ˜๋ฆฌ(์ฐธ์กฐ ํ•ด์ œ)ํ•˜์—ฌ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋”๋Š” ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ž„์„ ๊ฐ€๋น„์ง€ ์ปค๋ ‰ํ„ฐ์— ์•Œ๋ ค์•ผ ํ•œ๋‹ค.

public Object pop(){
    if(size == 0)
        throw new EmptyStackException();
    Object result = elements[--size];
    elements[size] = null; // ๋‹ค ์“ด ์ฐธ์กฐ ํ•ด์ œ
    return result;
}

 

2. ์บ์‹œ์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ & ํ•ด๊ฒฐ์ฑ…

1. ๋ฐฉ๋ฒ• 1

public class PostRepository{

    private Map<CacheKey, Post> cache;
    
    public PostRepository(){
        this.cache = new HashMap<>();
    }
    
    public Post getPostById(Integer id){
        CacheKey key = new CacheKey(id);
        if(cache.containKey(key)){
            return cache.get(key);
        } else {
            // TODO DB์—์„œ ์ฝ์–ด์˜ค๊ฑฐ๋‚˜ REST API๋ฅผ ํ†ตํ•ด ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
            Post post = new Post();
            cache.put(key, post);
            return post;
        }
    }
    
    public Map<CacheKey, Post> getCache(){
        return cache;
    }
}
class PostRepositoryTest{
    
    @Test
    void cache() throws InterruptedException {
        PostRepository postRepository = new PostRepository();
        Integer p1 = 1;
        postRepository.getPostById(p1);
        
        assertFalse(postRepository.getCache().isEmpty());
        
        p1 = null;
        
        // TODO run gc
        System.out.println("run gc");
        System.gc(); // ํ•ญ์ƒ ์ด ์‹œ์ ์— gc๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์ง€๋งŒ, ์‹คํ–‰์ด ๋˜๊ธฐ๋Š” ํ•œ๋‹ค.
        System.out.println("wait");
        Thread.sleep(3000L);
        
        assertTrue(postRepository.getCache().isEmpty()); // AssertionFailedError
    }
}

  ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด gc๊ฐ€ ์‹คํ–‰๋˜๋”๋ผ๋„ postRepository๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

public class PostRepository{

    ...	
    public PostRepository(){
        this.cache = new WeakHashMap<>();
    }
    ...
}

  ๊ธฐ์กด์˜ HashMap์—์„œ WeakHashMap์œผ๋กœ ๋ฐ”๊พธ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋” ์ด์ƒ ์ฐธ์กฐํ•˜๋Š” ๊ณณ(์œ„์—์„œ๋Š” p1)์ด ์—†์œผ๋ฉด postRepository๊ฐ€ ๋น„์–ด์žˆ๊ฒŒ ๋œ๋‹ค. 'p1 = null;'์ด ์—†๋”๋ผ๋„ ์ž‘๋™์„ ํ•œ๋‹ค. (๋” ์ด์ƒ ์ฐธ์กฐํ•˜๋Š” ๊ณณ์ด ์—†๊ธฐ ๋•Œ๋ฌธ)

  ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜์ž๋ฉด getPostById๋ผ๋Š” ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ CacheKey๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚˜๋ฉด CacheKey๊ฐ€ ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ์›๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

 

2. ๋ฐฉ๋ฒ• 2

public class PostRepository{

    private Map<CacheKey, Post> cache;
    
    public PostRepository(){
        this.cache = new WeakHashMap<>();
    }
    
    public Post getPostById(CacheKey key){
        if(cache.containKey(key)){
            return cache.get(key);
        } else {
            // TODO DB์—์„œ ์ฝ์–ด์˜ค๊ฑฐ๋‚˜ REST API๋ฅผ ํ†ตํ•ด ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
            Post post = new Post();
            cache.put(key, post);
            return post;
        }
    }
    
    public Map<CacheKey, Post> getCache(){
        return cache;
    }
}
class PostRepositoryTest{
    
    @Test
    void cache() throws InterruptedException {
        PostRepository postRepository = new PostRepository();
        CacheKey key1 = new CacheKey(1);
        postRepository.getPostById(key1);
        
        assertFalse(postRepository.getCache().isEmpty());
        
        key1 = null;
        
        // TODO run gc
        System.out.println("run gc");
        System.gc(); // ํ•ญ์ƒ ์ด ์‹œ์ ์— gc๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์ง€๋งŒ, ์‹คํ–‰์ด ๋˜๊ธฐ๋Š” ํ•œ๋‹ค.
        System.out.println("wait");
        Thread.sleep(3000L);
        
        assertTrue(postRepository.getCache().isEmpty());
    }
}

  key1์€ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€ ์œ ํšจํ•œ๋ฐ 'key1 = null;'์„ ํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ ์ƒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋ฐฉ๋ฒ• 1๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ด ๊ฒฝ์šฐ์— 'key1 = null;'์ด ์—†๋‹ค๋ฉด ์ •์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

3. ๋ฐฉ๋ฒ• 3

  ์„ธ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๊ฐ์ฒด๋ฅผ ๋„ฃ๊ฑฐ๋‚˜ ๋นผ๊ฑฐ๋‚˜ ํ•  ๋•Œ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ œ์ผ ์˜ค๋ž˜๋œ ๊ฒƒ์„ ์ฐพ์•„์„œ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ LRU ์บ์‹œ ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

4. ๋ฐฉ๋ฒ• 4

  ๋งˆ์ง€๋ง‰ ๋ฐฉ๋ฒ•์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

public class PostRepository{

    private Map<CacheKey, Post> cache;
    
    public PostRepository(){
        this.cache = new HashMap<>();
    }
    
    public Post getPostById(CacheKey key){
        if(cache.containKey(key)){
            return cache.get(key);
        } else {
            // TODO DB์—์„œ ์ฝ์–ด์˜ค๊ฑฐ๋‚˜ REST API๋ฅผ ํ†ตํ•ด ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
            Post post = new Post();
            cache.put(key, post);
            return post;
        }
    }
    
    public Map<CacheKey, Post> getCache(){
        return cache;
    }
}
@Test
void backgroundThread() throws InterruptedException {
    ScheduledExecutorService executor = Executors.newSchedultedThreadPool(1);
    CacheKey1 = new CacheKey(1);
    postRepostiory.getPostbyId(key1);
    
    Runnable removeOldCache = () -> {
        System.out.println("running removeOldCache task");
        Map<CacheKey, Post> cache = postRepository.getCache();
        Set<Cachekey> cacheKeys = cache.keySet();
        Optional<CacheKey> key = cacheKeys.stream().min(Comparator.comparing(CacheKey::getCreated));
        key.ifPresent((k) -> {
            System.out.println("removing " + k);
            cache.remove(k);
        });
    };
    
    System.out.println("The time is : " + new Date());
    
    executor.scheduleAtFixedRate(removeOldCache, 1, 3, TimeUnit,SECONDS); // ์ฒ˜์Œ 1์ดˆ ํ›„์—, ๋งค 3์ดˆ ๋งˆ๋‹ค ์‹คํ–‰ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.
    
    Thread.sleep(20000L);
    
    executor.shutdown();
}

  20์ดˆ ๋™์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๋™์•ˆ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ 3์ดˆ๋งˆ๋‹ค ๊ณ„์†ํ•ด์„œ ์ œ์ผ ๋’ค์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ญ์ œํ•œ๋‹ค.

 

3. ๋ฆฌ์Šค๋„ˆ(listener) ํ˜น์€ ์ฝœ๋ฐฑ(callback)์—์„œ์˜ ๋ˆ„์ˆ˜ & ํ•ด๊ฒฐ์ฑ…

public class ChatRoon {
    
    private List<WeakReference<User>> users;
    
    public ChatRoom() {
        this.users = new ArrayList<>();
    }
    
    public void addUser(User user) {
        this.users.add(new WeakReference<>(user));
    }
    
    public void sendMessage(String message) {
        users.forEach(wr -> Objects.requireNonNull(wr.get()).receive(message));
    }
    
    public List<WeakReference<User>> getUsers() {
        return users;
    }   
}
@Test
void chatRoom() throws InterruptedException {
    ChatRoom chatRoom = new ChatRoom();
    User user1 = new User();
    User user2 = new User();
    
    chatRoom.addUser(user1);
    chatRoom.addUser(user2);
    
    chatRoom.sendMessage("hello");
    
    user1 = null
    
    System.gc();
    
    Thread.sleep(5000L);
    
    List<WeakReference<User>> users = chatRoom.getUsers();
    assertTrue(users.size() == 1);
}

  ํ•ด๋‹น ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ทธ๋ƒฅ ์‹คํ–‰์‹œํ‚ค๋ฉด ํ‹€๋ฆฌ๊ฒŒ ๋œ๋‹ค. WeakReference๋ฅผ ์‚ญ์ œํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์€ WeakHashMap์— ๋“ค์–ด์žˆ๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ์œ„์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ปค์Šคํ…€ํ•œ List๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์žˆ๋‹ค. 

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

 

ํ•ด๋‹น ๊ธ€์€ ๋ฐฑ๊ธฐ์„  ๋‹˜์˜ '์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” ์™„๋ฒฝ ๊ณต๋žต'์„ ์ˆ˜๊ฐ•ํ•˜๊ณ  ์ž‘์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

'๐Ÿ“‚ JAVA > ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

try-finally ๋ณด๋‹ค๋Š” try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ9)]  (0) 2023.01.03
finalizer์™€ cleaner ์‚ฌ์šฉ์„ ํ”ผํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ8)]  (0) 2023.01.03
๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ”ผํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ6)]  (0) 2022.11.29
์ž์›์„ ์ง์ ‘ ๋ช…์‹œํ•˜์ง€ ๋ง๊ณ  ์˜์กด ๊ฐ์ฒด ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ5)]  (0) 2022.11.28
์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰์œผ๋ ค๊ฑฐ๋“  private ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ4)]  (0) 2022.11.28
    '๐Ÿ“‚ JAVA/์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • try-finally ๋ณด๋‹ค๋Š” try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ9)]
    • finalizer์™€ cleaner ์‚ฌ์šฉ์„ ํ”ผํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ8)]
    • ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ”ผํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ6)]
    • ์ž์›์„ ์ง์ ‘ ๋ช…์‹œํ•˜์ง€ ๋ง๊ณ  ์˜์กด ๊ฐ์ฒด ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ5)]
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”