분류 전체보기
-
Effective C++...33일지 2022. 8. 4. 21:25
가상 함수 대신 쓸 것들도 생각해 두는 주세를 시시때때로 길러 두자 가상 함수를 대체할 수 있는 방법들 어떤 공통적인 연산을 수행하는 함수를 구현할 때 가상 함수 대신 다음과 같은 구현도 가능하다. 비가상 함수 인터페이스 관용구 비가상 함수로 가상 함수를 감싸서 가상 함수를 감추는 방법 함수 포인터 전략 패턴 함수 포인터를 이용해 외부 함수를 사용하는 방법 tr1::function 전략 패턴 STL 라이브러리를 이용해 일반적인 형태의 함수를 사용하는 방법 고전적인 전략 패턴 공통 연산을 수행하는 함수를 가진 클래스 계열을 생성해 사용하는 방법 비가상 함수 인터페이스 관용구 예제와 특징 비가상 함수를 호출할 수 있도록 하고 private 가상 함수를 만들어 상속된 클래스에 따라 구현을 달리할 수 있다. c..
-
Effective C++...32일지 2022. 8. 3. 08:37
인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자 함수의 종류 C++에는 다음과 같이 함수를 구분해 사용할 수 있다. 순수 가상 함수 함수를 선언만 하고 구현을 하지 않음으로 파생 클래스에 구현 의무를 넘겨주는 인터페이스 역할을 한다. 단순 가상 함수 함수의 기본적인 구현을 하여 파생 클래스에서 필요한 경우에만 함수의 구현을 수정할 수 있도록 한다. 비 가상 함수 파생 클래스에서 구현을 변경할 여지를 주지 않는 일반적인 구현 방식이다. 단순 가상 함수의 문제점 단순 가상 함수는 기본적인 구현이 존재하기 때문에 파생 클래스를 구현할 때 구현이 필요하다는 것을 잊을 수 있다. 따라서 순수 가상 함수를 함께 활용하여 구현 의무를 전달할 수 있다. class Airplane { public: // ..
-
Effective C++...31일지 2022. 8. 2. 08:40
상속된 이름을 숨기는 일은 피하자 C++의 유효 범위 탐색 과정과 문제 만약 프로그램 실행 중 특정 함수가 발견됐다면 해당 함수를 찾기 위해 컴파일러는 다음의 과정을 밟게 된다. 지역의 유효 범위 탐색 Derived 클래스의 유효 범위 탐색 Base 클래스의 유효 범위 탐색 네임 스페이가 있으면 네임 스페이스 내부 범위 탐색 전역 유효범위 탐색 이 과정에서 Base 클래스에 존재하는 함수와 동일한 이름의 함수를 Derived 클래스에서 생성했다면 함수의 매개 변수가 다르거나 비가상 함수라고 하더라도 Base 클래스의 함수의 이름이 가려지게 된다. class Base {private: int x;public: virtual void mf1() = 0; virtual void mf1(int); virtual..
-
Effective C++...30일지 2022. 7. 29. 08:39
public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자 public 상속의 is-a 관계 모든 사람은 학생이 아니지만 학생은 사람이다. 이 것의 관계가 public 상속이라고 할 수 있다. 이를 코드로 만들면 다음과 같다. class Person { ... void eat() { ... } }; class Student : public Person { ... void study() { ... } }; 사람의 일종인 학생은 사람이 할 수 있는 모든 것을 하지만 모든 사람이 공부하지는 않는다. 그런데 이러한 설계가 잘못되면 문제가 생길 수 있다. 모든 새는 난다고 가정해서 Bird 클래스에 fly 함수를 만들었다면 날지 못하는 새인 펭귄은 Bird를 상속받았을 때 fly ..
-
JUNGOL/Intermediate_Coder/그래프탐색-BFS/1462 : 보물섬코딩 테스트/JUNGOL 2022. 7. 28. 08:35
Intermediate_Coder/그래프탐색-BFS/보물섬 문제 보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서 이동은 상하좌우로 이웃한 육지로만 가능하며, 한 칸 이동하는데 한 시간이 걸린다. 보물은 서로 간에 최단 거리로 이동하는데 있어 가장 긴 시간이 걸리는 육지 두 곳에 나뉘어 묻혀있다. 육지를 나타내는 두 곳 사이를 최단 거리로 이동하려면 같은 곳을 두 번 이상 지나가거나, 멀리 돌아가서는 안된다. 예를 들어 위와 같이 지도가 주어졌다면 보물은 아래 표시된 두 곳에 묻혀 있게 되고, 이 둘 사이의 최단 거리로 이동하는 시간은 8시간이 된다. 보물 지도..
-
[Effective C++] 구현프로그래밍 기초/C++ 2022. 7. 27. 07:28
구현 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자 변수 사용 비용과 문제가 되는 부분 객체는 생성될 때와 범위를 벗어나 소멸될 때 각각 생성자와 소멸자를 호출하는 비용이 고정적으로 발생한다. 따라서 다음과 같은 경우에는 사용하지도 않을 객체의 생성, 소멸 비용을 지불하고 있게 된다. std::string encryptPassword(const std::string& password) { using namespace std; string encrypted; // encrypted를 사용하기도 전에 함수를 벗어날 가능성이 존재한다. if (password.length() < MinimumPasswordLength) { throw logic_error("Pssword is too short"); ..
-
Effective C++...29일지 2022. 7. 26. 21:09
파일 사이의 컴파일 의존성을 최대로 줄이자 컴파일 의존성이란 하나의 클래스가 수정되었을 때 그 클래스를 사용하는 클래스가 함께 컴파일되어야 하는 경우 컴파일 의존성이 있다고 한다. 다음 Person 클래스에서 사용된 변수의 클래스가 수정된다면 Person 뿐만 아니라 Person을 사용하는 모든 클래스도 함께 다시 컴파일되어야 한다. class Person { public: Person(const std::string& name, const Date& birthday, const Address& addr); std::string name() const; std::string birthDate() const; std::string address() const; ... private: std::string ..
-
Effective C++...28일지 2022. 7. 25. 16:46
인라인 함수는 미주알고주알 따져서 이해해 두자 인라인 함수의 장, 단점 인라인 함수는 함수 호출 문을 본문으로 바꿔치기하는 것이기 때문에 속도 면에서 이득을 볼 수 있다. 다만 긴 함수를 인라인으로 사용해 여기저기에서 복사된다면 목적 코드의 크기가 커지는 문제가 생긴다. 반대로 간단한 처리를 하는 함수 명을 길게 설명식으로 사용하고 인라인 함수로 바꾼다면 오히려 목적 코드의 크기가 작아질 수도 있다. ※ 인라인 문은 컴파일러에 요청하는 것이기에 컴파일러에 따라 인라인화 될 수도 안 될 수도 있다. 인라인 함수의 위치 인라인 함수와 템플릿은 기본적으로 헤더에 들어 있어야 한다. 템플릿 인스턴스화는 인라인과 별개이며 템플릿을 인라인화 하는 경우 inline을 붙이지만 그렇다고 구현하는 함수 템플릿에 필요도 ..