728x90 CPP 가상 함수(Virtual Function) 가상 함수(virtual function)란? 부모 클래스(기본 클래스)에서 선언되어 자식 클래스(파생 클래스)에 의해 재정의되는 멤버 함수 가상 함수는 기본 클래스 내에 virtual 키워드로 함수를 선언 가상 함수를 왜 사용할까? 가상 함수를 사용하지 않으면 오버라이딩 시에 문제가 있을 수 있음! 자식 클래스에서 포인터 변수로 객체에 접근할 때 의도치 않게 동작할 수 있다. cpp에서는 컴파일러는 포인터 변수가 가리키고 있는 변수의 타입을 기준으로 함수를 호출하지 않는다. 포인터 타입을 기준으로 함수를 호출! 아래 코드를 보자. class A { public: void check() { std::cout 2022. 1. 18. CPP friend 클래스와 함수 friend 클래스란? 다른 클래스의 private 및 protected 멤버에 접근할 수 있게 해주는 키워드! friend class A; 클래스 내에서 friend로 다른 클래스를 등록해놓으면, private와 proteced로 접근하지 못하게 만든 변수 또는 함수에 접근 가능! 아래 예제 코드를 보자 class A { private: int num; friend class B; }; class B { void set_A_num(A &a, int n) { a.num = n; } }; 클래스 B의 set_A_num함수에서 A의 클래스의 num에 직접 접근해서 값을 변경했다. 원래 A 클래스의 num은 private이라 다른 클래스에서 직접 접근하지 못한다. 그러나 A클래스에서 friend 키워드를 통해.. 2022. 1. 18. CPP template template이란? 함수나 클래스를 다시 작성하지 않고도 여러 자료형으로 사용할 수 있도록 하게 만들어 놓은 틀 template는 cpp 기본 내장이어서 헤더를 딱히 써주지 않아도 된다. 그렇다면 template를 왜 쓸까? 밑에 코드를 보면 쉽게 이해 가능! int i_sum(int a, int b) { return a + b; } double d_sum(double a, double b) { return a + b; } 원래는 sum을 구현하기 위해, 매개변수의 자료형이 다를 때마다 함수를 새로 만들어줘야 했다. 이게 너무 번거로우니깐 자료형을 지정하지 않고 모든 자료형을 매개변수로 사용 가능한 함수를 만들기 위해 template 사용! typename으로 이름을 지정하고, 지정한 이름을 자료형처럼.. 2022. 1. 17. CPP Container와 Iterator Container cpp에서 처음 접한 개념 container가 뭘까? container는 말 그대로 저장소로라고 생각하면 쉽다. 같은 타입의 여러 객체를 저장하는 일종의 집합이다. 컨테이너는 클래스 템플릿이다. 컨테이너 변수를 선언할 때 컨테이너에 포함할 요소의 타입을 명시할 수 있다. 그렇다면 왜 배열을 안 쓰고 container를 쓸까? container 종류 중 하나인 "vector"를 예로 들어 생각해보자. int a[10]과 같이 선언해서 int 배열을 쓸 수 있는데, 굳이 왜 vector를 쓸까? int a[10]; vector b(10); vector에는 배열에 특화된 여러 유용한 함수들을 가지고 있다. 예로 뒤에 값을 추가할 수 있는 push_back이 있다. 많은 값을 저장하는 것에 특.. 2022. 1. 17. CPP struct class 기본 액세스 한정자 CPP에서는 C와 다르게 struct에서 함수, 생성자, 소멸자를 다 가지고 있을 수 있다! 짱 신기!!!🥳 그렇다면 class와 struct의 다른 점은 뭘까? 둘은 다 똑같은데 액세스 한정자(Access Modifiers)가 다르다 class = private struct = public class와 struct는 서로 또는 각자를 상속할 수 있다 default inheritance access specifier를 알아보자! 자식 부모 엑세스 한정자 struct struct public struct class public class struct private class class private 자식의 액세스 한정자를 따라간다고 생각하면 간단하다 struct A { }; class B { }; stru.. 2022. 1. 17. uint32_t 자료형이란? C와 CPP에 등록되어 있는 자료형은 아니고, 에 typedef 되어 자료형처럼 사용! 앞에 u가 붙어있으면 unsigned라는 뜻 uint32_t = unsigned int 32비트 자료형 밑에 코드는 stdint.h에 정의된 자료형 typedef signed char int8_t; typedef short int16_t; typedef int int32_t; typedef long long int64_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned long long uint64_t; typedef signed char int_least8_t; t.. 2022. 1. 14. cpp 난수 생성 (random number generation) : PRNG 컴퓨터는 일반적으로 난수를 생성할 수 없음!! 그래서 의사 난수 생성기를 통해 난수 생성 코드를 짜 보자👊 의사 난수 생성기(pseudo-random number generator: PRNG) 시드(seed)라고 하는 시작 번호를 가지고 시드와 전혀 다른 번호로 변환하기 위해 수학 연산을 수행하는 프로그램 곱하기와 더하기 같은 수학 연산을 통해 오버플로우를 발생시켜 난수를 만든다! // 벡터의 인덱스의 값을 난수로 받을것이기에 unsigned int 사용! unsigned int PRNG(unsigned int range) { // 처음 시드는 큰 수(오버플로우가 날 수 있도록)로 임의로 지정 // static으로 seed를 두어 계산되어있는 시드를 재사용할 수 있도록 함 -> 난수가 동일하게 나오는 것.. 2022. 1. 8. cpp 멤버 이니셜라이저(Member Initializer) cpp에서는 멤버 이니셜라이저를 지원! 멤버 이니셜라이저가 뭘까? 멤버(member) = 클래스 내의 멤버 변수 이니셜라이저(initializer) = 초기화 멤버 이니셜라이저 = 클래스가 생성되면서 바로 멤버 변수를 초기화해주는 것 멤버 이니셜라이저가 왜 생겼을까!? 멤버 이니셜라이저가 있기 전에는 밑에 코드와 같이 생성자 안에서 변수를 초기화해줘야 했다 class A { private: int a; public: A(int _a) { a = _a; } } 이렇게 생성자를 통해서 멤버 변수를 초기화하는 것은 불편하기에 멤버 이니셜라이저(Member Initializer) 필요! 멤버 이니셜라이저의 장점 1. 초기화의 대상을 명확히 인식이 가능 2. 선언과 동시에 초기화가 이뤄지는 바이너리 코드가 생성되.. 2022. 1. 3. cpp static const 변수 c++98으로만 코드를 짜는 중에 발생한 오류! error: default member initializer for non-static data member is a C++11 extension [-Werror,-Wc++11-extensions] 클래스 안에서 변수 초기화는 c++11부터 지원해준다!😱 class A { private: int a = 0; } 이렇게 쓰는 것이 불가능!! c++98에서 static const 변수에는 클래스 안에서 초기화가 가능! 그렇다면 static const는 왜 클래스 안에서 초기화가 가능할까!? static 변수란? 객체들이 생성될 때마다 생성되는 것이 아닌, 클래스가 정의되기 이전(프로그램 시작과 끝까지)부터 메모리에 할당된 변수 = 클래스 변수(클래스 당 하나씩.. 2022. 1. 3. cpp 멤버 함수 안에서 자신과 동일한 클래스 객체 private 멤버 접근 밑에 코드를 보면 원래 temp.num은 private이라 바로 접근해서 값을 바꿀 수 없다 근데 저 코드를 컴파일해보면 오류가 안 난다!! 왜일까!?? class Sum { private: int num; public: void sum { // num이 private이지만 자신의 클래스와 동일한 멤버 함수에서는 num에 접근 가능!! Sum temp; temp.num = 3; } } 멤버 함수 안에서 자신과 동일한 클래스 객체를 생성했을 때, 그 클래스 객체는 자기 클래스의 멤버 함수에 있는 것처럼 자신의 private 멤버에 자유롭게 접근이 가능하다! 너무 신기함!! 🤭🤭 2021. 12. 30. 이전 1 2 3 다음 728x90