목록프로그래밍/C++ (23)
강께르의 개발일지
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..
1. 객체 지향 프로그래밍(Object-Oriented Programming, OOP)이란? - 객체 지향 프로그래밍에 대해 여러 설명이 있다. 문제를 바라볼 때, 여러 개의 객체 단위로 나눠 작업하는 방식을 말하기도 한다. - 프로그램을 여러 개의 객체 모임으로 간주하여 개발하는 것이다. - 상태와 행동으로 이루어진 다수의 객체를 만들어, 서로 상호작용을 통해 프로그램을 만들어지는 방식이다. - 여러 객체 지향 프로그래밍의 정의를 보아하니 공통점은 프로그래밍을 할 때, 여러 개의 객체를 생성하여 그 객체들을 이용해서 프로그램을 만들어가는 개발 방식 정도로 해석된다. 2. OOP의 장/단점 - 객체로 구분하여 프로그래밍하기에 코드의 재사용을 높일 수 있다. - 잘 만들어진 클래스는 프로그램을 확장하기에 ..
이 글에서 서술한 열거형은 C 스타일로 enum, C++ 스타일로 enum class로 나눌 수 있다. 열거형이 무엇이며, enum과 enum class의 다른 점이 무엇인지 조사하며 정리해보려고 한다. 1. 열거형이란? - 열거형의 '열거'의 의미는 '여러 가지 예나 사실을 낱낱이 죽 늘어놓음'이라고 한다. 이와 같이 열거형 또한 정수형 집합을 고유한 이름을 붙여서 죽 늘어놓은 것을 의미한다. - 특정 정수값에 별명을 붙여 프로그래머가 봤을 때, 해당 정수가 사용된 의미에 대해 직관적으로 이해할 수 있게 돕는 도구와 같은 것이다. 2. enum - 열거형을 사용하기 위해서는 enum이나 enum class를 사용해야 한다. enum의 생김새는 다음과 같다 enum TagName { Body }; - 열..
1. void 포인터란? - void 포인터는 const, volatile를 사용하여 선언되지 않은 객체를 포함한 모든 자료형 변수를 가리킬 수 있는 있다. - 가리키고 있는 변수의 자료형의 크기, 길이를 알아올 수 없을 뿐이다. 시작 주소를 제공 받아 쓸 수 있는 것이다. - 함수를 가리키는 주소값을 저장하여 함수형 포인터로 사용할 수 있다. - 다른 이름으로 제네릭 포인터(generic pointer)라고 불린다. 2. 사용 시 유의사항 - void 포인터는 자신이 가리키는 변수가 어떤 자료형인지 알지 못하기 때문에 직접 역참조를 할 수 없다. - 그러므로 void 포인터의 역참조를 수행하기 위해서 가리키고 있는 변수의 자료형으로 형 변환을 해야만 한다. - void 포인터의 포인터 연산도 역참조와 ..
이 글에서 설명할 Call by value / address / reference는 '함수가 호출될 때, 매개변수를 어떤 방식으로 전달할 것이냐?'에 대한 방법들이다. 앞에서부터 차례대로 한글로 번역하자면 '값에 의한 호출', '주소에 의한 호출', 참조에 의한 호출'이라고 할 수 있다. 1. Call by value(값에 의한 호출) - Call by value는 함수를 호출하여 매개변수를 호출된 함수에게 전달할 때, 값의 복사로 전달을 하겠다는 방식이다. - 값이 복사되어 전달되어 그 값으로 초기화된 매개변수는 전달되기 이전의 변수와는 완전히 별개의 변수다. - 그래서 함수 내에서 아무리 매개변수를 조작해도 전달되기 이전의 그 변수하고 다르기 때문에 어떠한 변경이 없다. int num = 10; fu..