메모리상에 있는 객체에 접근할 길이 없어졌을 때 객체는 생명을 다했다고 말할 수 있다. 접근할 길을 잃은 객체는 어떤 방법으로든 메모리를 실행환경에 되돌려줘야 한다. 객체의 소멸에서 한 가지 주의해야 할 점은 객체는 자기의 스코프가 끝나게 되면 소멸된다는 점이다. 다시 말해, 그 객체가 사용되는 범위를 넘어가게 되면 객체의 사용주기가 끝나게 된다는 것이다. 아래의 예제를 보도록 하자.

class A {};

// A 객체를 사용하는 여러 클래스
class B
{
  void use_A()
  {
    A a;
    a.method();
  }
};

 B 클래스를 보면, A 객체는 A 객체를 포함하고 있는 중과로 혹(use_A())에서만 접근이 가능하다. 따라서 중괄호({})를 벗어나게 되면 이미 A 객체가 소멸(접근불가)되었기 때문에 사용할 수가 없게 된다.

 객체의 스포크를 간단히 정의하면, 객체의 액세스(접근)가 가능한 범위를 의미한다. 따라서 스코프를 벗어나면 접근을 할 수가 없게 된다. 이때 접근할 수가 없다는 것은 사용할 수가 없다는 것을 뜻한다.

 엄밀한 의미의 스코프란 ‘QN(Qualified Name) 없이 접근할 수 있는 영역’을 의미한다. 예를 들어, 객체 A가 temp라는 변수를 가지고 있을 때 스포크 내에선 temp  변수를 바로 사용할 수 있지만, 스코프 밖에선 A.temp 라는 QN을 이용하여 접근을 하게 된다.

 스코프 내에서는 동일한 이름의 변수 – 클래스 포함 – 를 사용할 수 없게 되어있다. 그런데 만일 역할은 다르지만 동일한 이름의 클래스를 가져야 한다면, C++에서는 네임스페이스를 이용하여 이 문제를 해결하고 있으며, 자바에서는 패키지를 이용하고 있다.

Tags: , ,

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.