RTTI(Run Time Type Infomation)

STUDY/C++|2022. 6. 18. 22:04
RTTI란

RTTI란 Run Time Type Infomation으로
프로그램 실행 즉 런타임 중 타입정보를 식별할 수 있는것 입니다.
정확하게 실행중에 기반 클래스 타입 포인터의 실체를 밝혀내는것입니다.

 

RTTI는 정적 타입체크와 각상함수들로는 해결이 불가능한 문제들이 제시되어

C++ 표준화 위원회가 RTTI를 추가 승인하게 되어 표준이 되었습니다.

 

1991: First meeting of WG21

1994: CD1 <RTTI 등장 : CD2에 내용이 없어서 CD1으로 판단하였는데 정확하지 않습니다>

1996: CD2  <Exception Handling, Template 등장>

1997: FDIS (Final Draft International Standard)

1998: C++ Standard (C++98)

 

RTTI가 필요한 이유

RTTI는 다형성을 가진 클래스 즉 가상함수가 하나라도 포함된 클래스의 타입을 알아내기 위해서 나왔다고 볼 수 있습니다.

많은 이유 중 하나는 가상함수가 포함된 클래스의 타입은 동적 바인딩에 의하여 런타임에 결정되게 되므로

런타임에 가상함수가 포함된 클래스의 타입을 확인하기 위하여 만들어졌습니다.

 

클래스의 다형성은 가상함수에 의해 구현되므로

RTTI는 가상함수를 갖는 클래스의 상속관계에서 사용이 가능합니다.

 

가상함수가 없는 클래스는 가상함수 테이블이 없기 때문에

RTTI에 대한 정보 또한 존재하지 않아 포인터의 타입을 가져와 처리를 합니다.

 

RTTI를 이용한 대표적 기능
  • typeid
  • type_info
  • dynamic_cast

Typeid는 두 객체의 데이터형이 같은지 확인이 가능하고 개체의 정확한 형식을 식별하는데 사용됩니다.

Typeid는 <typeinfo> 헤더를 선언하고

typeid(변수 or 자료형)으로

#include <typeinfo>
#include <iostream>

int main()
{
	const std::type_info& type = typeid(int);
	std::cout << type.name() << std::endl;
	return 0;
}

와 같이 선언이 가능합니다.

 

type_info는 이 typeid연산자의 반환 값으로 <typeinfo> 헤더 파일에 정의되어 있는 클래스이며

어떤 특별한 데이터형에 대한 정보를 저장합니다.

이 type_info는 특별한 데이터형을 비교할 수 있도록 == 와 !=의 연산자가 사용이 가능합니다.

 

마지막 dynamic_cast는 이 RTTI에 대하여 의존적이며

런타임에 상속 관계를 분석하여 형 변환이 가능하면 형 변환을 진행하고

불가능하다면 포인터의 경우 nullptr을 반환, 참조의 경우 std::bad_cast를 throw합니다.

제가 작성한 코드에서는 dynamic_cast를 위 3가지 중 제일 많이 사용하였으며

추후 캐스팅을 다룰 예정이지만 상속관계를 체크하므로 static_cast보다는 조금 느린 단점이 존재합니다.

 

'STUDY > C++' 카테고리의 다른 글

업캐스팅과 다운캐스팅  (0) 2022.06.14
오버로딩, 오버라이딩  (0) 2022.06.05
OOP-객체 지향 프로그래밍  (0) 2022.05.30

댓글()

업캐스팅과 다운캐스팅

STUDY/C++|2022. 6. 14. 17:43

먼저 캐스팅이란 타입을 변환하는 것을 말하며 '형변환'이라고도 합니다.

업캐스팅과 다운캐스팅은 정의만 정리합니다.

 

업캐스팅

업 캐스팅이란 하위 클래스의 객체가 상위 클래스 타입으로 형변환으로 변환되는 것을 말합니다.

  • 업캐스팅시 원래 자식 클래스의 메소드는 접근이 불가능하다.
  • 명시적 형변환을 하지 않아도 형변환이 가능하다.

 

다형성을 통하여 재사용성을 높일 수 있습니다.

업캐스팅을 통하여 사용할 수 있는 예로는

  • 동일한 기반(부모) 클래스를 처리하는 함수를 사용하여 같은 파생(자식) 클래스를 한번에 사용할 수 있습니다.
  • 동일한 기반(부모)를 가지는 클래스들을 보관하는 컨테이너를 통한 사용이 가능합니다.

 

다운캐스팅

다운캐스팅이란 업캐스팅이 되면 기본 클래스에 정의된 멤버만 호출할 수 있기 때문에 동일한 타입의 포인터가 동일한 타입을 가리키게 하는 것을 말합니다.

  • 다운캐스팅은 반드시 명시적 형변환이 필요하다.
  • 서로 동일한 타입이여야한다.

 

이러한 다운캐스팅의 대표적인 예는 dynamic_cast로 상속 관계에 있는 클래스간의 형변환이 있으며 RTTI를 통하여 다양한 방식의 타입 캐스팅을 지원합니다.(이는 나중에...)

'STUDY > C++' 카테고리의 다른 글

RTTI(Run Time Type Infomation)  (0) 2022.06.18
오버로딩, 오버라이딩  (0) 2022.06.05
OOP-객체 지향 프로그래밍  (0) 2022.05.30

댓글()

오버로딩, 오버라이딩

STUDY/C++|2022. 6. 5. 22:15
오버로딩(Overloading) : 함수의 중복 정의

 

오버로딩이란 같은 이름의 함수를 호출하더라도 매개변수에 따라 다른 함수가 실행되는 것입니다.

간단히 코드로 작성해 보겠습니다.

 

