오버라이딩 (overriding) 파생 클래스는 상속을 받을 때 명시한 접근 제어 권한에 맞는 기초 클래스의 모든 멤버를 상속받는다. 이렇게 상속받은 멤버 함수는 그대로 사용해도 되고, 재정의하여 사용할 수도 있다. 멤버 함수의 동작만을 재정의 하는 것이므로, 함수의 원형은 기존 멤버 함수의 원형과 같아야 한다. 오버로딩과 오버라이딩 오버로딩 : 새로운 메서드를 정의하는 것 오버라이딩 : 상속받은 기존의 메서드를 재정의 하는 것 오버라이딩 조건 파생 클래스에서 직접 오버라이딩 가상 함수를 이용해 오버라이딩 파생 클래스에서 오버라이딩 클래스의 상속 #include #include class Base { std::string s; public: Base() : s("기반") { std::cout
virtual virtual 키워드는 가상 함수를 선언할 때 사용하는 키워드이다. 가상함수는 상속받은 클래스에서 재정의할 수 있는 함수로 파생 클래스에서 재정의한 함수가 호출된다. 상속받은 클래스에서 기반 클래스의 함수를 다양하게 수정하거나 확장할 수 있다. 아래 코드를 살펴보자. #include class Base { public: Base() { std::cout
[ 얕은 복사 (shallow copy) ] 값을 복사하는 것이 아닌, 값을 가리키는 포인터(주소 값)를 복사하는 것이다. 변수 생성에서 대입 연산자를 이용한 값의 복사는 문제가 되지 않지만, 객체에서는 문제가 발생할 수 있다. 변수 생성 시 얕은 복사 int x = 10; int y = x; 객체 생성 시 얕은 복사 class Simple { private: int num1; int num2; public: Simple(int n1, int n2) : num1(n1), num2(n2) {} void ShowSimpleData() { std::cout
[ char ] C언어는 미국에서 만들어져 문자 표현은 미국 표준 문자인 ASCII 코드를 표현한다. ASCII : American Standard Code for Information Interchange C언어에서 문자를 표현할 때 char 형식을 사용하며 char 형식은 ASCII 코드를 표현할 수 있는 크기로 설계되었다. 영문 알파벳과 대/소문자, 숫자 문자 및 기타 문자를 포함해도 1byte면 표현이 가능하기 때문에 char는 크기가 1byte로 정해졌다. 하지만 한글 또는 여러 나라의 문자들은 256개를 초과하므로 char형으로 한글 문자를 표현하지 못한다. 때문에 전 세계 모든 문자들을 컴퓨터로 표현할 수 있도록 설계된 표준이 유니코드(Unicode)이다. 영문이 아닌 한글처럼 ASCII 코..
[ string ? ] C++ STL에서 제공하는 클래스로 문자열을 다루는 클래스이다. C에서 char*, char[]로 문자열을 다뤘다면, C++에서는 string을 통해 문자열을 하나의 변수처럼 사용할 수 있다. char*, char []과 다르게 문자열 끝에 '\0' 문자가 들어가지 않고, 문자열의 길이를 동적으로 변경이 가능하다. ● std::cout std::cout은 Stream buffer에 대한 출력을 제어하기 위한 전역 객체이다. 문자열을 출력하려면
연산자 오버로딩 (operator overloading) 함수 오버로딩이란 같은 일을 처리하는 함수를 매개변수의 형식을 달리하여 하나의 이름으로 만들 수 있게 해준다. 마찬가지로, 하나의 연산자를 여러 의미로 사용할 수 있게 해주는 게 연산자 오버로딩이다. 연산자 함수 (operator function) C++에서 연산자를 오버로딩하기 위해서 연산자 함수 (operator function)을 사용한다. operator연산자(parameter) 연산자 함수는 operator 키워드를 사용해 연산자를 오버로딩하며, 오버로딩할 연산자는 operator 키워드와 공백없이 연결되어야 한다. ● 멤버함수로 오버로딩 # include class Foo { private: int xpos; int ypos; publi..
데이터를 처리할 때 보통 Switch case문을 사용한다. 하지만 데이터의 종류가 많아지게 되면 case가 수백 개가 넘어가는 경우가 생긴다. 이 경우 함수 포인터를 통해 Swich문을 제거해 줄 수 있다. Switch문을 이용해 Packet을 처리하는 방식은 case가 많아질수록 성능이 저하될 수 있음. 관리도 어려워지고 가독성도 떨어짐. Switch문을 함수 포인터로 관리할 수 있도록 함. 예를 들어, 아래와 같이 Swich case문을 함수 포인터 형태로 바꿔보자. void Model::ProcessMessage(const int idx, const char* data) { switch(idx) { case 0: ProcessA(data); break; case 1: ProcessB(data); ..