기술(Tech, IT)/C++

[C++] Pointer (포인터)

Daniel803 2023. 10. 27. 11:16

포인터는 C와 C++를 비롯해 많은 프로그래밍 언어에서의 기본 개념으로, 메모리 주소에 직접 접근을 제공해 동적 메모리 관리르 가능하게 하며 기타 기능을 제공한다. 그러나 이러한 기능에는 잠재적인 함정이 있다. 포인터 사용의 장점과 단점을 알아보자.

 

1. 장점

  • 동적 메모리 할당
    : (malloc(), calloc(), new 등) 동적 메모리 할당이 가능하며, 이는 애플리케이션의 필요에 따라 런타임 중에 메모리를 할당할 수 있음을 의미한다. 이건은 linked list, tree, graph와 같은 많은 데이터 구조에 필수적이다.
  • 효율성 - 추가로 다룰 예정
    : 프로그램의 실행이 더 효율적으로 될 수 있다. 메모리에 직접 접근하면 (데이터를 복사하는 대신) 특정 작업을 더 빠르게 수행할 수 있다.
  • 유연성
    : 배열, 문자열 및 기타 데이터 구조와 유연하게 작업할 수 있다. 예를 들어, 함수에 포인터만 전달해 큰 데이터 구조체 (예: 배열) 를 함수에 쉽게 전달할 수 있고, 이로 인해 전체 구조를 복사하는 오버헤드를 피할 수 있다.
  • 데이터 구조와 고급 알고리즘
    : 많은 고급 데이터 구조 (tre,, linked list, graph 등) 및 알고리즘이 포인터를 기반으로 작동한다.
  • 함수 포인터
    : C와 같은 언어에서 함수 포인터는 다형성의 형태를 제공해 함수를 다른 함수의 인수로 전달하는 것을 가능하게 하며, 고차 함수와 콜백 메커니즘 설계를 돕는다.
  • 메모리 관리 제어
    : 포인터는 메모리에 대한 세밀한 제어를 제공해 수동 최적화와 메모리 재사용이 가능하다.

2. 단점

  • 복잡성
    : 포인터는 코드를 더 복잡하고 읽기 어렵게 만들 수 있다. 포인터를 통한 간접 참조는 특히 프로그래밍에 익숙하지 않은 사람들에게 어려울 수 있다.
  • 메모리 누수
    : 동적 할당된 메모리가 제대로 해제되지 않으면 메모리 누수가 발생한다. 시간이 지나면 메모리 누수로 인해 사용 가능한 모든 메모리가 소모되어 응용 프로그램이 충돌할 수 있다.
  • 댕글링 포인터 (허상 포인터, Dangling Pointers)
    : 해제되었거나 범위를 벗어난 메모리 위치를 가리키는 포인터는 역참조될 때 정의되지 않은 동작을 초래할 수 있다.
  • Null Pointer 역참조
    : 포인터가 초기화되지 않고 실수로 역참조되면 segmentation fault나 정의되지 않은 동작이 발생할 수 있다.
  • Buffer Overflow
    : 포인터가 가리키는 메모리를 잘못 관리하면 (할당된 배열의 끝을 넘어서 작성하는 것과 같은) 인접한 메모리를 덮어쓸 수 있어서 buffer overflow가 발생해, 보안 취약점이 발생할 수 있다.
  • 어려운 디버깅
    : Null Pointer 또는 Dangling Pointer와 같은 포인터 관련 오류는 디버깅이 어렵다.
  • 오류 발생 위험 증가
    : 포인터와 관련된 수동 메모리 관리 때문에 특히 초보 프로그래머에게 오류를 만드는 위험이 증가한다.

결론적으로, 포인터는 강력하며 많은 장점을 제공하지만, 주의와 깊은 이해가 필요하다. C++ 11이후 smart pointer나 Java와 같은 언어의 Garbage Collector (GC, 가비지 컬렉터)와 같은 현대 프로그래밍 언어와 패러다임은 이러한 어려운 점을 완화하는 데 도움을 주도록 개발됐다.