C++

46

C++ 정적 결합(Static Binding)과 동적 결합(Dynamic Binding)

프로그램이 함수를 호출할 때 실행 코드의 어느 블록이 사용되는지에 대한 대답은 컴파일러에게 있습니다. 먼저 소스 코드에 있는 함수 호출을 특정 블록에 있는 함수 코드를 실행하라는 뜻으로 해석하는 것을 "함수 이름을 결합(binding)이라고 합니다. C언어에서는 각각의 함수가 별개의 함수에 해당하기 때문에 이 작업이 간단하지만(함수 오버 로딩이 없음.) C++에서는 함수 오버 로딩 때문에 이 작업이 조금 복잡합니다. 이 결합은 컴파일 타임에 이루어지고 이 결합을 정적 결합(static binding)또는 초기 결합(early binding)이라고 합니다. 하지만 가상 멤버 함수(virtual 키워드가 달린)들은 프로그램이 실행할 때 사용자가 객체를 결정하기 때문에 컴파일 타임에는 진행할 수 없습니다. 그..

프로그래밍/C++ 2019.10.22 Plorence

C++ 가상 파괴자(virtual destructor)의 필요성

일반적으로 파괴자에서 처리해야 할 작업이 없으면 파괴자 정의 자체를 안 하는 경우가 많습니다. 할당한 걸 해제해줘야 하는 경우 파괴자를 정의하고 처리해줘야 하는 게 정상입니다. 가상 파괴자는 다음과 같은 상황일때 필요합니다. 기초, 파생 클래스에서 파괴자를 정의 한경우에 (필요로 할 때) 업 캐스팅될 여지가 있는 경우에 가상 파괴자가 아닐 때 #include using namespace std; class Person { public: ~Person() { cout

프로그래밍/C++ 2019.10.18 Plorence

C++ 다형(polymorhphic)과 가상 멤버 함수(virtual member function)

다형 파생 클래스에 대해 하는 행동이 기초 클래스에 대해 하는 행동과 다른 멤버 함수가 요구되는 상황이 있을 것입니다.(호출하는 객체에 따라 행동이 달라짐.) 즉 호출하는 객체에 따라 멤버 함수의 행동이 달라질 수 있습니다. 처한 상황에 따라 멤버 함수가 여러 가지 다른 행동을 할 수 있기 때문에, 여러 가지 형식을 가지고 있다는 의미에서 그러한 복잡한 행동을 다형이라고 부릅니다. 가상 멤버 함수(virtual method) 먼저 기초 클래스의 멤버 함수를 파생 클래스에서 재정의 하는 방법은 virtual 키워드를 사용하는 것입니다. 재정의할 때는 함수 시그니처가 동일해야 합니다. 간단한 예시를 들어보면 Person이라는 클래스를 정의하고 각각 Man, Girl이라는 클래스도 정의 후에 이 클래스는 Pe..

프로그래밍/C++ 2019.10.18 Plorence

C++ is-a 관계와 has-a 관계

is-a 관계 is-a 관계는 파생 클래스에 있어서 상속의 조건인데 is-a 관계의 의미인 ~은 ~이다라는 관계를 성립하자는 것입니다. public 상속을 사용할 때는 is-a관계가 성립되도록 만들어야 합니다. 예를 들어서 "사과는 과일이다"은 성립합니다. 사과는 과일이니까요. 틀린 예로 "과일은 사과이다."가 있겠습니다. 문장 그대로 과일이라는 단어는 사과를 의미하지 않으니까요. 그래서 Apple 클래스는 파생클래스로 Fruit 클래스를 상속할 수 있는 것입니다. is-a관계여야만 하는 이유 여러가지 과일의 대한 클래스를 만들 때, 기본적으로 그 사과들이 가지고 있는 공통적인 특징을 추상화한 클래스가 기초 클래스고 상속받은 여러가지 과일 클래스가 파생 클래스입니다. 이처럼 범위가 좁아지면서 기능이 기초..

프로그래밍/C++ 2019.10.18 Plorence

C++ 클래스 상속(class inheritance)

C++는 클래스를 확장하고 수정하기 위해 단순한 코드 수정보다 더 강력한 수단을 제공합니다. 바로 클래스 상속입니다. 기초 클래스(base class)라 부르는 클래스로부터 모든 멤버 함수와 멤버들을 상속받고 새로운 파생 클래스(clerived class)를 만들 수 있게 합니다. 상속으로 할 수 있는 일 기존의 클래스에 기능을 추가할 수 있습니다. 클래스가 나타내고 있는 데이터에 다른 것을 더 추가할 수 있습니다. 클래스 멤버 함수가 동작하는 방식을 변경할 수 있습니다. 상속의 의미 어떤클래스를 다른 클래스로부터 상속할 때, 오리지널 클래스를 기초 클래스(base class)라 하고 상속받는 클래스를 파생 클래스(derived class)라고 합니다. 위에서도 언급했지만 상속받게되면 멤버, 멤버 함수에..

프로그래밍/C++ 2019.10.18 Plorence

C++ 멤버 초기자 리스트(member initializer list)

C++에서는 상수인 클래스 멤버를 초기화시키기 위하여 특별한 문법을 제공합니다. 문제 상황 및 해결 일반적으로 상수인 클래스 멤버를 생성자를 통하여 초기화시키지 못합니다. 그래서 생성자의 코드 실행전인 객체가 생성될 때 초기화해야 합니다. #include class Person { const int age; Person(int p_age) { age = p_age; //허용안됨 } }; int main(void) { } 위에 방법으로는 상수인 클래스 멤버를 초기화할 수 없습니다. 그래서 나온게 멤버 초기자 리스트입니다. #include class Person { const int age; Person(int p_age) : age(p_age){//허용됨 } }; int main(void) { } 위와 같..