#include <iostream>
#include <string>
using namespace std;

inline void Test(int iTest)	{ cout << iTest << endl; }
inline void Test(string strTest){ cout << strTest << endl; }

int main()
{
	Test(1);
	Test("Hello World!");
	return 0;
}

같은 Test라는 함수를 호출하였음에도 

실행 결과

매개변수에 따라 1과 Hello World!가 출력이 되므로

같은 이름으로 다른 기능을 사용할 수 있게 됩니다.

예시로 Sum()으로 두 변수를 더하는 함수인데 (int, int), (int, float), (float, float) ... 을 만들고 싶다면

Sum_IntToInt, Sum_IntToFloat 가 아닌 Sum(int *, int *), Sum(int *, float *)와 같이

매개변수를 다르게 하여 활용이 가능하여 다형성의 예로 들수 있습니다.

 

오버라이딩 : 함수 재정의

 

오버라이딩이란 상속관계에서 부모클래스의 함수를 사용하지 않고 자신만의 함수로 재정의하여 사용하는 것을 말합니다.

 

#include <iostream>
using namespace std;

class Parent
{
public:
	inline void Test(int iTest) { cout << "Parent : " << iTest << endl; }
};

class Child : public Parent
{
public:
	inline void Test(int iTest) { cout << "Child : " << iTest << endl; }
};

int main()
{
	Parent P;
	Child C;
	P.Test(777);
	C.Test(777);
	return 0;
}

실행 결과

다음과 같이 같은 Test를 호출하였지만 자식은 부모의 Test를 재정의하여

자신만의 Test를 가질수 있게 됩니다.

자식에서의 오버라이딩을 할 때에는

  • 메소드(함수)의 이름이 같아야 한다.
  • 메소드(함수)의 인자 개수, 자료형이 같아야 한다.
  • 리턴형이 같아야 한다.
  • 재정의시 구현부가 동일하거나 추가되어야 한다.
  • 오버라이드하는 함수가 상위(부모) 클래스에 존재하여야 한다.

위의 조건을 지켜야합니다.

'STUDY > C++' 카테고리의 다른 글

RTTI(Run Time Type Infomation)  (0) 2022.06.18
업캐스팅과 다운캐스팅  (0) 2022.06.14
OOP-객체 지향 프로그래밍  (0) 2022.05.30

댓글()

OOP-객체 지향 프로그래밍

STUDY/C++|2022. 5. 30. 23:52
객체(Object)란?

 

객체란 세상에 존재하는 모든 것 또는 주변에 있는 사물, 생명체 모두 포함되는 개념입니다.

OOP에서의 객체란 데이터와 개념을 묶은 클래스*에서 정의한 것을 메모리에 등재되어 할당된 것을 말합니다.

 

클래스(Class)란?

 

특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀입니다.

실제 IDE에서는 구조체의 연장선으로서 세부적으로는 디폴트 접근 지정자*의 차이만 존재합니다.

클래스는 객체가 아니며 하나의 클래스로 여러 객체의 생성이 가능합니다.

 

접근 지정자란?

 

구조체(Struct)의 디폴트 접근 지정자는 public

클래스(Class)의 디폴트 접근 지정자는 private

 

default : 접근 지정자가 없는 형태로 동일한 패키지 안에서만 접근이 가능합니다.

public : 어디서든 접근 허용

private : 클래스 내에서만 접근 허용

protected : 상속관계에 놓여있을 때, 유도 클래스에서의 접근 허용

 

객체 지향 프로그래밍의 특징

 

객체 지향 프로그래밍에는 4가지 특성이 있습니다.

 

  • 캡슐화(encapsulation)
  • 상속성(inheritance)
  • 추상화(abstraction)
  • 다형성(polymorphism)
캡슐화

 

캡슐화란 데이터와 코드의 형태를 클래스로 캡슐처럼 감싸는 것을 말합니다.

객체가 어떻게 기능들이 구현되어 있는지를 외부에 감춤으로 정보은닉의 장점을 취할 수 있습니다.

상속성

 

상속성이란 상위 클래스(부모)의 모든 것을 하위 클래스(자식)가 물려받는 것을 말합니다.

OOP에서는 자식이 부모를 선택함으로 필요한 부분을 물려받아 코드의 중복을 방지하고 개발 시간을 줄이는 효과를 얻을 수 있습니다.

추상화

 

추상화란 객체의 공통적인 특징은 취하고 차이점은 제외하거나 불필요한 세부 사항을 제거하여 간략화하는 것을 말합니다.

실제로 존재하는 객체들을 프로그램으로 만들기 위하여 공통적인 특성을 파악하고 특성을 제거하는 과정입니다.

예로 for, while, do~while가 '반복'이라는 개념을 취하여 추상화한 것입니다.

다형성

 

다형성이란 하나의 객체가 여러 가지 타입을 대입할 수 있는 것을 말합니다.

또한 부모 클래스에서 물려받은 가상 함수를 자식 클래스 내에서 오버라이딩하는것 또한 포함되며

예로는 오버라이딩, 오버로딩, 템플릿이 존재합니다.

 

객체 지향의 장˙단점

 

객체지향의 장점

  • 재사용성
  • 생산성 향상
  • 유지보수

객체지향의 단점

  • 개발 속도가 느림
  • 실행 속도가 느림
  • 새로운 인력 투입 시 기존 분기들을 파악하는데 시간이 오래 걸림

'STUDY > C++' 카테고리의 다른 글

RTTI(Run Time Type Infomation)  (0) 2022.06.18
업캐스팅과 다운캐스팅  (0) 2022.06.14
오버로딩, 오버라이딩  (0) 2022.06.05

댓글()