프로그래밍 언어/C & C++ 정리

모던 C++ 함수형 프로그래밍 null 포인터

뽀또치즈맛 2023. 12. 17. 06:48
++

 이전의 C++과 비교하면 모던 C++에서는 어떤 것이 달라졌는지,
사실 많은 변화가 있었음은 알지만
그럼에도 불구하고 필자는 해당 기능들을 잘 알지 못한다.
때문에 게시글과 같이 성장하고자
매일 C++에 관련된 포스팅을 하고자 함을 기반으로
필자의 학습에 초점을 두어 작성되는
작성된 게시글이기에
독자 위주의 게시글이라기 보다는,
필자의 독서 기록용 게시글이 취지에 더욱 맞음을 인지해주고 읽어주길 바란다.

++

 

[ 프로그래밍 패러다임(Programming Paradigm) ]

프로그래밍 패러다임(Programming Paradigm)은 프로그래머에게 프로그래밍의 관점을 갖게 하고

코드를 어떻게 작성할 지 결정하는 역할을 한다.

새로운 프로그래밍 패러다임을 통해서는 새로운 방식으로 생각하는 법을 배우게 되고,

이를 바탕으로 코드를 작성하게 된다.

 

  • 명령형 프로그래밍: 무엇(What)을 할 것인지 나타내기보다 어떻게(How) 할 건지를 설명하는 방식
    • 절차지향 프로그래밍: 수행되어야 할 순차적인 처리 과정을 포함하는 방식 (C, C++)
    • 객체지향 프로그래밍: 객체들의 집합으로 프로그램의 상호작용을 표현 (C++, Java, C#)
  • 선언형 프로그래밍: 어떻게 할건지(How)를 나타내기보다 무엇(What)을 할 건지를 설명하는 방식
    • 함수형 프로그래밍: 순수 함수를 조합하고 소프트웨어를 만드는 방식 (클로저, 하스켈, 리스프)

 

 

 

null 포인터

 

 모던 C++의 또 다른 새로운 기능은 nullptr인데,

이 키워드는 null 포인터를 가리키기 위해 사용됐던 NULL 매크로를 대체한다.

이제 NULL 매크로를 사용할 때, 0을 지칭하는 것인지 아니면

null 포인터를 지칭하는 것인지 모호했던 경우를 피할 수 있다.

다음 두 개의 함수 서명을 보자.

 

void funct(const char*);
void funct(int)

 

 

첫 번째 함수는 매개변수가 포인터 타입이고 두 번째 함수는 정수이다.

이제 다음과 같이 함수를 호출한다고 가정해보자.

 

funct(NULL);

 

원래 의도는 매개변수가 포인터인 첫 번째 함수를 호출하는 것이다.

하지만 함수 호출에 사용된 인수 NULL은 사실 숫자 0으로 정의된 매크로이므로

원래 의도와 다르게 정수를 매개변수로 받는 두 번째 함수가 호출이 된다.

모던 C++에서는 확실하게 null 포인터를 가리키고 싶다면 다음과 같이 쓸 수 있다.

 

funct(nullptr);

 

 

컴파일러는 이제 null 포인터를 매개변수로 받았기 때문에 원래 의도대로 첫 번째 함수를 실행한다.

더 이상 모호함은 없으며 예상하지 못한 문제도 피할 수 있다.