프로그래밍/C++ 2019.10.17 Plorence

C++ new 연산자와 delete 연산자

new, delete연산자는 동적 할당과 해제에 연관되어 있으며 C++에서 제공하는 방법입니다. C언어에서는 malloc함수와 free함수를 통해서 동적 할당과 해제가 가능했었습니다. 동적 할당의 필요성 동적 할당은 미리 할당할 필요도 없으며, 원하는 크기를 정확히 할당이 가능하므로 쓸모없는 크기를 잡아먹지 않게 됩니다. 만약 계속 문자열을 입력받고 계산해야하는데 입력받은 문자열의 크기는 10~10000이라고 가정합시다. 동적 할당을 하지 않을 경우 정적 할당(지역변수)으로 최대 문자열의 크기인 10000을 잡고 미리 할당해야 합니다.(이런 경우 입력 문자열이 10이라면 필요 없는 메모리 공간이 9990이나 됩니다.) 하지만 동적할당은 입력받은 문자열의 크기를 구해서, 그 크기만큼 동적 할당하게 되면 필..

프로그래밍/C++ 2019.10.17 Plorence

C++ 자동변환과 클래스의 자료형 변환(변환 함수)

C++은 표준 자료형의 값이 다른 표준 자료형과 호환이 될 때 암시적 형 변환이 이루어집니다. 반면에 호환되지 않은 자료형은 변환하지 않습니다. 자동으로 자료형이 변환되지 않는 경우에 명시적 형변환을 이용하면 해결할 수 있습니다. int * ptr = (int*)10; 기본 자료형이나 다른 어떤 클래스와 충분히 관련되어 있어, 서로 간에 변환할 수 있는 클래스를 정의할 수 있습니다. 그러한 경우에, 자동 변환을 할 것인지 강제 변환을 할 것인지 사용자가 C++에게 지시할 수 있습니다. C++에서 하나의 매개변수를 취하는 생성자는 그 매개변수 데이터형의 값을 클래스형으로 변환하는 설계도처럼 동작합니다. Person(int p_age); 위 생성자는 int형 값을 Person형 값으로 변환하는 구문 역할을 ..

프로그래밍/C++ 2019.10.17 Plorence

C++ this 포인터

C++에서는 this라는 특별한 포인터가 제공됩니다. 오로지 클래스에서만 사용됩니다. 빠른 이해를 돕기 위해서 예제를 통하여 설명하겠습니다. 자신을 리턴해야 할때 #include class Person { private: int age; public: Person(int p_age) { //파괴자 age = p_age; } Person Clone(); }; Person Person::Clone() { return ? ? ; //뭐가 들어가야 할까? } int main(void) { Person per1 = Person(1); Person per2 = per1.Clone(); } Person클래스의 멤버 함수 Clone은 자기 자신을 반환하려는 멤버 함수입니다. 근데 여기서 자기 자신을 가리키려면 어떻게 ..

프로그래밍/C++ 2019.10.15 Plorence

C++ const 멤버 함수

const 멤버 함수는 객체가 const일 때 호출 가능하게 만들어주기 위해 있습니다. 에러가 나는 상황 #define _CRT_SECURE_NO_WARNINGS #include #include class Person { char * name; public: Person(const char * strName) { name = new char[strlen(strName) + 1]; strncpy(name, strName, strlen(strName)+1); } ~Person() { delete[] name; } void Print() { std::cout

프로그래밍/C++ 2019.10.15 Plorence

C++ 접근 제어자(Access Modifier)

접근 제어자(Access Modifier) 접근 제어자 또는 접근 지정자라고 부르는 사람도 있습니다. 접근 제어자에는 총 3개의 키워드가 있습니다. private public protected protected는 상속과 관련되어 있으므로 상속을 공부할 때 배우면 됩니다. private 접근 제어자 먼저 private는 클래스 내부에서만 직접적인 접근이 가능합니다. 만약에 변수의 접근 제어자를 private로 설정해놨다면 그 변수는 클래스 내부에서만 접근 가능하고 객체에서는 직접적인 접근이 불가능합니다. #include class Person { private: int age = 10; char name[100]; public: int GetAge() { return age; //가능 } }; int ma..

프로그래밍/C++ 2019.10.14 Plorence

추상화(abstraction)

추상화(abstraction) 설명할 추상화에 대해서는 OOP언어 공통의 내용입니다. 추상화는 구체적인 것을 분해해서 관심 영역에 대한 특성만을 가지고 재조합하는것 입니다. 말그대로 필요한 정보들만 간추려서 구성하는 것입니다. OOP에서 추상화를 진행할 때 고려해야 할 사항 어떤 종류의 객체들을 정의할 것인가? 각 객체는 어떤 필드들과 메소드들을 갖는가? 자동차를 대상으로 추상화해보기 기름을 넣을수 있는 량 자동차 타입(소형,중형,대형 등) 시동을 건다. 움직인다. 브레이크를 건다. 시동을 끈다. 기름을 넣는다. 정도 추상화를 할 수 있습니다. 자동차는 날 수 없으므로 날다 라고 추상화가 불가능합니다. 아직까진 하늘을 나는 자동차는 없습니다. 그리고 추상화는 모든 객체에 공통적인 성질들만 담고 있어야 합..

프로그래밍/C++ 2019.10.14 Plorence