프로그래밍

116

C++ new 연산자와 delete 연산자

new, delete연산자는 동적 할당과 해제에 연관되어 있으며 C++에서 제공하는 방법입니다. C언어에서는 malloc함수와 free함수를 통해서 동적 할당과 해제가 가능했었습니다. 동적 할당의 필요성 동적 할당은 미리 할당할 필요도 없으며, 원하는 크기를 정확히 할당이 가능하므로 쓸모없는 크기를 잡아먹지 않게 됩니다. 만약 계속 문자열을 입력받고 계산해야하는데 입력받은 문자열의 크기는 10~10000이라고 가정합시다. 동적 할당을 하지 않을 경우 정적 할당(지역변수)으로 최대 문자열의 크기인 10000을 잡고 미리 할당해야 합니다.(이런 경우 입력 문자열이 10이라면 필요 없는 메모리 공간이 9990이나 됩니다.) 하지만 동적할당은 입력받은 문자열의 크기를 구해서, 그 크기만큼 동적 할당하게 되면 필..

프로그래밍/C++ 2019.10.17 Plorence

C++ 복사 생성자(Copy Constructor)

복사 생성자는 어떤 객체를 새로 생성되는 객체에 복사하는 데 사용됩니다. 복사 생성자는 일반적인 대입에 사용되는 것이 아니라 값 전달에 의한 함수 매개변수 전달을 포함한 초기화 작업에 사용됩니다. 복사 생성자의 원형 ClassName(const ClassName &); 복사 생성자의 호출 시기 복사 생성자는 새로운 객체가 생성되어 같은 종류의 기존 객체로 초기화될 때마다 호출됩니다. 복사 생성자의 호출 시기는 아래의 코드와 같습니다. Person Carl(); Person Plorence(Carl); //복사 생성자 호출 Person Plorence =Carl; //복사 생성자 호출 Person Plorence = Person(Carl); //복사 생성자 호출 Person * Plorence = new ..

프로그래밍/C++ 2019.10.17 Plorence

C++ 자동변환과 클래스의 자료형 변환(변환 함수)

C++은 표준 자료형의 값이 다른 표준 자료형과 호환이 될 때 암시적 형 변환이 이루어집니다. 반면에 호환되지 않은 자료형은 변환하지 않습니다. 자동으로 자료형이 변환되지 않는 경우에 명시적 형변환을 이용하면 해결할 수 있습니다. int * ptr = (int*)10; 기본 자료형이나 다른 어떤 클래스와 충분히 관련되어 있어, 서로 간에 변환할 수 있는 클래스를 정의할 수 있습니다. 그러한 경우에, 자동 변환을 할 것인지 강제 변환을 할 것인지 사용자가 C++에게 지시할 수 있습니다. C++에서 하나의 매개변수를 취하는 생성자는 그 매개변수 데이터형의 값을 클래스형으로 변환하는 설계도처럼 동작합니다. Person(int p_age); 위 생성자는 int형 값을 Person형 값으로 변환하는 구문 역할을 ..

프로그래밍/C++ 2019.10.17 Plorence

C++ 프렌드(friend)

데이터 은닉을 통하여 멤버 함수를 통해서만 private 데이터 멤버에 접근이 가능했습니다. 하지만 이 제약이 엄격하여 특정 프로그래밍 문제를 해결하지 못하는 경우가 있습니다. 그래서 나온 게 프렌드라는 겁니다. 프렌드는 세 가지 형태로 사용됩니다. 프렌드 함수 프렌드 클래스 프렌드 멤버 함수 프렌드가 사용되어야 할 때 클래스 멤버 함수는 아니지만 해당 클래스의 데이터 멤버에 접근해야 할 때 필요합니다. 기본적으로 데이터 은닉에 의하여 외부에서 데이터 멤버는 접근할 수 없게 됩니다. 하지만 프렌드는 클래스 멤버 함수와 동일한 접근권한을 가지게 됩니다. (말 그대로 프렌드는 친구라는 뜻입니다.) 지나가는 사람보고 개인정보 좀 알려달라고 할 수 없으니, 친구를 맺어 개인정보를 알려달라고(접근) 할 수 있습니..

프로그래밍/C++ 2019.10.15 Plorence

C++ 연산자 오버로딩(operator overloading)

연산자 오버 로딩은 C++가 가진 다형 특성의 한 예입니다. C++에서는 *연산자로 예시를 들면 주소가 적용되면 해당 주소에 접근하고, 피연산자 2개 사이에 *연산자를 쓴다면 수행하는 것은 곱셈을 연산합니다. 이렇게 C++는 피연산자의 개수와 데이터형을 판단하여 어떤 연산을 수행할지 결정할 수 있습니다. operatorOp(argument) Op에는 연산자가 들어가고 그 앞 'operator'는 키워드입니다. 연산자 오버로딩은 멤버 함수가 아닌 함수에서도 가능합니다. 예시 - 멤버 함수 클래스의 데이터 은닉을 통하여 데이터 멤버에 접근하는 멤버 함수를 정의하지 않고, 연산자 오버 로딩을 통하여 오버 로딩된 연산자를 가지고 해당 데이터 멤버에 값을 더하는 클래스를 정의해봅시다. 이때 왼쪽 피연산자 객체의 ..

프로그래밍/C++ 2019.10.15 Plorence

C++ this 포인터

