Languages/C++(15)
-
[C++ 17] 누적 합계 구하기 - std::accumulate()
🔗프로그래머스 | 평균값 구하기 문제를 풀려다가, STL 라이브러리들이 무엇이 있는지도 알아보기 위해 찾아보니, 누적 합계를 구해주는 함수, std::accumulate()가 있었습니다. C++ 17에서 추가된 함수로, 헤더파일을 #include 해줘야 사용 가능합니다. #include std::accumulate(시작 위치, 끝 위치 - 1, 초기값); 해당 함수를 통해 얻은 반환값은 초기값의 데이터 타입을 따라간다고 하네요. 오버플로우 방지를 위해 long 타입을 쓰고 싶으신 분들은 초기값에 0이 아닌 0L을 줘야하겠습니다. 평균값 구하기 문제 소스코드 #include #include #include using namespace std; double solution(vector numbers) { i..
2023.01.29 -
[C++] 기본 자료형과 템플릿의 생성자 초기화
C++에서 기본적으로 제공하는 자료형들(char, int, float 등등)은 명시적 기본 생성자를 통해 0 또는 False로 초기화를 할 수 있습니다. int x = int(); 이것은 템플릿 자료형에서도 사용이 가능합니다. template void Test() { T variable = T(); } 템플릿 클래스를 정의할 때, 멤버 변수 초기화 시 이 방법을 활용할 수 있습니다. template class Test { public: Test() : _data(T()) { } // 템플릿 멤버 변수 기본형으로 초기화 private: T _data; };
2023.01.25 -
[C++] 추상 클래스(abstract class)
추상 클래스의 필요성 class Monster { public: Monster() {} virtual ~Monster() {} virtual void Attack() }; 슬라임, 리본돼지 등의 몬스터 클래스를 만들 예정인데, 이들은 모두 공격(Attack)이라는 메소드를 가진다. 이들은 저마다 다른 공격을 구사한다. 따라서, 슬라임과 리본돼지의 부모 클래스로 Monster 클래스를 만들어서 Attack() 메소드를 만들어 주었다. 하지만 이 Monster 클래스는 공통된 멤버를 정의하기 위한 용도일 뿐이지, 실제 객체 생성은 요구되지 않는다. 가상 함수로도 공격 메소드의 다형성을 구현할 수 있지만, 프로그래머가 오버라이드 하는 걸 까먹을 수도 있다. 다음과 같은 내용들을 만족하는 방법이 있었으면 좋겠다..
2022.07.07 -
[C++] 클래스 상속 시, 소멸자를 가상 함수(Virtual)로 만들어야 하는 이유
정적 바인딩(Static binding)이 오버라이드 메소드에 미치는 영향 객체 지향 언어를 통해 프로그래밍을 하다 보면, 부모 클래스로 자식 클래스를 가리키는 업 캐스팅(Upcasting)을 사용할 때가 많습니다.Parent* obj = new Child(); 우리 입장에서는 부모 클래스 포인터로 자식 클래스 객체를 가리키고 있구나라고 알 수 있지만, 컴퓨터 입장에서는 부모 클래스의 포인터이므로 당연히 부모 클래스 객체를 가리키고 있다고 생각합니다. 따라서, 자식 클래스에 오버라이딩(Overriding)된 메소드가 있다면 여기에서 문제가 발생하게 됩니다.Parent* p = new Parent();Parent* c = new Child();p->Function(); // Parent 클래스의 Fun..
2022.07.07 -
[C++] 연산자 오버로딩 (Operator Overloading) (1)
/* 본 글은 글을 참고하여 공부한 글입니다. */ 연산자 오버로딩(Operator Overloading) 오버로딩 (Overloading) 객체지향언어에서 나오는 개념으로, 동일한 이름이지만 여러 개를 정의할 수 있는 것을 말한다. 대표적으로 함수 오버로딩이 있음 C++에서는 연산자 또한 오버로딩을 적용할 수 있다. 범위지정 연산자(::), 멤버 지정 연산자(.), 멤버 포인터 지정 연산자 (.*)는 오버로딩할 수 없다. 기본적으로 제공되는 자료형에 적용할 때는 사용할 수 없다. 비정적 클래스 멤버 함수 또는 전역 함수이어야 한다. 오버로딩 가능한 연산자들 산술 연산자 (+, -, *, ...) 비교 연산자 (==, !=, ...) 대입 연산자 (=) 복합산술 연산자 (+=, -=, ..) 논리 연산자..
2022.03.08 -
[C++] mutable 키워드
Java나 C#에서 string 클래스를 공부하다가 들었던 단어이다. (물론 string 클래스는 immutable이다.) 예전에 C++을 공부할 땐 보지 못했던 키워드라, 신기해서 살펴봤다. const 키워드를 통해 변수나 함수를 읽기 전용으로 만들 수 있었다. 당연히 const 멤버 함수 내부에서 값을 수정하는 것이 불가능하다. class Monster { int hp; public: void Heal(int value) const { // hp += value; const 멤버 함수 내부에서 값 수정 불가 } }; 하지만 수정하려는 변수에 mutable 키워드를 붙이면 const 멤버 함수 내에서도 수정이 가능해진다. class Monster { mutable int hp; // mutable 추가..
2022.03.08