• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

14.3 예외처리 클래스 상속과 객체 잘림에 대하여 질문 있습니다.

20.08.28 21:51 작성 조회수 232

0

클래스는 Exception 클래스와 Exception 클래스를 상속받은 ArrayException 클래스를 선언 했습니다.

보시는 바와 같이 메인 함수에서 doSomething 함수를 호출합니다.

그리고 doSomething 함수 내부에서 my_array[100]에서 오버로딩한 [ ] 연산자 함수를 호출합니다.

그러면 오버로딩한 [ ] 연산자 함수에서 예외가 발생하여 throw에 의해서 ArrayException타입 객체를 기본 생성자를 호출하여 생성된 객체를 doSomething 함수의 내부에 있는 catch에 넘겨줍니다.

그렇게 되면 catch 옆에 (Exception& e) 처럼 값에 의한 전달이 아닌 참조에 의한 전달로 객체 자체를 넘겨줍니다. 그러면 Exception 클래스를 상속받은 ArrayException객체 자체를 e로 넘겨줍니다.  그리고나서 e.report()를 통해서 report 함수에 구현된 내용이 실행됩니다. 

여기서 제가 궁금한것이 있습니다. 객체 잘림현상은 참조에 의한 전달이 아닌 값에 의한 전달에서 발생한다고 배웠는데 어째서인지 값에 의한 전달이 아닌 참조에 의한 전달로 객체 자체를 전달 했음에도 코드 실행 결과는 ArrayException클래스에서 구현한 report 함수의 내용이 아닌 Exception클래스에서 구현한 report 함수의 내용이 실행됩니다. 

제가 알고있는 객체 잘림 현상에 대한 지식이 잘못된 것인지 아니면 예외 처리 클래스의 상속에 대해한 객체 잘림 현상이 특별한 경우인지 아니면 단순히 throw e와 throw의 차이인지 궁금합니다.

그다음에 메인 함수에서도 (Exception& e)에 값에의한 전달이 아닌 참조에 의한 전달로 객체 잘림이 발생한 ArrayException클래스 타입의 객체가 전달됩니다. 그리고 Exception 클래스에서 구현한 report 함수가 실행됩니다. 

여기서는  doSomething 함수의 내부에서 객체 잘림 현상이 발생해서 Exception 클래스에서 구현한 report 함수가 실행된거라고는 이해가 됩니다. 

그러면 왜 doSomething 함수 내부에서 객체 잘림이 발생한 것인지 궁금해서 질문 드립니다.

긴글 읽어주셔서 감사합니다.

답변 2

·

답변을 작성해보세요.

1

Hello Yeo님의 프로필

Hello Yeo

2020.08.29

안녕하세요?

처음 질문은 이전에도 비슷한 질문이 있었는데 https://www.inflearn.com/questions/42161 를 참고해보시면 좋을 것 같습니다.

두번째는 doSomething 함수 안에서 Exception을 던졌기 때문에 바깥에서도 Exception으로 받은 것입니다. typeid.name() 등을 통해서 확인해보셨으면 좋겠습니다. typeid 에 대해서는 https://en.cppreference.com/w/cpp/language/typeid 를 참고하시면 도움이 될 것이라 생각합니다.

0

velnuty님의 프로필

velnuty

질문자

2020.08.31

긴글 읽어주셔서 감사드리고 답변 감사합니다!!  덕분에 이해가 되었습니다!