여러 가지 Reference

Strong Reference

  • 일반적인 참조 형태.
  • 객체가 참조되는 동안에는 GC에 의해 수집되지 않는다.

Weak Reference

  • Strong Reference와 다르게 GC에 의해 수집될 수 있다.
  • Ex. WeakHashMap1, Listener2.
      exampleButton.setOnClickListener(object: View.OnClickListener {
          // 액티비티를 약하게 참조한다.
          val weakActivity = WeakReference(this@ExampleActivity)
    
          override fun onClick(view: View?) {
              val activity = weakActivity.get()
              activity?.let {
                  // 액티비티의 멤버에 안전하게 접근한다.
              }
          }
      })
    


Soft Reference

  • 메모리가 부족해지면 GC에 의해 회수된다.
  • 캐시와 같이 메모리에 민감한 구현에 사용된다.

Phantom Reference

  • 객체가 GC에 의해 회수되기 직전에 정리 작업을 수행할 기회를 제공한다.
      val queue = ReferenceQueue<Object>()
      var importantObject = Object()
      val phantomReference = PhantomReference<Object>(importantObject, queue)
       
      importantObject = null
                
      System.gc()
      
      val ref = queue.poll()
      ref?.let {
          // 정리 작업 수행. Ex. 리소스 해제.
      }
    


1키를 약한 참조로 저장한다. 즉, 키가 참조되지 않으면 해당하는 엔트리는 Map에서 삭제된다.
2Listener에서 외부 객체를 참조할 때는 약한 참조를 사용해야 한다.