여기서 잠깐, 오버로딩은 함수 이름의 재정의 ex. 인자의 타입 및 개수에 따라 같은 이름의 함수를 재정의 오버라이딩은 상속관계의 클래스 내에서 함수 재정의 ex. Player 클래스의 Attack 함수, Knight 클래스의 Attack 함수 아래와 같이 가상함수를 오버라이드 하는 경우 override를 붙여줌으로써 오버라이드된 함수라는 사실을 가독성 측면에서 증가시킨다 맨 처음 가상함수를 정의하는 부모 클래스에는 override를 붙일 수 없으며 이를 받는 자식들의 가상함수에 override를 붙인다 class Creature { public: virtual void Attack() { } } class Player : public Creature { public: virtual void Attack..
클래스 내 함수를 막기 위해서는 아래와 같이 private으로 막아주면 된다 class Knight { public: private: void operator=(const Knight& k) { } private: int mhp = 100; } int main() { Knight k1; Knight k2; //k1 = k2;// 복사 연산자 작동 불가 } 하지만 friend를 이용하면 이를 간접적으로 뚫을 수 있다 class Knight { public: private: void operator=(const Knight& k) { } friend class Admin; private: int mhp = 100; }; class Admin { public: void CopyKnight(const Knigh..
enum (unscopped) enum PlayerType { PT_None, PT_Knight, PT_Archer, } 범위가 없고 전역에서 사용할 수 있기 때문에 중복되는 이름이 사용불가하며 이를 막기 위해 'PT_'와 같은 용어를 앞에 붙여서 사용한다 enum class (scopped) enum class ObjectType { Player, Monster, Projectile, } 범위가 정해져있기 때문에 중복되는 이름도 사용 가능하다 그리고 아래처럼 암묵적인 변환이 금지되어 있어 약간의 불편함이 장점, 단점으로 작용한다 enum class ObjectType { Player, Monster, Projectile, } double value = static_cast(ObjectType::Play..
using은 typedef의 단점을 해결한 버전이다 typedef __int64 id; using id2 = int; using의 장점 1) 직관성 typedef void (*MyFunc)(); using MyFunc2 = void(*)(); 2) 템플릿과 함께 사용 가능 template using List = std::vector; //template //typedef std::vector List2; // typedef는 템플릿 사용 불가 int main() { List li; li.push_back(1); } 물론, 아래와 같이 typedef을 간접적으로 사용해서 템플릿과 사용할 수도 있긴 하다 template struct List2 { typedef std::list type; } int main..
nullptr의 의미와 사용 이유 class Test { public: Test(int a) { } Test(void* ptr) { } Knight* FindKnight() { return nullptr; } } int main() { int ptr = NULL;// 예전 사용 방식 //1) 오동작 방지 Test(0);// Test(int a) 생성자 생성 Test(NULL);// Test(int a) 생성자 생성 Test(nullptr);// Test(void* ptr) 생성자 생성 //2) 가독성 Knight* knight = FindKnight(); if(knight == nullptr) {} } nullptr 구현 const class Knight { public: // 그 어떤 타입의 포인터와도..
일반적으로 초기화하는 경우는 ()를 사용하고 특히, 배열의 경우에서는 {}를 사용한다 추가적으로, 본 내용과는 큰 관련은 없지만 클래스에서의 복사 생성자와 대입 연산자의 차이와 함께 클래스에서의 (), {} 초기화를 알아보자 Knight k1; Knight k2 = k1;// 복사 생성자 Knight k3;// 기본 생성자 k3 = k1;// 대입 연산자 Knight k4(k3);// () 초기화 Knight k5{k3};// {} 초기화 다시 돌아와서, 중괄호 초기화를 도입함으로써 아래와 같은 장점이 있다 1) vector 등 container와 잘 어울린다 // 소괄호 초기화 vector v1(3, 1);// 3 capacity를 가지고 있고 1로 모두 초기화해라 // 중괄호 초기화 vector v2..
auto는 형식 연역 (type deduction)으로 자료형을 추론해 주는 기능이다 ex. class Knight { public: int mhp; }; int main() { auto a = 3;// int auto b = 3.14f;// float auto c = 3.14;// double auto d = Knight();// Knight auto e = "Hello";// const char* } 주의할 점! 기본적으로 auto는 const, & 무시가 된다 따라서 아래와 같은 경우를 주의해야 한다 vectorv; v.push_back(1); v.push_back(2); v.push_back(3); for (vector::size_type i = 0; i < v.size(); i++) { auto..
HTTP HTTP는 HTML 문서를 전송받기 위해 만들어진 L7 응용프로그램 계층 통신 프로토콜이다 기본적으로 클라이언트의 요청에 대응하는 응답형식으로 작동한다 헤더는 일반 헤더, 요청 헤더, 응답 헤더, 엔티티 헤더로 분류된다 요청에 사용되는 메서드는 주로 GET, POST이다 L5이상의 경우는 Socket 통신을 하며 Stream 데이터로 전송된다 Stream 데이터의 끝을 지정하는 것이 HTTP에 포함되어 있으며 앞서 배운 Protocol은 16진수였지만 HTTP의 Header와 Payload는 문자열로 구성되어 있어 가독성이 편하다 HTTP의 응답코드 HTTP method POST는 File을 업로드하거나 ID/PWD를 통해 로그인 하는 경우 사용된다 PUT은 Resource를 새로 업로드 DEL..
HTML과 HTTP HTML과 HTTP 웹 기술의 본질은 HTML이라는 HTML 문서를 전달하기 위해 HTTP가 만들어졌다 여러 문서를 보기 좋게 정보 시스템 구축하는 것이 시초였다 URL과 URI Uniform Resource Locator Uniform Resource Identifier URL ⊂ URI Resource: 파일 Locator: 위치 Identifier: 식별자 ex. http://www.text.co.kr/course.do?cmd=searh&search keyword=Test 위와 같은 주소에서 www.text.co.kr 이 부분은 host를 식별하고 그 뒤에 나머지 부분인 /course.do?cmd=searh&search keyword=Test 부분은 경로와 관련된 부분이고 JAV..
DNS 지금까지 배운 L1~L4는 Infrastructure라고 할 수 있고 Application 수준은 인터넷을 이루고 있는 다양한 Service들을 의미하는데 Application 수준에서 그러한 Service 중에서 Infrastructure에 해당하는 것들이 있는데 그중 대표적인 것이 DNS(Domain Name Service)이다 도메인 이름으로 IPv4 주소 결과를 알려주는 데이터베이스 서비스이고 분산 구조형 데이터베이스로 트리 구조의 도메인 네임 체계를 가지고 있다 ex. www.naver.com > 3.3.3.3 www.naver.com은 URL, URI라고 하며 www를 Host Name naver.com을 Domain Name이라고 한다 위 그림처럼 프로세스에서 자신의 DNS에게 www..