목록프로그래밍 (47)
강께르의 개발일지
- 앞의 내용에 이어서 연산자 오버로딩에 대해 계속해서 정리하려고 한다. 1. 단항 연산자의 오버로딩 - 앞에서 했던 것은 이항 연산자라고 한다. 지금부터 할 것은 단항 연산자의 오버로딩이다. 대표적인 단항 연산자는 증감 연사자가 있을 것이다. ++pos // 증가 연산자 전위 연산 pos--; // 감소 연산자 후위 연산 - 이것은 어떻게 구현할까? 연산자의 이름은 우리가 알고 있고, 단항 연산자이니 객체가 호출하는 멤버함수의 형태로 오버로딩을 한다면 다음과 같은 형태를 띄게 될 것이다. pos.operator++(); - 전달할 인자가 없는 것은 단항 연산자이기 때문에, 그나마 있는 피연산자 하나는 멤버함수의 호출 용도로 사용하고 있다. 전역함수로 선언한다면 피연산자 하나가 매개변수로 전달되어 다음과..
- 연산자 오버로딩을 공부하던 중, 전역 함수로 연산자 오버로딩을 위해 friend 키워드가 사용된다는 것을 알았다. - 이를 정리하고 연산자 오버로딩을 계속 정리하려고 한다. 1. friend 키워드 - friend 키워드는 멤버로 선언된 특정 클래스나 함수에게 붙여 그들에게 private처럼 접근이 불가능한 멤버를 공개한다는 의미이다. - friend 선언은 어디에 있든지 상관없다. public이든 private든 상관없다. 그렇게 선언된 변수인 클래스나 함수는 그 클래스의 private 멤버에 접근할 수 있다는 것이다. 이는 정보은닉이라는 특징을 무너뜨리는 것이기도 하다. class Point { private: int xPos; int yPos; public: Point(int x = 0, int..
1. 연산자 오버로딩이란? - 오버로딩은 함수의 이름은 같지만 매개변수의 자료형과 갯수에 따라 몸체를 다르게 정의하는 것을 의미한다. - 그럼 연산자 오버로딩은 무엇일까? 연산자가 숫자 계산으로 사용하던 기본적인 기능 말고 오버로딩하여서 다른 자료형 매개변수에 따라 다른 몸체를 정의하는 것이라고 이야기할 수 있겠다. class Point { private: int xPos; int yPos; public: Point(int x = 0, int y = 0) : xPos(x), yPos(y) { } Point operator+(const Point& ref) { Point pos(xPos + ref.xPos, yPos + ref.yPos); return pos; } }; Point pos1(3, 4); Po..
- C++은 다중 상속을 지원하는 언어이지만, 다중 상속이 논란이 많은 문법이므로, 가급적 사용하지 말아야 한다고 말한다. - 하지만 라이브러리에 다중 상속을 적용한 예가 있기에 이를 이해하기 위해서 공부할 필요가 있다. 1. 다중 상속 - 다중 상속이란, 둘 이상의 클래스를 동시에 상속하는 것을 말한다. class BaseOne { public: void FuncOne() { cout
1. 객체 포인터 변수 - 클래스를 기반으로 포인터 변수를 선언할 수 있다. 이는 객체의 주소 값을 저장하는 포인터 변수로, 객체 포인터 변수라고 부른다. - 만약 Parent 클래스가 있고, 그것의 자식 클래스인 Child 클래스와 그의 자식 클래스인 GrandChild 클래스가 있다고 하자. Parent* ptr; ptr = new Parent(); // 이런 객체 포인터가 가능하다. ptr = new Child(); // 자식 클래스를 가리키는 것도 가능하다. ptr = new GrandChild(); // 이보다 더 자식 클래스를 가리키는 것도 가능하다! - Parent 객체의 포인터 변수로 선언했는데 대입되는 주소값은 그의 자식과 또 그것의 자식 클래스가 가능하다! - 객체 포인터 변수는 다음과..
1. 상속을 쓰는 이유 - 이는 열혈 C++ 프로그래밍 책의 예시를 요약해서 적어둔 것입니다. - A 회사에서 운영하는 급여 관리 시스템을 만들려고 한다. 정규직을 뜻하는 PermanentWorker는 이름과 급여 액수가 멤버 변수로 선언되어 있고 생성자, 멤버 변수에 대한 Get함수 그리고 멤버 변수의 정보를 출력하는 함수로 클래스가 정의되어 있다. - 이 클래스를 객체로 만들어 50개를 저장할 객체 배열을 멤버변수로 만들 것이다. 이 멤버 변수를 지니는 클래스는 EmployeeHandler 클래스이다. EmployeeHandler는 정규직을 뜻하는 객체 배열을 통해 직원을 관리하고 함수로 실 급여액을 계산하거나 정규직 객체를 배열에 동적 할당으로 추가시키는 일 등을 할 것이다. - 여기까지가 A 회사..
1. C++에서 초기화 스타일과 복사 생성자 - C에서는 다음과 같은 방식을 주로 선호한다. int num = 20; int& ref = num; - C++에서는 다음과 같은 방식도 허용한다. int num(20); int& ref(num); - 이와 같은 방식이 허용될 때, 기본 자료형 말고 사용자가 정의한 클래스에도 가능하지 않을까? 예를 들어서 객체 생성 시 이미 생성된 같은 클래스의 객체를 대입한다는 것이다. MyClass obj1(); MyClass obj2 = obj1; MyClass obj3(obj1);// 이런 유형이 가능하지 않을까? - MyClass obj1(obj2)를 생성자 호출 관점으로 다시 보자. MyClass형 객체를 생성 - 그 객체의 이름은 obj1 - obj2를 인자로 받..
이 글은 C++에서 제공하는 delete와 delete[]의 차이점을 조사하고 익히기 위해 작성하였다. 1. new와 delete - C에서 동적할당을 위해 malloc을 사용했었고 할당에 대한 해제 및 소멸을 위해 free를 썼었다. - C++에서는 새롭게 new와 delete를 제공한다. int* ptr = new int; // 동적 할당 delete ptr; // 해제 및 소멸 2. delete와 delete[] - delete는 단일 객체로 할당된 메모리를 해제하는 역할을 맡고 있다. 1.에서 적은 코드와 같이 배열이 아닌 단일 객체에 대해서 메모리를 해제한다. - delete[]는 배열로 할당된 메모리를 해제하는 역할을 맡고 있다. 배열로 할당된 각각의 요소의 메모리가 해제된다. 3. 의문점 제..
1. 범위 기반 반복문, 범위 기반 for문이란? - C++11에서 제공하는 것으로 상대적으로 조금 더 복잡하고 실수할 가능성이 있는 for문을 일부 대체할 목적으로 사용할 수 있다. - 시작과 끝점을 알려주지 않아도 알아서 처음부터 끝까지 순회 해주는 반복문이다. - C#의 foreach와 비슷하다고 한다. 2. 범위 기반 for문 기본 사용 방법 for(element_declaration : array) statement; - 루프를 돌 때마다 array의 요소를 반복해서 해당 현재 배열 요소를 element_declaration에 선언된 변수에 할당한다. - 이 때, element_declaration의 자료형은 array의 자료형과 같아야 한다. int arr[10] = { 1, 2, 3, 4, ..
1. const를 사용하는 포인터 변수 - 보통 const를 사용해 변수를 상수화하면 상수화된 변수의 값은 변경하지 못한다는 개념이다. - 하지만 포인터 변수의 const 사용법은 두 가지이다. 그 방법은 다음과 같다. 포인터 변수가 가리키는 값을 상수화 포인터 변수가 저장하고 있는 주소값을 상수화 2. 포인터의 const 사용에 대해 2-1. 포인터 변수가 가리키는 값을 상수화 - 포인터 변수에 저장된 주소값을 역참조해서 그 메모리 공간에 있는 값을 변경하지 못하게 하고, 오직 그 주소값의 변수를 직접 접근하여 변경이 가능하다. - 이것이 포인터가 가리키는 값이 상수화가 된 것이다. - 사용 방법은 포인터 변수의 자료형 앞에 const를 넣는다. int a = 10; const int* ptr = &a..