CodeGym /Java Blog /๋ฌด์ž‘์œ„์˜ /Java์˜ ํŒฌํ…€ ์ฐธ์กฐ
John Squirrels
๋ ˆ๋ฒจ 41
San Francisco

Java์˜ ํŒฌํ…€ ์ฐธ์กฐ

๋ฌด์ž‘์œ„์˜ ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์•ˆ๋…•! ์˜ค๋Š˜ ํ† ๋ก ์—์„œ๋Š” Java์˜ "ํŒฌํ…€ ์ฐธ์กฐ"(PhantomReference)์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ฐธ์กฐ์ž…๋‹ˆ๊นŒ? "์œ ๋ น ์ฐธ์กฐ"๋ผ๊ณ  ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๊นŒ? ๊ธฐ์–ตํ•˜์‹œ๊ฒ ์ง€๋งŒ Java์—๋Š” 4๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์ฐธ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. StrongReference (๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ƒ์„ฑํ•˜๋Š” ์ผ๋ฐ˜ ์ฐธ์กฐ):

    Cat cat = new Cat()

    ์ด ์˜ˆ์—์„œ cat์€ ๊ฐ•๋ ฅํ•œ ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค.

  2. SoftReference (์†Œํ”„ํŠธ ์ฐธ์กฐ). ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฌํ•œ ์ฐธ์กฐ์— ๋Œ€ํ•œ ๊ตํ›ˆ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

  3. WeakReference (์•ฝํ•œ ์ฐธ์กฐ). ์—ฌ๊ธฐ์— ๋Œ€ํ•œ ๊ตํ›ˆ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค .

  4. PhantomReference (ํŒฌํ…€ ์ฐธ์กฐ).

๋งˆ์ง€๋ง‰ 3๊ฐœ๋Š” ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์ œ๋„ค๋ฆญ ์œ ํ˜•์ž…๋‹ˆ๋‹ค(์˜ˆ: SoftReference<Integer> , WeakReference<MyClass> ). SoftReference , WeakReference ๋ฐ PhantomReference ํด๋ž˜์Šค ๋Š” Reference ํด๋ž˜์Šค ์—์„œ ์ƒ์†๋ฉ๋‹ˆ๋‹ค . ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋กœ ์ž‘์—…ํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • get() โ€” ์ฐธ์กฐ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • clear() โ€” ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

SoftReference ๋ฐ WeakReference ์— ๋Œ€ํ•œ ๋‹จ์›์—์„œ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค . ์„œ๋กœ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์ฐธ์กฐ์™€ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ์ฒ˜์Œ ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  ํŒฌํ…€ ์ฐธ์กฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์ฐธ์กฐ์— ๋Œ€ํ•ด ๋‹ค๋ฃฐ ๊ฒƒ์ด์ง€๋งŒ ํŒฌํ…€ ์ฐธ์กฐ์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€์— ๋Œ€ํ•ด์„œ๋งŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ‘์‹œ๋‹ค! :) ๋จผ์ € ํŒฌํ…€ ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์•„์‹œ๋‹ค์‹œํ”ผ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ(gc)๋Š” ๋ถˆํ•„์š”ํ•œ Java ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ์ปฌ๋ ‰ํ„ฐ๋Š” ๋‘ ๊ฐœ์˜ "ํŒจ์Šค"์—์„œ ๊ฐœ์ฒด๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” ๊ฐœ์ฒด๋งŒ ๋ณด๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฐœ์ฒด๋ฅผ "๋ถˆํ•„์š”"("์‚ญ์ œํ• " ์˜๋ฏธ)๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝfinalize()๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐœ์ฒด์— ๋Œ€ํ•ด ์žฌ์ •์˜๋œ ๊ฒฝ์šฐ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ํ˜ธ์ถœ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ์šด์ด ์ข‹์€์ง€ ์—ฌ๋ถ€์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๋•์Šค๋Ÿฝ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹ค ๊ฒƒ finalize()์ž…๋‹ˆ๋‹ค :) ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ์˜ ๋‘ ๋ฒˆ์งธ ํŒจ์Šค์—์„œ ๊ฐœ์ฒด๊ฐ€ ์‚ญ์ œ๋˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ์˜ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๋™์ž‘์€ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์–ธ์ œ ์‹คํ–‰๋˜๊ธฐ ์‹œ์ž‘ํ• ์ง€๋Š” ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. finalize()๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค . ๋˜ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ finalize()์ด ๊ฒฝ์šฐ ๊ฐœ์ฒด๊ฐ€ ์ „ํ˜€ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์š”๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ์‰ฝ๊ฒŒ OutOfMemoryError. ์ด ๋ชจ๋“  ๊ฒƒ์ด ํŒฌํ…€ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.. ์‚ฌ์‹ค ์ด๊ฒƒ์€ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด์— ํŒฌํ…€ ์ฐธ์กฐ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ:
  • finalize () ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค(์žฌ์ •์˜๋œ ๊ฒฝ์šฐ).

  • finalize() ๋ฉ”์„œ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๊ณ  ๊ฐœ์ฒด๋ฅผ ์—ฌ์ „ํžˆ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ๊ฐœ์ฒด์— ๋Œ€ํ•œ ํŒฌํ…€ ์ฐธ์กฐ๊ฐ€ ํŠน์ˆ˜ ํ์ธ ReferenceQueue์— ๋ฐฐ์น˜ ๋ฉ๋‹ˆ๋‹ค .

