본문 바로가기
반응형

프로그래밍174

C++, 연산자 오버로딩 설명과 사용법!!(교환법칙까지~) 보통 데이터의 값을 더하거나 뺄 때 저희는 이런 식으로 작성할 겁니다. int n1 = 10; int n2 = 20; int sum = n1 + n2; 하지만 객체의 덧샘을 하게된다면?? class A 가 있다고 가정해 본다면 A a1; A a2; A a3 = a1 + a2; 이런 식의 객채 연산은 상식적으로 불가능 하다고 보여집니다. 하지만 이를 가능하게 하는것이 바로 연산자 오버라이딩 입니다. 즉, '+'를 오버라이딩 하는 것입니다. 이때 사용하는 것이 operator라는 함수 키워드 입니다. 사용 방법을 보면 이렇습니다. #include using namespace std; class A { public: int n1; A(int n1) { this->n1 = n1; } }; A operator+(.. 2019. 3. 12.
C++, const란?, 사용법! C, C++에서 const란 상수 라는 의미입니다. 즉, 변수, 함수, 객체, 포인터 등.... 을 상수화 시킬 수 있는 키워드 입니다. 그럼 상수란?? 데이터의 초기화가 이뤄지면 그 값을 바꿀 수 없도록 해 주는 것입니다. 선언 시 const 변수는 데이터 영역에 들어가게 되며 컴파일과 동시에 데이터 영역 메모리로 올라가 버립니다. 따라서 일반적으론 값의 변경이 이뤄나선 안되는 경우 주로 사용하게 됩니다. 사용 예제를 보도록 하겠습니다. #include #include using namespace std; class A { private: int num; string name; public: A() {} A(int num, string name) { this->num = num; this->name =.. 2019. 3. 12.
C++, friend 사용법. C++ 에선 friend 라는 키워드가 존재합니다. friend를 선언하게 되면 private 맴버 변수의 접근이 가능해 집니다. 예제를 보면.... #include #include using namespace std; //class B; class A { private: int num; string name; friend class B; public: A() {} A(int num, string name) { this->num = num; this->name = name; } }; class B { A *a; public: void createA() { a = new A(10, "haha"); } int sum() { return a->num + 10; } void fix_Name(string name.. 2019. 3. 11.
C++ virtual 함수란? ※해당 글의 내용이 다소 부족하다 생각하여 다시 정리해서 글을 썻습니다. https://hwan-shell.tistory.com/225 부족하다 느끼시는 분들은 참고해 주세요!! virtual(가상함수)에 들어가기 앞서 두 개념을 짚고 넘어가야 합니다. 흔히 상속관계에서 오버라이딩을 하게되면 자식 클래스가 부모 클래스의 함수를 가리는 형태가 되어 자식 클래스의 함수가 호출되게 하는것이 오버라이딩입니다. 즉, 오버라이딩은 함수의 재정의 라고 판단하시면 됩니다. 형변환이란 데이터의 형태가 다르더라도 해당 형태에 따라 바꿔주는 것을 말합니다. 아래 예시를 보면...... #include using namespace std; int main(void){ int num = 0; double dou = 10.4; .. 2019. 3. 11.
C++ 오버라이딩?? 이건 또 뭘까? C++에서 오버라이딩 이라는 개념이 존재 합니다. 오버라이딩은 상속관계에 있을 때 나타나는 기능인데, 오버로딩과는 다르게!! 함수의 반환 값, 매개변수, 이름 모두 동일해야 합니다. 그럼 도대체 왜 사용하느냐? 이유가 뭐냐? 그것은 바로 virtual기능을 사용할 때 진가가 발휘 되는데 이것에 대해선 나중에 설명하도록 하겠습니다. 우선 중요한 것은 이걸 정의하는 방법과 활용에 대해 알아 두는 것입니다. 우선 정의 방법은 이렇습니다. #include using namespace std; class A { int num = 10; public: void show_Pt() { cout 2019. 3. 4.
C++ 오버로딩? 그게 뭘까? 오버로딩이란? 객체지향 언어의 특성 중 하나로 같은 이름의 함수를 여러 개 만들 수 있는걸 말합니다. 단!! 조건이 있는데 ※매개 변수를 무조건 다르게 정해줘야 하는 것입니다. 예시를 통해 확인해 보도록 하겠습니다. 정상적인 오버로딩. #include using namespace std; void fct_1(void) { cout 2019. 3. 4.
C++ 복사 생성자, 왜 그렇게 생겼냐? 복사생성자를 보면 이렇습니다. 클래스 이름 (const 클래스 이름 &참조변수) 즉, 상수로 선언된 참조자이며 type은 클래스(자기자신)이 되는 것입니다. 복사 생성자 자체는 원래 기존 값을 복사해 전달해주는 개념이라 이 과정에서 값이 바뀌어선 안됩니다.(복사인데 값이 바뀌게 된다면 복사가 아니겠죠?) 따라서 const로 선언된 것이고 정의되어 있습니다. 그렇다면 왜 참조자로 받느냐 인데......... 이걸 이해 하려면 우선 복사 생성자의 호출을 알아야 합니다. 복사생성자가 호출될 때는 1. 대입연산을 할 때 2. 매개 변수로 들어갈 때 3. 반환 값이 있을 때 즉, #include #include using namespace std; class A { int num; string name; publ.. 2019. 2. 24.
C++ 소멸자란? 소멸자란 객체의 사용이 끝나고 메모리의 반환될 때 자동으로 실행되는 코드를 말합니다. 생성자 처럼 사용자가 따로 선언을 하지 않으면 컴파일러가 컴파일시 자동으로 생성해줍니다. #include using namespace std; class A { int num; public: ~A() {} }; int main(void) { A a; return 0; }​ 이렇게 생겼습니다. '~' 로 시작하게 됩니다. 그럼 주로 어떨때 사용이 되느냐? #include using namespace std; class A { int * num; public: A() { num = new int[10]; } ~A() { delete num; } }; int main(void) { A a; return 0; }​ 이처럼 객채.. 2019. 2. 22.
C++ this 포인터?? 그럼 *this 는 뭐지? ※ *this에 대한 설명은 맨 아래에 설명하고 있습니다. 맨 아래만 보면 이해가 잘 가지 않을테니 처음부터 차근차근 읽어주시기 바랍니다.^^ 또한 설명 중 C++의 '참조자'와 포인터의 '값의 참조' 부분이 햇갈릴 수 있으니 유의해 주세요!! C++ 에서 this란 자기 자신을 나타내는 말입니다. 즉 Class A a; 라는 객체가 있고 이 a의 주소값은 0x10 이라고 가정한다면 a 객체에서의 this는 0x10이라는 뜻입니다. 일단 코드로 확인해 보자면 #include using namespace std; class A { int num; public: void print_This() { cout 2019. 2. 22.
C++상속 관계에서의 생성자 호출 생성자는 객체를 만들게 되면 자동으로 실행되는 코드 입니다. 그럼, 상속관계에서의 생성자 호출은 어떤식으로 진행이 될지? 코드로 설명하겠습니다. #include using namespace std; class A { public: A() { cout 2019. 2. 21.
C++의 생성자, 문자열 초기화 C2664 오류시 해결!! C++에서 클래스를 생성하면 생성자가 자동으로 생깁니다. 여기서 생성자란!! 객체선언시 자동으로 실행되는 코드를 말합니다. #include using namespace std; class A { A() {}; //이런 코드가 원래 생기지만 보이지 않을 뿐!! }; int main(void) { return 0; } ​ Class를 선언하게 되면 해당 Class의 이름과 같은 함수가 생성되고 위와 같이 아무런 기능이 없이 생성되는 생성자를 '디폴트 생성자' 라고 합니다. 그리고 이 디폴트 생성자는 사용자가 아무런 기능을 넣지 않으면 코드 실행시 자동으로 생성되어 컴파일을 진행하게 됩니다. 즉, 생성자를 코드상으로 표현하지 않아도 컴파일 과정에서 자동으로 디폴트 생성자가 생성되는 것입니다. 생성자는 주로 초.. 2019. 2. 20.
C++ public, protected, private에 대한 설명 public = 어디서든 접근이 가능. protected = 상속관계일 때 접근이 가능 private = 해당 클래스에서만 접근이 가능 #include using namespace std; class A { public: int num1; A() : num1(5), num2(6), num3(7) {} protected: int num2; private: int num3; }; int main(void) { A a; cout 2019. 2. 19.
C언어] 포인터(2) 사용법 포인터의 사용법은 이렇습니다. 선언 후 초기화. int num = 10; int *p; p = # 선언과 동시에 초기화 int num = 10; int *p = # 여기서 &num은 주소 값을 전달한다는 의미 입니다. 배열도 포인터가 됩니다. int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int *p = arr; printf("%d\n", p[3]); 즉 포인터 변수에 배열의 시작 주소 값을 받으면 포인터 변수는 배열처럼 사용이 가능 합니다. 그럼 여기서 의문점이 하나 생깁니다. "&arr로 주지 않고 arr로만 줬는데 주소 값이 넘어갔내?" 원래 배열의 값을 표현할 때는 arr[0] 이런식으로 표현 합니다. 하지만 뒤에 대괄호를 빼고 arr만 표.. 2019. 1. 19.
메모리 구조에 대해서(stack, heap, buffer overflow) 프로그램을 만들고 실행을 하게되면 메모리 라는 곳에 코드들이 올라가 실행되게 됩니다. 사실 메모리는 물리적 메모리(Physical Memory)와 가상 메모리(Virtual Memory)로 나뉘게 됩니다.일반적으로 코드를 실행하면 가상메모리에 적재 됩니다. 물리적 메모리는 RAM이고 가상 메모리는 HDD의 용량에서 가져와 사용하게 됩니다.운영체제는 프로그램을 실행할 때 필요한 최소정보만 RAM에 저장을 합니다.그리고 이를 Working set이라고 합니다. 그 후 프로그램을 실행하면서 필요한 데이터 정보를 가상 메모리에서 가져와상황에 맞게 물리적 메모리에 맵핑하고 맵핑을 해제하고이런 작업을 반복하게 됩니다. 이것을 페이징(Paging)기법 이라고 합니다. 가상메모리의 주소 데이터들을 일정한 크기의 블록으.. 2019. 1. 19.
c++ new의 사용법, malloc과의 차이(free, delete) ※컴퓨터의 메모리 구조를 알고 보시면 더 쉽게 이해할 수 있습니다. 메모리 구조 보러가기(클릭) 프로그램을 만들다 보면 상황에 따라 추가적인 메모리 공간을 실시간으로 확보해야 할 경우가 많습니다. 예를 들자면 채팅 대화방에 2명이 접속해 있는데 3명이 더 추가 접속을 했다거나 컴퓨터에 자료를 추가적으로 입력해 저장해야 하거나 등.... 여러가지 경우가 있습니다. 이것은 컴퓨터의 소프트웨어 사용시 변화가 유동적으로 일어나기 때문에 어찌보면 당연한 일이기도 합니다. 서론이 긴 이유는 제가 공부하고 배우면서 이 동적 메모리의 사용 이유를 제대로 파악하지 못한 채 배웠고 그로 인해 무엇이 중요한지도 제대로 모르고……. 답답한 느낌도 들고……. 무엇을 공부하거나 배울 때 목적이나 이유를 알고 지식을 습득하는 것이.. 2019. 1. 19.
728x90
반응형

스킨편집 -> html 편집에서