목록코딩/C++ (44)
영넌 개발로그

Inheritance 상속? 부모로부터 물려받는 것이다. 코드를 간결하게 짤 수 있다는 장점이 있다. 복사붙여넣기와 같은 개념이지만, 코드가 잘못되어 수정이 필요한 경우 번거로움이 있기 때문에 상속을 사용하는 것이 좋다. 하지만 아무리 자식이라도 부모의 private한 것은 건들 수 없다. 그래서 자식 직접적으로 변수를 접근하도록 만들어 주고 싶다면, 접근 지정자를 protected로 지정해주어야 한다. protected는 class 외부에서는 private과 같은 기능을 하고, 자기 자식(상속 받은)한테는 public과 같은 기능을 한다. 상속 받을 때 public을 적지 않고 class 자식이름 : 부모이름 으로 적으면 부모로부터 받아온 모든 변수,메소드를 private으로 묶어버린다. 즉, 클래스 ..

Friend function class 내에서 선언되함수가 아닌 외부 함수를 친구처럼 사용하겠다는 의미이다. 이는 private에 대한 개념을 무너뜨리는 것과 같다. read, write가 가능하다. //2차원 좌표를 표시하는 클래스 class Coord_2D { friend void outSideShowCoord(const Coord_2D& _c); private: int x; int y; public: Coord_2D(int _x, int _y): x(_x),y(_y){} void showCoord(); }; void Coord_2D::showCoord() { cout

Operator overloading operator는 산술 연산자(+, -, *, /), 비교 연산자(==, !=), 증감 연산자(++, --) 등을 의미하고, overloading은 원래 뜻에 새로운 뜻을 더해준다는 의미이다. 따라서 operator overloading은 객체를 메소드 없이 연산자를 통해 바로 계산을 할 수 있도록 만들어 주는 방법이다. 사용방법 : " operator 연산자 "를 함수 이름으로 사용하여 만든다. 산술 연산자 벡터 더하기를 하고 싶다고 가정을 해보자 우선 아래 코드는 2차원 좌표를 표시하는 클래스를 간단하게 생성하고 a와 b 객체가 잘 만들어졌음을 확인할 수 있다. #include using namespace std; //2차원 좌표를 표시하는 클래스 class Co..

Singleton 패턴 디자인 패턴은 정석이라고 생각하면 된다. 그 중에 싱글톤 패턴은 클래스로부터 오직 한 개의 객체만 생성되도록 하는 방법이다. 이미 만들어진 객체가 있는 상태에서 또 다시 객체 생성 호출이 왔을 경우, static 키워드를 이용하여 원래 만들어진 객체의 주소를 넘겨주는 방식으로 만들어보자 class Car { private: Car() {} static Car* instance; public: static Car* getInstance() { if (instance != nullptr) { return instance; } else { instance = new Car(); return instance; } } }; Car* Car::instance = nullptr; int mai..

class 내에 static을 사용하면 여러가지 효과가 생긴다. 1. static member variable class를 만들어 놓고, 이후에 객체를 만들어 낸다. 하나의 클래스로부터 여러개의 객체가 나오는데 이런 객체와 상관없이 존재하는 변수가 있다. 모든 객체가 마치 자신의 변수처럼 공유한다. 따라서 변경된 내용은 모든 객체에게 보인다. (visible) 객체없이도 사용가능하며, 초기화는 클래스 바깥에서 별도로 해주어야한다. class Car { public: static int year; Car() {} void showYear() { cout

Copy constructor 새로운 객체를 만들 때, 다른 객체의 내용을 복사해서 만드는 경우 호출되는 생성자 원래 오리지널 생성자는 호출되지 않는다. - 컴파일러에 의해 자동으로 생성된다. 모든 member variable을 자동 복사한다. - 별도로 만들 수도 있다. 생성자와 동일하되, 인수는 객체에 대한 reference variable을 받는다. member variable 복사를 직접 모두 처리해줘야 한다. 특별한 일을 더 해야 한다면 별도로 만들어야 한다. Shallow copy 컴파일러 자동 생성 방법> class Car { private: int year; public: Car(int _year) : year(_year) { cout

객체를 함수의 인수로 전달하는 방식은 크게 보면 2가지, 자세히 보면 3가지가 있다. 1. call by valuew 복사본이 넘어가서 오퍼레이션이 행해지고 함수 종료 후, 복사본은 소멸 되고 원래의 객체 값은 변하지 않는다. 2. call by reference(address) 객체의 주소를 넘겨주면, 주소 값을 변경시킬 수 있다. 함수 종료 후에 객체 내용은 변해 있다. 포인터의 일종이라고 생각하면 된다. 3. call by reference variable 예시 코드 > 기본 Car class class Car { private: int year; public: Car(int _year) : year(_year) {} void showYear() { cout

Constructor 생성자 class로부터 object가 만들어 질때 실행되는 함수이다. 클래스 이름과 같은 이름을 함수 이름으로 사용한다. Destructor 소멸자 object가 사라질때 수행되는 함수이다. 클래스 이름에 ~를 붙여서 선언한다. 생성할때 객체 내부에서 사용하려고 동적으로 메모리를 할당 받을 때가 있다. 근데 object가 그냥 사라져버리면 할당 해제가 되지 않은채로 사라지므로 메모리 누수가 생길 가능 성이 있다. 따라서 객체가 할당받은 동적 메모리를 해제해야 할 때 사용한다. 오브젝트가 생성된 구역이 끝날 때 실행된다. 간단한 예시코드를 보며 이해해보자. class Car { public: Car() { cout

pointer 주소를 가르키는 변수타입 char int와 같은 변수 타입 뒤에 * 을 붙여 정의하고 사용한다. dereferencing 포인터 변수 이름 앞에 *을 붙여 그 주소 안에 값을 가져오는 오퍼레이션을 의미한다. 아래 예시에서 *pa 는 10, pa는 3000을 출력한다. #include using namespace std; int main() { int a = 10; cout

NPC란? Non-Player Character 1. 사각형을 움직여보자 화면 상에서 오른쪽으로 갔다가 왼쪽으로 갔다가 하는 코드 Vector2f pos = myRect.getPosition(); if (pos.x > 600.0f) { offset_x = -1.0f; } else if (pos.x < 30.0f) { offset_x = 1.0f; } myRect.move(offset_x, 0.0f); 2. 사각형 움직이는 속도를 조절해보자 초당 30번 while문이 실행된다. window.setFramerateLimit(30); 3. 여러 개의 사각형을 관리해보자 vector npcs(3); int inc = 0; for (auto& _e : npcs) { _e.setSize(Vector2f(30.0f,..