객체 직접 접근과 간접 접근 방식의 차이

Kang Chang Hwan·2024년 5월 23일

Computer Science

목록 보기
2/5

객체 직접 접근(.)과 간접 접근(->)의 차이

period(.)를 통한 객체 직접 접근 방식

#include <iostream>

class MyClass {
public:
    void memberFunction() {
        std::cout << "Hello, World!" << std::endl;
    }
};

int main() {
    MyClass obj;
    obj.memberFunction();
    return 0;
}
  1. 위와 같이 main func에서 객체 obj를 선언하면 obj라는 이름으로 MyClass 객체가 스택에 할당된다.

  2. 그리고 컴파일러가 Symbol Table에 변수 이름과 (데이터 타입), 객체의 주소를 매핑한다.

  1. obj.memberFunction( );
  • 컴파일러가 심볼 테이블의 obj를 찾고 메모리 주소를 찾아가 memberFunc를 실행한다.

포인터(->)를 통한 간접 접근 방식

#include <iostream>

class MyClass {
public:
    void memberFunction() {
        std::cout << "Hello, World!" << std::endl;
    }
};

int main() {
    MyClass* obj = new Myclass( );
    obj->memberFunction();
    delete obj;
    return 0;
}

이 방식은 다음과 같이 일어난다.

  1. 스택 영역에 obj라는 포인터 변수가 메모리 heap 영역에 Myclass( )객체가 생성된 메모리 주소를 값으로 가지고 있는다.
  2. 컴파일러가 심볼 테이블에 obj와 Myclass 객체의 주소를 매핑한다.
  3. 런타임에 obj가 저장해놓은 주소로 접근해 memberFuction( )을 실행한다.
  4. 사용이 끝났다면 힙에 영역된 Myclass객체에 대한 메모리 할당을 해제하기 위해 delete 키워드를 사용한다.

즉, 컴파일러가 컴파일 시 데이터 타입을 Myclass임을 아느냐 또는 Myclass에 대한 포인터임을 아느냐의 차이가 있고

런타임에서는 해당 객체가 있는 주소에 바로 접근해서 함수를 호출하느냐 포인터에 저장된 주소에 접근해서 멤버 함수를 호출하느냐의 차이가 있는 것이었다.

profile
아쉬움 없이 살자. 모든 순간을 100%로!

0개의 댓글