All
189C++ 자동변환과 클래스의 자료형 변환(변환 함수)
C++은 표준 자료형의 값이 다른 표준 자료형과 호환이 될 때 암시적 형 변환이 이루어집니다. 반면에 호환되지 않은 자료형은 변환하지 않습니다. 자동으로 자료형이 변환되지 않는 경우에 명시적 형변환을 이용하면 해결할 수 있습니다. int * ptr = (int*)10; 기본 자료형이나 다른 어떤 클래스와 충분히 관련되어 있어, 서로 간에 변환할 수 있는 클래스를 정의할 수 있습니다. 그러한 경우에, 자동 변환을 할 것인지 강제 변환을 할 것인지 사용자가 C++에게 지시할 수 있습니다. C++에서 하나의 매개변수를 취하는 생성자는 그 매개변수 데이터형의 값을 클래스형으로 변환하는 설계도처럼 동작합니다. Person(int p_age); 위 생성자는 int형 값을 Person형 값으로 변환하는 구문 역할을 ..
프로그래밍/C++ 2019.10.17 PlorenceC++ 프렌드(friend)
데이터 은닉을 통하여 멤버 함수를 통해서만 private 데이터 멤버에 접근이 가능했습니다. 하지만 이 제약이 엄격하여 특정 프로그래밍 문제를 해결하지 못하는 경우가 있습니다. 그래서 나온 게 프렌드라는 겁니다. 프렌드는 세 가지 형태로 사용됩니다. 프렌드 함수 프렌드 클래스 프렌드 멤버 함수 프렌드가 사용되어야 할 때 클래스 멤버 함수는 아니지만 해당 클래스의 데이터 멤버에 접근해야 할 때 필요합니다. 기본적으로 데이터 은닉에 의하여 외부에서 데이터 멤버는 접근할 수 없게 됩니다. 하지만 프렌드는 클래스 멤버 함수와 동일한 접근권한을 가지게 됩니다. (말 그대로 프렌드는 친구라는 뜻입니다.) 지나가는 사람보고 개인정보 좀 알려달라고 할 수 없으니, 친구를 맺어 개인정보를 알려달라고(접근) 할 수 있습니..
프로그래밍/C++ 2019.10.15 PlorenceC++ 연산자 오버로딩(operator overloading)
연산자 오버 로딩은 C++가 가진 다형 특성의 한 예입니다. C++에서는 *연산자로 예시를 들면 주소가 적용되면 해당 주소에 접근하고, 피연산자 2개 사이에 *연산자를 쓴다면 수행하는 것은 곱셈을 연산합니다. 이렇게 C++는 피연산자의 개수와 데이터형을 판단하여 어떤 연산을 수행할지 결정할 수 있습니다. operatorOp(argument) Op에는 연산자가 들어가고 그 앞 'operator'는 키워드입니다. 연산자 오버로딩은 멤버 함수가 아닌 함수에서도 가능합니다. 예시 - 멤버 함수 클래스의 데이터 은닉을 통하여 데이터 멤버에 접근하는 멤버 함수를 정의하지 않고, 연산자 오버 로딩을 통하여 오버 로딩된 연산자를 가지고 해당 데이터 멤버에 값을 더하는 클래스를 정의해봅시다. 이때 왼쪽 피연산자 객체의 ..
프로그래밍/C++ 2019.10.15 PlorenceC++ 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 PlorenceC++ 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 PlorenceC++ 생성자(constructor)와 파괴자(destructor)
먼저 생성자와 파괴자는 클래스를 설계할 때 사용합니다. 생성자, 파괴자는 둘 다 표준 함수입니다. 일반적으로 모든 객체는 그것을 생성할때 초기화하는 것이 가장 바람직합니다. 생성자 생성자(멤버 함수)의 이름은 클래스의 이름과 동일합니다.(이건 규칙입니다.) 예를들어서 클래스의 이름이 Person이라면 생성자의 이름도 Person이어야 합니다. 생성자가 멤버 함수와의 큰 차이점이 있다면, 바로 반환형이 없습니다. class Person { int Age; Person(int age) { //Person 클래스의 생성자 Age = age; } }; 생성자도 디폴트 매개변수 사용이 가능하며 디폴트 매개변수를 사용할때 지켜야 할 규칙은 마찬가지로 지켜야 합니다. 표준함수인데 반드시 사용을 안 해도 되는 이유 어..
프로그래밍/C++ 2019.10.14 PlorenceC++ 접근 제어자(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 PlorenceC++ 클래스
객체 지향 프로그래밍의 꽃, 클래스(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 PlorenceC++ 이름공간(Namespace)과 using
C++ 표준은 이름 사용 범위를 더 잘 제어할 수 있도록 '이름공간'이라는 기능을 제공합니다. 최신의 이름공간을 배우기 전에, C++가 이미 가지고 있었던 이름 공간 기능을 간단하게 설명해보겠습니다. 구식 이름 공간 선언 영역(declarative region) 선언을 할 수 있는 영역입니다. 전역 변수의 선언 영역은 선언된 파일이고 지역변수의 선언 영역은 선언된 블록입니다. 잠재 사용 범위(potential scope) 선언한 지점부터 선언 영역의 끝까지를 잠재 사용 범위라고 말합니다. 잠재 사용 범위는 선언 영역에 비해 좁습니다. 말 그대로 잠재 사용 범위는 해당 변수의 사용이 가능한 범위를 말합니다. 사용 범위는 해당 변수에 접근(읽기/쓰기)을 한 범위입니다. 이것은 지역변수에 대해 공부를 하셨으면..
프로그래밍/C++ 2019.09.10 PlorenceC++ 템플릿 함수 반환형 추론(decltype, auto)
타입이 무엇인가? 프로그래머가 템플릿 함수를 쓰려고 할 때 한 가지 문제점은, C++98에서 선언을 할 때에 어떤 타입을 사용해야 하는지 알아내는 방법이 항상 가능한 것은 아니라는 점입니다. template void Add(T1 a, T2 b) { ? result a + b; } 이때 result의 타입은 뭐가 되어야 하는지 알 수 없습니다. T1, T2의 타입들은 모든 타입이 올 수 있으므로 덧셈 연산으로 인해 뭐를 반환할지 알 수 없는 셈입니다. 예시 상황 #include class Integer { private: int n; public: Integer(int n = 0) { this->n = n; } Integer operator+(int n) { Integer result(this->n + n..
프로그래밍/C++ 2019.08.26 Plorence