[TIL] 2024-12-23
2024-12-23 TIL
C++
가상 함수와 순수 가상 함수에 대해 복습하면서 블로그에 글을 작성했습니다.
평소에 final
키워드는 잘 사용하지 않았는데 명시적으로 보기 좋은 코드를 만들기 위해 앞으로는 생각하고 잘 사용해볼까 합니다.
C++ 가상 함수와 순수 가상 함수
알고리즘 문제
조건문이나 삼항연산자를 사용하고, %
를 사용하면 쉽게 풀 수 있는 문제라 간단하게 해결했습니다.
프로그래머스 짝수와 홀수
저번에도 약수의 합을 구하는 문제를 풀었는데, 이번에도 약수를 통해 사용하는 풀이 방법이 있어 기억에 잘 남을 것 같습니다.
문제 자체는 브루트포스를 사용할 수 있어 어렵지 않았지만, 약수를 통한 방법은 생각 못해봐서 제한사항이 좀 더 빡빡했다면 어려웠을 것 같습니다.
프로그래머스 나머지가 1이 되는 수 찾기
스파르타 내일배움 부트캠프
특정 기능을 하는 프로그램을 만드는 과제가 주어졌습니다.
프로그램의 기능은 다음과 같습니다.
사용자로부터 5개의 숫자를 입력 받아 배열에 저장하고, 합계와 평균을 계산해 출력한다.
조건은 다음과 같습니다.
숫자를 입력 받는 공간은 배열을 활용한다.
합과 평균을 구하는 동작은 main함수를 제외한 함수를 각각 구현한다.
5개의 숫자를 입력받아 배열에 저장한 뒤, 합과 평균을 출력하는 기능이 정확히 동작하는지 확인한다.
std::vector
는 사용하지 않습니다.
별개로 함수를 구분하는 이유를 작성한다.
CustomVector.h
#pragma once
#include <iostream>
class CustomVector
{
private:
// 동적 배열의 시작 포인터
int* startPointer;
// 현재 요소 개수
size_t size_;
// 현재 할당된 용량의 크기
size_t capacity_;
void Reallocate(size_t newCapacity);
public:
// 생성자
CustomVector() : startPointer(nullptr), size_(0), capacity_(0) {}
CustomVector(int size)
{
int* newData = new int[size];
startPointer = newData;
size_ = size;
capacity_ = size;
}
// 소멸자
~CustomVector() { delete[] startPointer; }
// 현재 요소 개수 반환
size_t size() const { return size_; }
// 현재 할당된 용량의 크기 반환
size_t capacity() const { return capacity_; }
// 첫 번째 요소 반환
int* begin() const { return startPointer; }
// 마지막 요소 뒤를 반환
int* end() const { return startPointer + size_; }
void push_back(const int& value);
int& operator[](size_t index)
{
if (index >= size_)
{
throw std::out_of_range("인덱스가 범위를 벗어났습니다.");
}
return startPointer[index];
}
};
CustomVector.cpp
#include "CustomVector.h"
#include <algorithm>
void CustomVector::Reallocate(size_t newCapacity)
{
int* newData = new int[newCapacity];
std::copy(startPointer, startPointer + size_, newData);
delete[] startPointer;
startPointer = newData;
capacity_ = newCapacity;
}
void CustomVector::push_back(const int& value)
{
if (size_ == capacity_)
{
size_t newCapacity = (capacity_ == 0) ? 1 : capacity_ * 2;
Reallocate(newCapacity);
}
startPointer[size_++] = value;
}
main.cpp
#include <iostream>
#include "CustomVector.h"
// CH2 간단한 프로그래밍 구현 1번 필수 과제
// 입력을 받는 함수
void InputNumber(CustomVector& NumberArr)
{
int maxInput;
std::cout << "입력하려는 정수의 갯수를 입력해주세요" << std::endl;
std::cin >> maxInput;
for (int i = 0; i < maxInput; ++i)
{
int inputValue = 0;
std::cout << i << " 번째 정수의 값을 입력해주세요. : ";
std::cin >> inputValue;
NumberArr.push_back(inputValue);
}
std::cout << "정수의 입력을 마쳤습니다." << std::endl;
std::cout << "=================================" << std::endl;
}
// 정수의 총합을 구하는 함수
int accumulate(int* first, int* last)
{
int totalSum = 0;
for (; first != last; ++first)
{
totalSum += *first;
}
return totalSum;
}
// 평균을 구하는 함수
double calculateAverage(int totalSum, int count)
{
if (count == 0) return 0;
return totalSum / static_cast<double>(count);
}
int main()
{
CustomVector NumberArr{};
InputNumber(NumberArr);
int totalSum = accumulate(NumberArr.begin(), NumberArr.end());
double average = calculateAverage(totalSum, NumberArr.size());
std::cout << "숫자들의 총합입니다. : " << totalSum << std::endl;
std::cout << "숫자들의 평균입니다. : " << average << std::endl;
}
동적 배열을 편하게 사용하기 위함도 있지만 벡터를 만들어보는 도전을 해보고싶어서 벡터를 구현했습니다.
해당 벡터로 입력받은 값을 관리했습니다.
값을 더하는 함수는 std::accumulate
과 비슷한 방법으로 구현했습니다.
평균을 구하는 함수는 간단하게 값의 총합에 벡터의 사이즈로 나누는 기능을 하도록 구현했습니다.
함수를 구분하는 이유는 우선 기능단위로 분리하므로 가독성을 위함이 있다고 생각합니다.
또 이제 C++에 진입을 하는 단계이므로 만들려는 기능을 하나씩 차근차근 만드는데 조금 도움이 되기 때문에 사용한다고 생각합니다.
벡터를 직접 구현해볼때 size
변수명이 size()
함수명과 겹쳐 호출할 때 모호하다는 오류가 일어나는 문제가 있었습니다.
컴파일러의 오류에 직관적으로 뜨지 않아서 해결하는데 시간이 좀 걸렸었습니다.
결과적으로 해결하기 위해 변수명 끝에_
를 붙여서 해결했습니다.
구현코드는 아래 링크의 깃허브에서 직접 볼 수 있습니다.
Sparta_CH_2
댓글남기기