강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

장준혁님의 프로필 이미지
장준혁

작성한 질문수

홍정모의 따라하며 배우는 C++

14.4 exception 소개

noexcept과 throw()

작성

·

42

1

noexcept 키워드와 함수구문 뒤에 예외를 던지지 않을것이라고 명시해주는 throw()키워드는 동일한 것인가요?

답변 2

0

안녕하세요? 질문&답변 도우미 durams입니다.

throw()는 함수 선언 뒤에 따라붙는 걸 말씀하시는거죠? noexceptthrow()를 동일하다고 볼 수도 있습니다만, 확실한 차이가 있습니다.

먼저 throw()를 하는 문법인 Dynamic exception specification 문법은 C++11에서 deprecated되었고, c++17부터는 표준에서 제거되었습니다. 그 이유는 throw()의 괄호에 특정 타입들을 명시하여 발생 가능한 예외를 명시하는 경우 발생 가능한 문제들이 있었기 때문이라고 합니다.

간단히 말씀드리자면 기본적으로 throw()는 타입이 주어진 경우, 명시되지 않은 타입의 예외가 발생한다면 프로그램이 종료됩니다. 그런데 만약 예를 들어 throw(int)와 같이 타입을 명시한 함수에서 어떠한 외부 라이브러리 함수를 사용하는데, 라이브러리 함수가 업데이트되어 다른 타입의 예외를 발생시킨다면 어떻게 될까요? 프로그래머는 해당 예외에 대응하기 위해 가장 낮은 레벨에서부터 최상위 레벨까지 모든 코드를 수정해야합니다. 라이브러리의 업데이트를 저해하는 부수적인 효과는 덤이구요.

C++17부터는 타입을 명시하지 않은 throw()만 사용할 수 있으며, 컴파일러에게는 noexcept(true)로 인식됩니다. 그리고 그 마저도 C++20부터는 표준에서 제거되었다고 합니다. (레거시 코드와의 호환성 지원을 위해서인지 컴파일러에 따라 사용이 가능한 경우는 있습니다)

0

안녕하세요, 인프런 AI 인턴입니다.

장준혁님, noexcept 키워드와 함수 구문 뒤에 붙는 throw()는 C++에서 함수가 예외를 던지지 않을 것을 보장하기 위해 사용됩니다. 둘은 비슷한 목적으로 사용되지만, 몇 가지 차이점이 있습니다.

  1. noexcept: C++11부터 도입된 키워드로, 함수가 예외를 던지지 않겠다고 명시합니다. 컴파일러 최적화와 관련된 유리한 점이 있습니다. noexcept는 제외 조건도 제공할 수 있으며, 불리언 표현식을 통해 동적으로 except 여부를 결정할 수 있습니다.
   void func() noexcept; // 예외를 던지지 않음
  1. throw(): 이전 C++ 표준에서 사용되던 방식으로, 함수가 예외를 던지지 않을 것임을 표시합니다. 그러나 noexcept가 도입된 이후로는 사용이 줄어들고, throw()를 deprecated로 간주하기도 합니다.
   void func() throw(); // 예외를 던지지 않음 (구식)

따라서 C++11 이후부터는 noexcept를 사용하는 것이 권장됩니다. 둘의 주된 차이는 noexcept가 더 유연하고 최적화에 도움을 줄 수 있다는 점입니다.

관련 질문을 확인해 보시려면 아래 링크를 참고하세요:
- [throw; vs throw e;의 차이가 궁금합니다.]

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

장준혁님의 프로필 이미지
장준혁

작성한 질문수

질문하기