CPP 48

cpp 타입 변환

타입 변환 유형 비트열 재구성 여부를 기준으로 나눈다. 값 타입 변환 의미를 유지하기 위해서 원본 객체와 다른 비트열로 재구성한다. 비트열을 바꾸고, 논리적으로 말이 되게 바꾸는 변환이다. 여기서 논리적으로 말이 된다는 것을 예로 들자면, 불독은 개로 변환될 수 있지만 개는 불독으로 변환하지 않는다. 모든 개가 불독이 아니기 때문이다. 그리고 개는 기사로 변환되는 것도 논리적으로 맞지 않다. int a = 1234;// 2의 보수 float b = (float)a;// 부동소수점 Dog dog = bulldog;// Bulldog은 Dog의 자식 클래스 참조 타입 변환 참조 타입 변환은 자주 쓰이지 않는다. 이것보다 포인터 타입 변환이 자주 쓰인다. 비트열을 재구성하지 않고 관점만 바꾼다. 안전하다면 암..

cpp 동적 할당과 인자로 받는 클래스 주의점

기본 개념 메모리 구조 [ [코드 영역] [data 영역] [heap 영역] [stack 영역] ] Data 영역 프로그램이 실행하는 동안 메모리에 올라와 있다. 주로 전역/정적 변수가 할당된다. Stack 영역 함수가 시작할 때 메모리에 올라오고 함수가 종료하면 정리된다. 잠시 사용하는 용도로 사용한다. 주로 지역/매개 변수가 할당된다. 몬스터를 1마리 ~ 5만 마리 생성한다고 할 때, 어느 영역에 저장해야 할까? stack 영역에 저장하면 stack overflow가 발생하면서 프로그램이 강제 종료된다. data 영역에 저장하면 최대 값을 저장하기 때문에 빈 공간이 많아진다. 즉, 메모리 낭비가 심하다. 따라서 항상 일정하지 않고 실시간으로 바뀔 수 있는 정보를 저장하기 위해 heap 영역을 사용한다..

cpp struct와 class의 차이, static

struct vs class struct TestStruct { int _a; int _b; }; class TestClass { int _a; int _b; }; int main() { TestStruct ts; ts._a = 1; TestClass tc; tc._a = 1;// 에러! return 0; } struct와 class의 차이는 기본 접근 지정자의 차이가 있다. struct는 접근 지정자를 적지 않으면 public으로 간주한다. 반면에 class는 private으로 간주한다. struct가 있는 이유는 아마 C언어와의 호환성을 위해서 있는 것 같다. 별로 차이는 없지만 굳이 용도를 구분하자면, struct는 그냥 데이터 묶음(구조체)을 표현할 때, class는 OPP의 특징을 나타낼 때 사..

cpp 객체지향(7-연산자 오버로딩)

연산자에는 대표적으로 사칙 연산, 대입 연산, 비교 연산이 있다. 이때 우리가 만든 클래스는 해당 연산을 사용할 수 없다. 우리가 연산자를 정의하지 않았기 때문이다. 이제 클래스를 위한 연산자를 만들어본다. 연산자 오버로딩 오버로딩은 겉은 같지만 속은 다르다를 떠올리면 된다. 같은 연산자(+, -)라 할지라도 피연산자에 따라 다른 연산을 수행한다. int number = 1 + 1; string str = "예시" + "입니다"; 위와 같은 연산을 수행하면 number에는 2가 str에는 "예시입니다"가 저장된다. 이처럼 연산자는 같지만 자료형에 따라 숫자를 더하거나 문자열을 붙이거나 한다. 멤버 연산자 함수 우리가 정의한 클래스가 연산자를 이용하려면 멤버 또는 전역 연산자 함수를 정의해야 한다. 먼저 ..

cpp 객체지향(6-초기화 리스트)

멤버 변수 초기화 초기화 되지 않은 멤버 변수에는 컴파일이 쓰레기 값을 저장한다. 이는 버그를 발생시키는 주요 원인이다. 따라서 멤버 변수는 초기화를 해야 버그가 발생하지 않는다. 이제 초기화 방법을 알아보자. 초기화 방법 생성자 내에서 설정 class Knight { public: Knight(int hp) { _hp = hp; } public: int _hp; }; 초기화 리스트 초기화 리스트는 상속 관계에서 원하는 부모 생성자를 호출할 때 필요하거나, 포함 관계에서 원하는 클래스의 생성자를 호출할 때 필요하다. // Knight와 포함 관계에 있는 클래스 class Inventory { public: Inventory() { cout

cpp 객체지향(4-은닉성)

은닉성(Data Hiding) Data Hiding == 캡슐화(Encapsulation) 몰라도 되는 정보를 숨긴다. 외부에 공개하는 것과 내부에서 숨기는 것을 따로 지정한다. 왜냐하면 첫 번째, 건드리면 안되는 경우가 있기 때문이다. 두 번째, 다른 경로로 접근하길 원하는 경우가 있기 때문이다. 건드리면 안되는 경우 private : class 내부에서만 사용 protected : 자식 클래스만 사용 가능 class Car { public:// 공개 void MoveHandle(); void PushPedal(); void OpenDoor(); void TurnKey() { RunEngine(); } private:// class Car 내부에서만 사용 void DisassembleCar();// 차..

cpp 객체지향(3-상속성)

객체지향은 상속성, 은닉성, 다형성을 가진다. 상속성 상속은 부모가 자식에게 유산을 물려줄 때 사용하는 말이다. 여기서도 해당 개념을 적용시킬 수 있다. class Knight { public: void Move(); void Attack(); void Die(); public: int _hp; int _attack; int _defence; }; class Mage { public: void Move(); void Attack(); void Die(); public: int _hp; int _attack; int _defence; }; Knight와 Mage 클래스는 서로 같은 멤버 함수와 변수를 가지고 있다. 만약 Archar, Log, Paladin 등 Knight와 유사한 정보를 가진 클래스를 여..

cpp 객체지향(2-생성자와 소멸자)

2021.09.16 - [CPP공부] - cpp 객체 지향(1-설계도) cpp 객체 지향(1-설계도) 절차(procedure)지향 프로그래밍 - procedure == 함수 즉, 함수 기반 프로그래밍 객체지향 프로그래밍 - 게임 업계에서는 객체지향 프로그래밍 방식을 이용한다. 객체 지향 설계 knight 설계 - 속성(데이 louanna97.tistory.com 코드를 이해하려면 보고 오자. 멤버 함수에서 객체의 "탄생"과 "끝"을 알리는 함수가 있다. 생성자(Constructor): 탄생, 여러개 만들 수 있다. 소멸자(Destructor): 끝, 하나만 만들 수 있다. 생성자(Constructor) 기본적으로 생성자는 객체가 생성됐을 때 호출된다. 생성자에는 여러가지 종류가 있다. 기본 생성자와 암시..

cpp 객체 지향(1-설계도)

절차(procedure)지향 프로그래밍 - procedure == 함수 즉, 함수 기반 프로그래밍 객체지향 프로그래밍 - 게임 업계에서는 객체지향 프로그래밍 방식을 이용한다. 객체 지향 설계 knight 설계 - 속성(데이터): hp, attack, y, x - 기능(동작): Move, Attack, Die // Knight 설계도 // Knight 의 메모리 크기는 16 byte (멤버 변수만 취급) class Knight { public: // 멤버 함수 선언 및 구현 void Move(int y, int x); void Attack(); void Die() { hp = 0;// 멤버 변수를 사용할 수 있다. cout