ํŒฌํ…€ ์ฐธ์กฐ๋กœ ์ž‘์—…ํ•  ๋•Œ ์ดํ•ดํ•ด์•ผ ํ•  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์‚ฌํ•ญ์€ ํŒฌํ…€ ์ฐธ์กฐ๊ฐ€ ์ด ๋Œ€๊ธฐ์—ด์— ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ฐœ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ญ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒฌํ…€ ์ฐธ์กฐ์—์„œ clear() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„์—๋งŒ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค . ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ผ์ข…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

public class TestClass {
   private StringBuffer data;
   public TestClass() {
       this.data = new StringBuffer();
       for (long i = 0; i < 50000000; i++) {
           this.data.append('x');
       }
   }
   @Override
   protected void finalize() {
       System.out.println("The finalize method has been called on the TestClass object");
   }
}
๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ๋ง‰๋Œ€ํ•œ "๋ถ€ํ•˜"(๊ฐ ๊ฐœ์ฒด์— 5์ฒœ๋งŒ ๊ฐœ์˜ "x" ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ finalize() ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ PhantomReference ์—์„œ ์ƒ์†ํ•  ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค . ์™œ ๊ทธ๋Ÿฐ ์ˆ˜์—…์ด ํ•„์š”ํ•œ๊ฐ€์š”? ๋ชจ๋‘ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŒฌํ…€ ์ฐธ์กฐ๊ฐ€ ์‹ค์ œ๋กœ ์ง€์›Œ์กŒ๋Š”์ง€(๊ฐ์ฒด๊ฐ€ ์‚ญ์ œ๋˜์—ˆ์Œ์„ ์˜๋ฏธ) ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด clear() ๋ฉ”์„œ๋“œ ์— ์ถ”๊ฐ€ ๋…ผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

public class MyPhantomReference<TestClass> extends PhantomReference<TestClass> {

   public MyPhantomReference(TestClass obj, ReferenceQueue<TestClass> queue) {

       super(obj, queue);

       Thread thread = new QueueReadingThread<TestClass>(queue);

       thread.start();
   }

   public void cleanup() {
       System.out.println("Cleaning up a phantom reference! Removing an object from memory!");
       clear();
   }
}
๋‹ค์Œ์œผ๋กœ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ํŒฌํ…€ ๋งํฌ๊ฐ€ ReferenceQueue์— ๋‚˜ํƒ€ ๋‚ฉ๋‹ˆ๋‹ค . ์ด๋Ÿฌํ•œ ์ฐธ์กฐ๊ฐ€ ๋Œ€๊ธฐ์—ด์—์„œ ๋๋‚˜๋Š” ์ฆ‰์‹œ cleanup() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;

public class QueueReadingThread<TestClass> extends Thread {

   private ReferenceQueue<TestClass> referenceQueue;

   public QueueReadingThread(ReferenceQueue<TestClass> referenceQueue) {
       this.referenceQueue = referenceQueue;
   }

   @Override
   public void run() {

       System.out.println("The thread monitoring the queue has started!");
       Reference ref = null;

       // Wait until the references appear in the queue
       while ((ref = referenceQueue.poll()) == null) {

           try {
               Thread.sleep(50);
           }

           catch (InterruptedException e) {
               throw new RuntimeException("Thread " + getName() + " was interrupted!");
           }
       }

       // As soon as a phantom reference appears in the queue, clean it up
       ((MyPhantomReference) ref).cleanup();
   }
}
๋งˆ์ง€๋ง‰์œผ๋กœ main() ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ด๋ฅผ ๋ณ„๋„์˜ Main ํด๋ž˜์Šค ์— ๋„ฃ์Šต๋‹ˆ๋‹ค . ์ด ๋ฉ”์„œ๋“œ์—์„œ ์šฐ๋ฆฌ๋Š” TestClass ๊ฐœ์ฒด, ์ด์— ๋Œ€ํ•œ ํŒฌํ…€ ์ฐธ์กฐ ๋ฐ ํŒฌํ…€ ์ฐธ์กฐ๋ฅผ ์œ„ํ•œ ํ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค . ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. :)

import java.lang.ref.*;

public class Main {

