728x90
반응형

프로그래밍 지식 63

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++) { // 웹사이트를 다운로드 하는데 걸리는 시간이라 ..

C++ 문법 / typedef, using, auto, decltype, constexpr,

C++에서 우리가 조금 더 편의성을 가질 수 있게 하는 키워드들을 모아왔다. 알아보자 1. typedef typedef를 많이 썼다면 그것은 거의 구조체 만들 때 썼을 것이다. typedef를 선언해서 별명을 만든 것을 기억하는가? 해당 구조체가 이름으로도, 별명으로도 선언이 되어서 우리가 조금 더 짧게 쓰거나 편하게 호출할 수 있었다. **typedef는 새로운 자료형을 정의하는 것이 아니라 있던 자료형의 별명이다. 그러나 typedef는 비단 구조체에만 쓰이는 것이 아니었다. 열거체에도 쓰일 수 있다. 뿐만 아니라 사용자 정의 타입에도 다 쓰인다. 다만 암묵적인 규칙이 있다. typedef로 변환한 별명들에는 _t라는 접미사가 붙는다. 그래서 우리가 document를 볼 떄 _t가 있다면 유심히 보는..

C++문법 / 멀티 스레딩, Multi-threading 연산

우리가 스레드를 만드는 이유는.. 효율적으로 사용하기 위해서다. 1부터 10000까지 더하는 작업은 얼마나 걸릴까??? 물론 우리는 n(n+1)/2라는 것을 알고 있지만 컴퓨터는 한 번 경험을 통해서 알게 해주고 싶다. 해보자 우선 스레드 하나로 돌려보자 #include #include #include using namespace std; using namespace chrono; void func1(int *result) { for (int i = 1; i

C++ 문법 / 기본 수학 연산 함수

기본 제공하는 함수라서 라이브러리가 필요없다. 실수 소수점 모두 버리기 올리기 floor : 소수점 모두 버리기 ceil: 소수점 모두 올리기 다시 말하면 천장과 바닥인데 5.67의 천장은 왠지 6일것 같고 바닥은 5일 것 같다? 는 맞다. 함수의 이름을 괜히 그렇게 짓는 것이 아니다. floor(5.67); ceil(5.67); 출력은 5 6 음수도 천장 바닥이 같아?????? floor랑 ceil의 의미를 파악해보자 ceil은 높다는 생각이 들고 floor는 낮다는 생각이 든다. 즉, ceil 하면 값이 커지고 floor하면 값이 작아진다. 다시 말해서 -2.3을 보면 -2.3을 ceil 하면 -2 -2.3을 floor 하면 -3이 되는 것이다. 다음은 실수에 대한 반올림 round: 반올림한다. 5..

728x90
반응형