프로그래밍/C++

57

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

C++ 이름공간(Namespace)과 using

C++ 표준은 이름 사용 범위를 더 잘 제어할 수 있도록 '이름공간'이라는 기능을 제공합니다. 최신의 이름공간을 배우기 전에, C++가 이미 가지고 있었던 이름 공간 기능을 간단하게 설명해보겠습니다. 구식 이름 공간 선언 영역(declarative region) 선언을 할 수 있는 영역입니다. 전역 변수의 선언 영역은 선언된 파일이고 지역변수의 선언 영역은 선언된 블록입니다. 잠재 사용 범위(potential scope) 선언한 지점부터 선언 영역의 끝까지를 잠재 사용 범위라고 말합니다. 잠재 사용 범위는 선언 영역에 비해 좁습니다. 말 그대로 잠재 사용 범위는 해당 변수의 사용이 가능한 범위를 말합니다. 사용 범위는 해당 변수에 접근(읽기/쓰기)을 한 범위입니다. 이것은 지역변수에 대해 공부를 하셨으면..

프로그래밍/C++ 2019.09.10 Plorence

C++ 템플릿 함수 반환형 추론(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

C++ decltype 키워드(C++11)

decltype키워드 다음 내용은 C++11부터 적용된 내용이고 C++11부터 decltype이라는 키워드가 생겼습니다. decltype키워드는 주어진 이름이나 표현식의 구체적인 타입을 알려주는 키워드입니다. 사용 방법 int a = 0; decltype(a) b = a; //a와 동일한 타입의 변수 만들기 delctype(a+b) c = a+b; //a+b와 동일한 타입의 변수 만들기 컴파일러는 어떤 타입을 사용할 것인가 컴파일러는 어떤 타입을 사용할 것인지 결정하기 위해서 체크리스트를 거쳐야 합니다. decltype(expression) var; 1 만약 expression이 괄호가 없는 식별자일 경우라면 var는 식별자와 동일한 타입이 되며, const를 포함합니다. double x = 0; dou..

프로그래밍/C++ 2019.08.26 Plorence

C++ 함수 템플릿의 특수화와 구체화

특수화(specialization) 암시적 구체화, 명시적 구체화, 명시적 특수화를 모두 특수화라고 합니다. 이들의 공통점은 이들이 일반화 서술을 나타내는 함수 정의가 아니라, 모두 구체적인 데이터형을 사용하느 함수 정의를 나타낸다는 것이기 때문입니다. 함수 템플릿에서의 명시적 특수화(Explicit Specialization) 명시적 특수화(explicit specialization)라는 특수화된 함수 정의를, 필요한 코드와 함께 제공될 수 있습니다. 컴파일러가 함수 호출에 정확히 대응하는 특수화된 정의를 발견하게 되면 템플릿을 찾지 않고 그 정의를 사용합니다. 명시적 특수화를 사용하는 이유는 특정 형식(데이터형)에 대한 범위를 줄여 특별한 동작을 하기 위해서입니다. 만약 매개변수가 int형일경우 다른..

프로그래밍/C++ 2019.08.22 Plorence