C++에서는 this라는 특별한 포인터가 제공됩니다. 오로지 클래스에서만 사용됩니다. 빠른 이해를 돕기 위해서 예제를 통하여 설명하겠습니다. 자신을 리턴해야 할때 #include class Person { private: int age; public: Person(int p_age) { //파괴자 age = p_age; } Person Clone(); }; Person Person::Clone() { return ? ? ; //뭐가 들어가야 할까? } int main(void) { Person per1 = Person(1); Person per2 = per1.Clone(); } Person클래스의 멤버 함수 Clone은 자기 자신을 반환하려는 멤버 함수입니다. 근데 여기서 자기 자신을 가리키려면 어떻게 ..

프로그래밍/C++ 2019.10.15 Plorence

C++ const 멤버 함수

const 멤버 함수는 객체가 const일 때 호출 가능하게 만들어주기 위해 있습니다. 에러가 나는 상황 #define _CRT_SECURE_NO_WARNINGS #include #include class Person { char * name; public: Person(const char * strName) { name = new char[strlen(strName) + 1]; strncpy(name, strName, strlen(strName)+1); } ~Person() { delete[] name; } void Print() { std::cout

프로그래밍/C++ 2019.10.15 Plorence

C++ 생성자(constructor)와 파괴자(destructor)

먼저 생성자와 파괴자는 클래스를 설계할 때 사용합니다. 생성자, 파괴자는 둘 다 표준 함수입니다. 일반적으로 모든 객체는 그것을 생성할때 초기화하는 것이 가장 바람직합니다. 생성자 생성자(멤버 함수)의 이름은 클래스의 이름과 동일합니다.(이건 규칙입니다.) 예를들어서 클래스의 이름이 Person이라면 생성자의 이름도 Person이어야 합니다. 생성자가 멤버 함수와의 큰 차이점이 있다면, 바로 반환형이 없습니다. class Person { int Age; Person(int age) { //Person 클래스의 생성자 Age = age; } }; 생성자도 디폴트 매개변수 사용이 가능하며 디폴트 매개변수를 사용할때 지켜야 할 규칙은 마찬가지로 지켜야 합니다. 표준함수인데 반드시 사용을 안 해도 되는 이유 어..

프로그래밍/C++ 2019.10.14 Plorence

C++ 접근 제어자(Access Modifier)

접근 제어자(Access Modifier) 접근 제어자 또는 접근 지정자라고 부르는 사람도 있습니다. 접근 제어자에는 총 3개의 키워드가 있습니다. private public protected protected는 상속과 관련되어 있으므로 상속을 공부할 때 배우면 됩니다. private 접근 제어자 먼저 private는 클래스 내부에서만 직접적인 접근이 가능합니다. 만약에 변수의 접근 제어자를 private로 설정해놨다면 그 변수는 클래스 내부에서만 접근 가능하고 객체에서는 직접적인 접근이 불가능합니다. #include class Person { private: int age = 10; char name[100]; public: int GetAge() { return age; //가능 } }; int ma..

프로그래밍/C++ 2019.10.14 Plorence

추상화(abstraction)

추상화(abstraction) 설명할 추상화에 대해서는 OOP언어 공통의 내용입니다. 추상화는 구체적인 것을 분해해서 관심 영역에 대한 특성만을 가지고 재조합하는것 입니다. 말그대로 필요한 정보들만 간추려서 구성하는 것입니다. OOP에서 추상화를 진행할 때 고려해야 할 사항 어떤 종류의 객체들을 정의할 것인가? 각 객체는 어떤 필드들과 메소드들을 갖는가? 자동차를 대상으로 추상화해보기 기름을 넣을수 있는 량 자동차 타입(소형,중형,대형 등) 시동을 건다. 움직인다. 브레이크를 건다. 시동을 끈다. 기름을 넣는다. 정도 추상화를 할 수 있습니다. 자동차는 날 수 없으므로 날다 라고 추상화가 불가능합니다. 아직까진 하늘을 나는 자동차는 없습니다. 그리고 추상화는 모든 객체에 공통적인 성질들만 담고 있어야 합..

프로그래밍/C++ 2019.10.14 Plorence

C++ 클래스

객체 지향 프로그래밍의 꽃, 클래스(Class) 객체 지향 프로그래밍(OOP,Object-Oriented Programming)에서 클래스는 OOP의 꽃같은 존재입니다.(C++ 말고도 OOP면 해당합니다.) OOP의 기능은 다음과 같습니다. 추상화(abstraction) 캡슐화(encapsulation)와 데이터 은닉(data hiding) 다형성(polymorphism) 상속(inheritance) 코드 재활용(reusability of code) 데이터형이란 무엇인가? 먼저 무엇이 데이터형을 구성하는지 잠시 생각해봅시다. 메모리에 저장되는 형태만으로 데이터형을 생각하기 쉽습니다. 예를들어 char는 1바이트, double은 8바이트 메모리를 나타냅니다. 그러나 좀 더 깊게 생각해보면, 데이터형이란 그..

프로그래밍/C++ 2019.10.14 Plorence

오토핫키 라이브러리 모음

LBEX: listbox 컨트롤을 쉽게 할 수 있는 라이브러리 Gdip: Gdip함수들을 쉽게 사용할 수 있게 만들어 놓은 라이브러리 HashCalc: 문자열을 여러 해쉬(MD5, SHA-512)로 변환할 수 있는 라이브러리 마지막 업데이트: 2019-10-11

프로그래밍/Autohotkey 2019.10.11 Plorence