TIL::Today I Learn

[TIL] 20230723

madylin 2023. 7. 28. 14:44
반응형

오늘 공부한 내용📓

- C++

개념 공부

가상 소멸자

  • 클래스 상속 시, 해당 클래스의 소멸자도 가상 소멸자로 선언해야 함
  • 가상 소멸자로 선언하지 않으면, 해당 클래스를 동적으로 할당하고 삭제 시, 메모리 누수나 undefined behavior 문제가 발생할 수 있음
  • 부모클래스에서 가상 소멸자로 선언되지 않는다면, 자식 클래스의 객체를 가리키는 포인터가 삭제될 때 부모 클래스의 소멸자만 호출됨. 자식 클래스의 소멸자는 호출되지 않아 메모리 누수 발생함

const Animal* j = new Dog();

  • 위 상황은 업캐스팅(Upcasting) 이라고 하며, 파생 클래스의 객체를 기본 클래스의 포인터 또는 참조형으로 변환하는 것
  • 위 코드처럼 부모 클래스인 Animal 클래스의 포인터인 j 에 Dog 클래스의 객체를 가리킬 수 있는 이유는 C++ 의 다형성(polymorphism) 으로 인해 가능함
    • 다형성이란, 여러 클래스들을 하나의 인터페이스로 동작시키는 개념
    • 여러개의 서로 다른 객체가 동일한 기능을 다양한 방법으로 처리할 수 있음
  • 부모 클래스의 포인터나 참조를 사용하여 자식 클래스의 객체에 접근할 수 있도록 함
  • 이를 통해 프로그램에서 일반적인 인터페이스를 사용하며, 런타임에 실제로 실행될 객체의 타입을 결정할 수 있음

바인딩(Binding)

  • 업캐스팅 상황에서 부모 클래스의 함수를 자식 클래스에서 오버로딩 시, ‘virtual’ 키워드로 선언하지 않으면, 자식 클래스에서 해당 함수 호출 시 부모클래스의 함수가 우선됨
    • 업캐스팅 상황이 아니면, 가상함수로 선언하지 않아도 오버라이딩 할 수 있음
  • 이유는 바인딩과 관련이 있음
  • 바인딩이란, 프로그램에서 식별자와 그에 대응하는 값을 연결하는 과정. 즉, 바인딩은 변수나 함수와 같은 식별자를 해당하는 메모리 위치나 코드 블록에 연결하는 것을 말함
  • 바인딩에는 정적 바인딩과 동적 바인딩이 있음
    • 정적 바인딩(Static Binding)
      • 컴파일 시간에 변수나 함수 호출대상이 결정되는 방식
      • 컴파일러는 식별자의 타입 정보를 바탕으로 해당하는 메모리 위치를 결정하거나, 함수 호출 대상을 정적으로 결정함
      • 컴파일러가 프로그램을 컴파일하는 과정에서 식별자와 값을 연결하므로, 실행시 바인딩이 발생하지 않음
    • 동적 바인딩(Dynamic Binding)
      • 런타임에 변수나 함수 호출 대상이 결정되는 방식
      • C++에서는 주로 가상함수를 사용하여 동적 바인딩을 구현
      • 객체의 타입에 따라 메모리 위치나 함수 호출대상이 동적으로 결정되므로, 실행 시 바인딩이 발생
  • 가상함수로 선언하지 않을 경우 정적 바인딩이 발생되기 때문에, 컴파일 타임에 함수 호출 대상이 결정되어 부모 클래스의 함수가 호출됨

 

 

제가 공부한 내용을 기록하고 있습니다.

혹시 수정이 필요한 부분이 있다면, 댓글로 지적 부탁드립니다!

선한 관심과 도움 감사드립니다😊

반응형

'TIL::Today I Learn' 카테고리의 다른 글

[TIL] 20230727  (0) 2023.07.28
[TIL] 20230726  (0) 2023.07.28
[TIL] 20230721  (0) 2023.07.28
[TIL] 20230720  (0) 2023.07.28
[TIL] 20230719  (0) 2023.07.28