728x90
반응형

프로그래밍 지식/C++ 29

클래스 생성, 복사, 대입, 소멸 C/C++

C++의 핵심인 클래스에서 가장 중요한 생성, 복사, 대입, 소멸에 대해서 알아보자. 클래스를 정의할 때는 명시적이든 암시적으로 하든 클래스 타입 객체를 복사하거나 대입 또는 소멸할 때 만들어줘야할 것이 많다. 즉, 클래스가 정상적으로 작동하기 위해서는 5가지 멤버함수가 필요하다. 1. 복사 생성자 (디폴트 있음) 2. 복사 대입 연산자 (디폴트 있음) (일반적으로 1번과 2번은 거의 비슷함) -> 둘다 정의 안하면 컴파일러가 만들어줌 3. 이동 생성자(다루지 않을 예정) 4. 이동 대입 연산자(다루지 않을 예정) 5. 소멸자 (디폴트 있음) 생성자, 소멸자까지만 듣고 포기한 사람이 많겠지만 쉽게 알아보도록 하자. **디폴트가 있는 생성(복사, 대입), 소멸은 무조건 중요하다는 말이 되겠다. 1. 복사 ..

포인터, 참조자(Pointer, Reference) C / C++

물론 참조변수에서 이미 알아봤지만 포인터와 함께 알아보겠다. 포인터와 참조자는 비슷한 맥락에서 쓰이지만 조금 다르다. -> 포인터와 참조자의 다른점을 정확히 설명할 수 있다면 정말 아는 것. 여기서 짧게 설명하자면 참조자는 한 번 참조되어 정의되면 다른 객체를 참조할 수 없어서 항상 그 참조자와 처음 결합한 객체만 참조한다. 포인터에 대입하면 참조자가 아닌 다른 변수처럼 포인터 자체에 새로운 값이 대입된다. 즉, 다른 객체를 가리킬 수 있다. [C || C++ 문법/함수] - C++문법/ 참조 변수, reference + 참조의 특성 알아보자 우선 먼저 포인터에 대해서 한마디 설명해보자. 포인터는 어떠한 변수를 가리키는 변수다. ?? 엥 변수를 가리키는 변수?? 우선 변수는 말했듯이 변할 수 있는 데이터..

Variable, 변수란, C/C++