   public static void main(String[] args) throws InterruptedException {
       Thread.sleep(10000);

       ReferenceQueue<TestClass> queue = new ReferenceQueue<>();
       Reference ref = new MyPhantomReference<>(new TestClass(), queue);

       System.out.println("ref = " + ref);

       Thread.sleep(5000);

       System.out.println("Collecting garbage!");

       System.gc();
       Thread.sleep(300);

       System.out.println("ref = " + ref);

       Thread.sleep(5000);

       System.out.println("Collecting garbage!");

       System.gc();
   }
}
์ฝ˜์†” ์ถœ๋ ฅ:

ref = MyPhantomReference@4554617c 
The thread monitoring the queue has started! 
Collecting garbage! 
The finalize method has been called on the TestClass object 
ref = MyPhantomReference@4554617c 
Collecting garbage! 
Cleaning up a phantom reference! 
Removing an object from memory! 
์—ฌ๊ธฐ์„œ ๋ฌด์—‡์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ๊ณ„ํšํ•œ๋Œ€๋กœ ๋ชจ๋“  ์ผ์ด ์ผ์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค! ๊ฐ์ฒด์˜ finalize() ๋ฉ”์„œ๋“œ๊ฐ€ ์žฌ์ •์˜๋˜์—ˆ์œผ๋ฉฐ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ํŒฌํ…€ ์ฐธ์กฐ๋ฅผ ReferenceQueue์— ๋„ฃ์—ˆ ์Šต๋‹ˆ๋‹ค . ๊ฑฐ๊ธฐ์— ์žˆ๋Š” ๋™์•ˆ clear() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์šฐ๋ฆฌ๋Š” ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด cleanup()์„ ํ˜ธ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค). ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐœ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :) ๋ฌผ๋ก  ํŒฌํ…€ ์ฐธ์กฐ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ด๋ก ์„ ์•”๊ธฐํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ ์–ด๋„ ์š”์ ๋งŒ ๊ธฐ์–ตํ•œ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ด๋‹ค. ์ฒซ์งธ, ์ด๋“ค์€ ๊ฐ€์žฅ ์•ฝํ•œ ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„ ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์ œ๊ณตํ•œ ์ฐธ์กฐ ๋ชฉ๋ก์€ ๊ฐ€์žฅ ๊ฐ•ํ•œ ๊ฒƒ๋ถ€ํ„ฐ ๊ฐ€์žฅ ์•ฝํ•œ ๊ฒƒ๊นŒ์ง€ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค. StrongReference -> SoftReference -> WeakReference -> PhantomReference ํŒฌํ…€ ์ฐธ์กฐ๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ฐ•ํ•˜๊ฑฐ๋‚˜ ์•ฝํ•˜๊ฑฐ๋‚˜ ์•ฝํ•œ ์ฐธ์กฐ๊ฐ€ ์—†์„ ๋•Œ๋งŒ ์ „ํˆฌ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ) ๋‘˜์งธ, get() ๋ฉ”์„œ๋“œ๋Š” ํŒฌํ…€ ์ฐธ์กฐ์— ๋Œ€ํ•ด ํ•ญ์ƒ null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์ž๋™์ฐจ์— ๋Œ€ํ•ด ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์ฐธ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค.

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

public class Main {

   public static void main(String[] args) {

       Sedan sedan = new Sedan();
       HybridAuto hybrid = new HybridAuto();
       F1Car f1car = new F1Car();

       SoftReference<Sedan> softReference = new SoftReference<>(sedan);
       System.out.println(softReference.get());

       WeakReference<HybridAuto> weakReference = new WeakReference<>(hybrid);
       System.out.println(weakReference.get());
      
       ReferenceQueue<F1Car> referenceQueue = new ReferenceQueue<>();

       PhantomReference<F1Car> phantomReference = new PhantomReference<>(f1car, referenceQueue);
       System.out.println(phantomReference.get());

   }
}
์ฝ˜์†” ์ถœ๋ ฅ:

Sedan@4554617c
HybridAuto@74a14482 
null
get () ๋ฉ”์„œ๋“œ๋Š” ์†Œํ”„ํŠธ ์ฐธ์กฐ์™€ ์•ฝํ•œ ์ฐธ์กฐ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ์ผ๋ฐ˜ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์ง€๋งŒ ํŒฌํ…€ ์ฐธ์กฐ์— ๋Œ€ํ•ด์„œ๋Š” null์„ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์…‹์งธ, ํŒฌํ…€ ์ฐธ์กฐ๋Š” ์ฃผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐœ์ฒด๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ณต์žกํ•œ ์ ˆ์ฐจ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋‹ค์•ผ! :) ์ด๊ฒƒ์œผ๋กœ ์˜ค๋Š˜ ์ˆ˜์—…์„ ๋งˆ์นฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ก ๋งŒ์œผ๋กœ๋Š” ๋ฉ€๋ฆฌ ๊ฐˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ๋กœ ๋Œ์•„๊ฐˆ ๋•Œ์ž…๋‹ˆ๋‹ค! :)
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION