전체 글 233

[Modern C++] 함수 객체와 람다식

함수 객체와 람다식함수 객체 : 함수처럼 작동하는 객체 (function object/functor)예제 코드를 보기 전에 알아야 하는 내용이 있다.bool f(int x) { //}int main() { f(1);}f(1)에서의 소괄호 ()는 연산자임을 기억하자.(물론 f는 객체가 아니긴 하지만) f.operator()(1); 이런 식으로 연산자를 호출해서 작동을 한다.그래서 소괄호 연산자에 대해서도 오버로딩을 해줄 수가 있다.#include using namespace std;class Equals { public: Equals(int value) : value(value) {} bool operator()(int x) const { return x == ..

[C/C++] 함수 포인터

함수 포인터모든 명령어들은 전부 0과 1로 메모리에 저장이 되기 때문에, 메모리 저장 공간의 주소를 가지고 있다함수 포인터는 함수에 대한 포인터를 가지고 있다.bool compare(int a, int b) { return a == b;}int main() { bool (*fp)(int, int); int *a;}int *a를 a를 역참조하면 int형이 나온다라고 해석할 수 있다.이런 것처럼 fp를 역참조를 하면 bool을 리턴하고 int 2개를 매개변수로 받는 함수다 라고 해석할 수 있다.fp는 int 2개를 받고 bool을 반환하는 함수를 가리키는 포인터이다.bool compare(int a, int b) { return a == b;}int main() { bool (*f..

[C++] 예외 처리(Exception handling)

예외 처리(Exception Handling)예외 Caseex) 파일이 제대로 열리지 않는 경우 ex) 데이터 포맷이 맞지 않아 데이터를 받을 수 없는 경우Factorial을 구하는 함수#include using namespace std;int fact(int n) { if (n == 0) return 1; return n * fact(n - 1);}int main() { int n; cin >> n; if (n 이렇게 사용자가 실수로 음수를 입력할 수 있다.n이 음수인 경우 fact함수가 실행되지 않도록 처리를 해줘야 함#include using namespace std;int fact(int n) { if (n == 0) return 1; return n * fa..

[C++] 템플릿 특수화와 비타입 파라미터

템플릿 특수화와 비타입 파라미터템플릿 특수화지난 시간에 함수 템플릿을 다루면서 아래 코드를 봤을 거에요#include #include using namespace std;template T getArraySum(const T arr[], int n) { T sum = arr[0]; for (int i = 1; i ssumd에서 hello, world, luna 사이에 공백을 넣어주고 싶다.이는 일반적인 함수 템플릿으로는 불가능하다템플릿 특수화를 통해서 템플릿 파라미터에 특정 타입이 들어왔을 때 다른 식으로 특수하게 작동하도록 만들어 줄 수 있다.#include #include using namespace std;template T getArraySum(const T arr[], int n) {..

[C++] 함수 템플릿과 클래스 템플릿

함수 템플릿과 클래스 템플릿함수 템플릿배열의 합을 구하는 예제를 봐보자#include using namespace std;int getArraySum(const int arr[], int n) { int sum = 0; for (int i = 0; i int 형이 아닌 float 타입등 여러 자료형으로 이루어진 배열의 합을 구하고 싶은 경우가 있을 것이다.이 때 Overloading을 통해서 float getArraySum이라는 함수를 또 만들어 줘야 한다#include using namespace std;int getArraySum(const int arr[], int n) { int sum = 0; for (int i = 0; i float 자료형 이외에도 다른 자료형의 합을 구..

[C++] 정사각형-직사각형 문제

정사각형-직사각형 문제앞에서 다이아몬드 문제에 의한 객체지향의 한계점을 살펴봤다면, 이번에는 정사각형-직사각형 문제로부터 객체지향의 한계점을 살펴보자#include using namespace std;class Rectangle { // 직사각형 public: Rectangle(double a, double b) : a(a), b(b) {} private: double a, b;};class Square { // 정사각형 public: Square(double a) : a(a) {} private: double a;};정사각형 is a 직사각형네 변의 길이 모두따라서 정사각형과 직사각형을 상속관계로 구현해보자정사각형 is a 직사각형 이므로, 정사각형은 직사각형으로..

[C++] 다중 상속과 다이아몬드 문제

다중 상속과 다이아몬드 문제한 클래스가 여러 부모를 가지고 있는 경우를 다중 상속이라고 한다cf) 자바와 C#은 다중 상속을 허용하지 않음#include using namespace std;struct Mom { int a = 1;};struct Dad { int b = 2;};struct Child : Mom, Dad { int c = 3;};int main() { Child ch; cout 여기까지는 문제가 없다.만약 Dad의 멤버 변수가 b가 아니라 a라면?#include using namespace std;struct Mom { int a = 1;};struct Dad { int a = 2;};struct Child : Mom, Dad { int c = ..

[C++] 객체 지향 프로그래밍의 4대 원칙(원리)

객체 지향 프로그래밍(OOP)의 4대 원리캡슐화(Encapsulation)상속성(Inheritance)다형성(Polymorphism)추상화(Abstraction)캡슐화(Encapsulation)What?데이터(멤버 변수)와 기능(멤버 메서드)을 하나의 단위로 묶어 놓음데이터 은닉접근 제어를 통해 멤버 변수는 숨기고, Getter와 Setter와 같은 데이터 접근을 위한 메서드를 노출When?언제든!Why?클래스를 사용하는 사람은 멤버 메서드 사용법만 알면 되고, 클래스 내부 구조에 대한 이해가 필요하지 않음사용자가 데이터를 실수로 잘못 바꾸는 것을 방지How?클래스 안에 멤버 변수, 멤버 메서드 선언 / 접근 제어상속성(Inheritance)What?부모 클래스의 멤버를 재사용해서 자식 클래스에서도 사용..

[C++] 상속에서의 형변환 - RTTI와 dynamic_cast

상속에서의 형변환 - RTTI와 dynamic_caststatic_cast: 정적인 시간(컴파일 타임)에 캐스팅이 일어남dynamic_cast : 동적인 시간(런타임)에 캐스팅이 일어남복습! static castclass Base { public: int x;};class Derived : public Base { public: int y;};int main() { Base *b = new Derived; Derived *d = static_cast(b);}b가 가리키는 인스턴스의 타입을 알고 있다면, static_cast를 이용하여 형변환을 해줄 수 있었다RTTI(Run Time Type Information/Identification)b가 실제로 어떤 타입을 가리키는지 컴..

[C++] 상속에서의 형변환 - 다운캐스팅

상속에서의 형변환 - 다운캐스팅(Downcasting)다운 캐스팅 : 부모 클래스에서 자식 클래스로 내려 보내는 형태의 캐스팅static_cast와 dynamic_cast가 있다.static : 정적인 시간(컴파일 타임)에 발생하는 캐스팅ex) double->int, int->double다음과 같은 클래스가 있다고 해보자#include using namespace std;class Base { public: int a = 1;};class Drv1 : public Base { public: void f() { cout b에서는 멤버 변수 a만 접근이 가능하다b에서도 자식 클래스의 고유 멤버에 접근을 해보고 싶다그러면 b가 가리키는 객체를 Drv *d1 = b로 넣을 수 있지..