기초부터 탄탄히 하기 위해서 다시 복습하도록 한다. 한 마디로 말할 수 없으면 공부한 것이 아니라는 말을 듣고 다시 한 마디로 정의해보자 변수란? 데이터를 저장할 수 있는 메모리의 공간 이라고 생각한다. 해당 변수는 주소 값을 가지고 있고 주소 값으로 접근이 가능하다. 정의했으니 이제 더 자세히 알아보자. 메모리는 접근 시에 주소로 접근이 가능한데 컴퓨터의 운영체제나 구조에 따라 달라지지만 우리는 32bit의 주소 또는 64bit의 주소를 가지고 있다. (32 bit라고 하자.) 우리는 이 주소에 접근하여 데이터를 메모리에 저장한다. 하지만 우리가 주소를 직접 써서 데이터를 관리했다면 정말 비효율의 끝판왕이었을 것이다. 우리는 조금 더 효율적인 방법인 변수를 써서 데이터를 관리하기로 했다. (물론 내부적..

C++문법/ (클래스) 템플릿, Template - 2

앞에서 함수 템플릿을 배웠듯이 클래스 템플릿도 뭔가 찍어내는 것 같은 느낌이다. 맞다. 하지만 조금 느낌은 다른데 클래스 템플릿은 구조나 알고리즘은 같되 멤버의 타입이 다른 클래스를 찍어내는 틀이다. 예를 보면서 알아보자 아래 클래스들은 화면의 특정 위치에 값 하나를 출력하는 클래스다. 우선 int, char 순서대로 class PosValueInt { private: int x,y; int value; public: PosValue(int ax, int ay, int av): x(ax), y(ay), value(av) {} void outvalue(); }; class PosValueChar { private: int x,y; char value; public: PosValue(int ax, int a..

C++문법/ (함수) 템플릿, Template - 1

템플릿이란 무엇이냐? 하나의 클래스를 서로 다른 (사용자가 원하는) 타입에 재사용할 수 있도록 하는 것이다. 타입만 넣어주면 자동으로 코드를 찍어내는 틀이라고 보면 된다. 예를 들어서 여러 타입의 객체를 저장할 수 있는 연결리스트와 같은 자료구조를 만들 수 있다. **template 와 template 는 정확히 같은 의미를 같지만 typename키워드를 많이 쓴다. //template class를 만들었다. template class ShiftedList { T* array; // 특정 타입의 배열 int offset, size; public: ShiftedList(int sz) : offset(0), size(sz) { array = new T[size]; // 타입 T의 배열 } ~ShiftedLi..

C++문법 / 상속, Inheritance - 2

앞 글에서 보았듯이 부모의 속성, 함수를 물려받는 것이 정말 유용하게 쓸 수 있다는 것을 알았다. 그리고 이왕 상속시킬 부모클래스를 만들것이라면 재사용성이 높은 클래스를 설계하고 만들어야겠다는 생각이 들면 좋다. 그러나 상속과 비슷한 것이 있었으니 바로 포함, Containment이다. 포함이란 객체를 멤버로 선언하여 해당 클래스의 기능을 재활용하는 방법이다. 클래스의 멤버는 타입에 제한이 없어서 기본형뿐만 아니라 객체도 포함이 가능하다. 클래스끼리 중첩되는 형식인데 구조체가 다른 구조체를 멤버로 가질 수 있는 것과 같다. 예를 통해서 알아보자 class Date { protected: int year, month, day; public: Date(int y, int m, int d){year=y, mo..

C++문법 / 상속, Inheritance - 1

상속은 OOP하면 가장 먼저 생각나는 특성으로 이미 정의한 클래스를 물려받아 새로운 클래스를 정의하는 기법이다. 이는 재사용성을 높이고 반복을 제거해서 효율성을 높여주며 계층별 다형성을 구현할 수 있게 한다. 참 장점이 많은 아이다. 천천히 알아보자 밑도 끝도 없이 예시부터 보자 class Car { private: char name[12]; public: Car(const *aname){ strcpy(name, aname); } void init(){ cout 이렇게 하지 말라는 말이다. 만약 비워둔다고 해도 상관없다. 비어있으면 부모클래스의 디폴트 생성자가 자동으로 호출되기 때문이다. **다만 디폴트 생성자를 정의해야 한다. 아무튼 상속받은 멤버는 반드시 초기화 리스트에서 부모의 생성자로 전달해서 초..

C++문법/ Static member 정적 멤버[this, 정적 멤버 변수, 정적 멤버 함수]

22.02.02 내용 업데이트 1. this C++ 에서 객체의 고유한 상태를 저장하는 멤버 변수는 객체별로 따로 유지하고 객체의 동작을 정의하는 멤버 함수는 공유한다. -> Static의 특징 객체의 개수와 관계없이 유일하게 존재함. 속성은 객체마다 다르지만 동작은 공통적이어서 각 객체가 따로 가질 필요 없다. -> this는 다시 말해서 해당 멤버 함수를 불러낸 객체라고 할 수 있다. 호출의 주체, 함수를 실행시키는 객체 자체 더 설명해보자 // this #include class Simple { private: int value; public: Simple(int avalue) : value(avalue) {} // 생성자 void OutValue(){ printf("value= %d\n", val..

C++문법/ 프렌드, Friend 키워드

객체의 신뢰성과 객체지향의 원리에 따라 Encapsulation, Inheritance는 지켜져야 한다. 그러나 너무 엄격하게 상속이나 캡슐화로 비효율적인 경우도 있다. 이럴 때는 진짜 조그마한 예외를 두어 융통성을 늘릴 수 있게 했다. friend 키워드를 쓰면 특정 대상에 대해 모든 멤버를 공개할 수 있다. -> friend를 선언한 대상에게 내 모든 것을 공개한다는 말이다. 프렌드로 지정되면 액세스 지정자에 상관없이 모든 멤버를 읽을 수 있다. 프렌드는 전역 함수, 클래스, 멤버 함수의 세 가지 수준에서 지정한다. 차례대로 살펴보자 1. 외부 전역 함수 외부의 전역 함수를 프렌드로 지정할 때는 클래스 선언문 안에 원형을 밝히되 friend지정자를 붙인다. 예를 들어서 sub함수를 Some 클래스의 ..

C++문법 / 생산자 소비자 문제, Producer and Consumer Problem

Mutex로 deadlock을 걸리지 않게 하는 법을 배웠으니 왜 deadlock인 상황이 발생하고 왜 mutex를 걸어줘야하고 왜 thread를 이용해서 작업을 하는지 몸소 느껴보자 먼저 코드를 볼까? #include #include #include #include #include #include #include using namespace std; using namespace chrono; // 생산자 함수 //string을 담는 큐, 뮤텍스 객체, index(스레드 번호)를 매개변수로받음 void producer(queue* downloaded_pages, mutex* m, int index) { for (int i = 0; i < 5; i++) { // 웹사이트를 다운로드 하는데 걸리는 시간이라 ..

728x90
반응형