woon-2 / cpp-study Goto Github PK
View Code? Open in Web Editor NEWrepository for cpp studying
repository for cpp studying
code
에서 공통된 성격을 가진 data
와 operation
들이 반복된다면,
function
이나 class
로 abstract
하는 것이 좋습니다.
과제에서 요구하는 건 최소한의 요구치입니다.
좋은 code
를 위해 몇 가지 function
이나 class
를 더 추가하셔도 괜찮습니다.
또한, 약간의 성능을 희생해서
code duplication
을 제거하는 편이 좋을 수 있습니다.
파레토 법칙이 프로그래밍에 응용되어
런타임의 80%를 잡아먹는 코드는 전체 코드의 20%밖에 되지 않는다.
라는 관용 표현이 많이 쓰이는데요.
자잘한 성능에 신경쓰는 것보다 런타임 성능에 실제로 영향을 끼치는
20%의 code
를 찾아내는 것이 중요하다는 의미입니다.
Jongjin's-studyroom
의
b54f2ef - CS-1 CS-391 CS-396 레퍼런스 반환 과제
Commit
에 대한 Issue
입니다.
int sum(TestScore& ts)
{
return ts.math + ts.english + ts.physics + ts.chemicals;
}
TestScore& min(TestScore& lhs, TestScore& rhs)
{
if (sum(lhs) < sum(rhs))
return lhs;
else
return rhs;
}
TestScore& max(TestScore& lhs, TestScore& rhs)
{
if (&min(lhs, rhs) == &lhs) // 파레토 법칙을 참고해,
return rhs; // 몇 개의 연산을 늘리는 대신
else // 구현상의 코드 중복을 제거했습니다.
return lhs; // 추상화 수준이 가장 비슷한 함수를 이용하도록 합니다.
}
TestScore& median_of_three(TestScore& one, TestScore& two, TestScore& three)
{
int one_sum = sum(one);
int two_sum = sum(two);
int three_sum = sum(three);
// 이하 기존과 동일
// ...
// 여기도 파레토 법칙을 참고하면
// return min(max(one, two), max(two, three)); 의 한 줄로 끝낼 수도 있습니다.
}
제가 과제에서 function parameter
들을 n, m, k, l 따위로 표현하긴 했으나,
여러분이 실제로 작성한 parameter
의 이름은 설명적이어야 합니다.
일반적으로 variable
이 쓰이는 범위가 클수록
더 길고 정확하게 그 variable
의 역할을 설명하는 이름이 필요합니다. (Code Complete 2, Steve McConnell, 11.1)
function parameter
는 보통 function
전체에 걸쳐서 쓰입니다.
code
에서의 물리적 access
말고도
사용자가 해당 function
이 무슨 일을 하는지 유추할 때에
우리의 눈에 의해서 심리적으로도 access
되죠.
그것을 감안해 n, m, k, l 따위의 이름은 피하도록 합시다.
이 논지의 내용을 해당 과제에 추가토록 하겠습니다.
Jongjin's-studyroom
의
fde7960 - CS-1 CS-119 CS-222 replace 함수의 parameter를 수정
Commit
에 대한 Issue
,
Sanghoon's-studyroom
의
2898e9f - CS-1 CS-187
Commit
에 대한 Issue
입니다.
cpp-study/New Project/New Project/my_string.h
Lines 9 to 30 in 03370b0
parameter
이름을 더 설명적이도록 수정합니다.function declaration
에 parameter
의 이름을 적지 않았다면, 적도록 합니다.Steve McConnell, 『Code Complete 2』, 서우석 옮김, (위키북스, 2020)
Robert C. Martin, 『Clean Code』, 박재호, 이해영 옮김, (인사이트, 2013)
cpp-study/assignment-sprint1-write-cpp-classes/3.go for reference.md
Lines 344 to 345 in b2bf6f3
불가피한 순간이 -> 불가피한 순간에
cpp-study/solutions-sprint1-write-cpp-classes/my_string.inl
Lines 1078 to 1145 in 68be2e3
이하 생략
Jongjin's-studyroom
의
6c5f5bf - 더블 링크드 리스트 클론 코딩
Commit
에 대한 Issue
입니다.
LinkedList.h
...
150 T front()const
151 {
152 if (empty())
153 assert(false);
154
155 return m_pBegin->m_pNext->m_Data;
156 }
157
158 T back()const
159 {
160 if (empty())
161 assert(false);
162
163 return m_pEnd->m_pPrev->m_Data;
164 }
...
assert
는 인자가 false이면 프로그램을 중단합니다.
assert
는 단정하다라는 뜻으로, 인자인 statement
가 항상 참임을 단정합니다.비슷한 예로 expect
도 있습니다.
expect
는 인자인 statement
가 참일 것이 기대됨을 나타냅니다.assert
, expect
와 같은 함수들은 오류 검출 코드 작성 시 번거로운 if
문 생성을 피하도록 해줍니다.
다음과 같이 개선할 수 있겠죠.
LinkedList.h
T front()const
{
assert(!empty());
return m_pBegin->m_pNext->m_Data;
}
T back()const
{
assert(!empty());
return m_pEnd->m_pPrev->m_Data;
}
작은 변화지만 더 깔끔한 코드가 되었습니다.
conditional compilation
문이 source
전체를 감싸는 큰 틀이어야 합니다.
conditional compilation
문 안에 include
문이 감싸져 있지 않다면,
해당 source
가 include
될 때마다 모든 include
문들이 preprocessor
에 의해 중복 실행될 것입니다.
Jongjin's-studyroom
의
fe912a8 - 2.write preprocessor directives
Commit
에 대한 Issue
입니다.
#ifndef vec
#define vec
#include <cstddef>
#include <limits>
#endif
양상은 같으므로, 한 source
에 대해서만 수정 내용을 작성했습니다.
#pragma once
또한 필요하지 않습니다.
#pragma once
는 한 번만 compile
하라는 preprocessor directive
인데, 표준이 아닙니다.
conditional compilation
이 정확히 같은 역할을 하므로, 둘을 중복해서 사용하지 않는 것이 좋습니다.
Github Issue
의 전반적인 사용법을 알리기 위한 글입니다.
Issue
는 프로젝트 내의 코드에 대해 특정한 문제 사항을 보고/확인
을 위한 용도입니다.
버그나 코드 중복, 오탈자, 문서화 오류 등을 보고합니다.
Issue
가 있는지는 ★라벨★을 참고하세요.Open
상태인 Issue
는 아직 해결되지 않은 Issue
라는 뜻이고Closed
상태인 Issue
는 해결된 이슈라는 뜻입니다.New issue
를 통해 Issue
를 생성하면 생성된 Issue
는 바로 Open
상태가 됩니다.Open
상태의 Issue
를 발견하면, 바로바로 확인할 수 있도록 합니다.방금 전의 창에서 개별 Issue
를 클릭하면 나오는 Issue
창입니다.
본문에 적힌 Issue
내용을 보고, 댓글을 통해 소통합니다.
Issue
는 Assignee(담당자)
를 설정할 수 있습니다.
Assignee
들은 자신이 Assignee
로 설정된 Issue
들을 빠르게 해결할 책임을 갖습니다.Assignee
를 설정합시다.Issue
가 해결되었다면, Close
합니다.
Close
버튼을 눌러도 되고,Commit
에 Close
명령어를 추가해도 됩니다.불필요한 동작이 코드 상에 존재합니다.
fstream
만으로 데이터를 입력 받을 수 있음에도, stringstream
과 array
를 거쳐서 입력받고 있습니다.fstream
은 RAII
class
이므로 close
메서드를 호출하지 않아도 destructor
에서 기존에 획득한 파일 자원을 해제합니다.Jongjin's-studyroom
의
79d9bfb2ae4c678008af32d3d4e4a7b7e3c6252a
- Update main.cpp
Commit
에 대한 Issue
입니다.
cpp-study/dataStructure/Project1/Project1/main.cpp
Lines 205 to 222 in 79d9bfb
Solution 1
template<>
void readData(CLinkedList<Champion>& _Linkedlist)
{
ifstream fin("data.txt");
while (fin.good())
{
Champion c;
fin >> c.name >> c.hp >> c.mp >> c.attack >> c.defense; // fstream으로부터 데이터 입력
_Linkedlist.push_back(move(c)); // std::move 활용
}
// fin.close() - fstream은 RAII 클래스, 소멸자를 믿자.
}
Solution 2
template<>
void readData(CLinkedList<Champion>& _Linkedlist)
{
ifstream fin("data.txt");
while (fin.good())
{
_Linkedlist.push_back({}); // default object 추가 후 수정, emplace_back 메서드가 없으므로 push_back을 사용함.
auto& [name, hp, mp, attack, defense] = _Linkedlist.back(); // C++17, structured binding
fin >> name >> hp >> mp >> attack >> defense;
}
// fin.close() - fstream은 RAII 클래스, 소멸자를 믿자.
}
fstream
과 stringstream
등 ios
로부터 상속된 여러 종류의 stream
들은 buffer
를 갖습니다.
string
이 basic_string<char>
의 typedef
이듯이,
ios
는 basic_ios<char>
의 typedef
입니다.
ios
의 buffer
는 char
을 저장하는 배열이죠.
istream
은 operator>>
가 overload
되어 있습니다.
istream
의 operator>>
는 buffer
의 데이터를 delimiter(구분자)
를 기준으로 끊어서 추출합니다.
기본적으로 delimiter
는, 공백/띄어쓰기
입니다.
buffer
는 문자열이고, istream
에서 buffer
의 내용을 한 단어씩 추출할 수 있다는 것을 아셨을 겁니다.
fstream
은 istream
을 상속해 operator>>
가 있으므로, 데이터 입력을 위해 추가적인 동작이 필요 없습니다.
한 개의 istream
만으로 모든 입력을 할 수 있습니다.
데이터의 입력은 수정입니다.
입력 받을 메모리를 먼저 확보해야 하므로 데이터의 입력을 constructor
call
로 구현할 수 없다는 문제가 발생합니다.
따라서 어느 정도 불필요한 복사 동작이 발생하는 건 불가피하죠.
다음의 방법을 통해 그나마 최적화할 수 있습니다.
std::move
를 통해 입력 받은 객체의 소유권 이전하기
함수 인자인 객체에 std::move
를 씌워주면 인자의 data type
이 r-value reference
가 되어
이동 생성을 하는 버전의 push_back
이 호출됩니다. (컨테이너에서 구현을 했다면 말이죠.)
built-in
data type
들은 복사와 이동의 비용 차이가 없습니다.
다만, Champion
이 std::string
을 멤버로 갖고 있다면, std::string
의 move constructor
가 호출되어
연산이 더 가벼워질 겁니다.
(Champion
의 move constructor
를 직접 작성하지 않아도 됩니다.
move constructor
는 compiler
가 자동으로 만들어주는 special member function
중 하나로,
멤버 변수들의 move constructor
를 call
합니다.)
deep copy
가 아니라 shallow copy
를 하기 때문입니다.emplace_back
, emplace
등의 메서드를 통해 default object
를 컨테이너에 추가한 후 수정하기
데이터 입력 후 객체의 용량이 커지는 경우가 있습니다.
std::string
의 경우가 그렇죠.
용량이 커진 객체를 컨테이너로 복사하는 것보다
컨테이너에 먼저 객체를 추가한 후 그 객체를 수정하는 게 훨씬 효율적입니다.
push_back
은 객체를 인자로 받아 컨테이너 내에서 복사 생성 또는 이동 생성하는 동작입니다.
push_back
call
전에 constructor
call
이 일어나고,
컨테이너에서 copy constructor
call
또는 move constructor
call
이 일어납니다.
emplace_back
은 객체 생성에 필요한 데이터를 인자로 받아 컨테이너 내에서 생성하는 동작입니다.
컨테이너 내에서 constructor
call
한 번만이 일어납니다.
ea6adf4 - refactoring CS-1 CS-114 CS-382 CS-134
Commit
으로
9.allocate&deallocate memory dynamically
과제의 void* operator new(std::size_t)
를 구현하는 내용이 바뀌었습니다.
(#45 의 2022.12.05. 스크럼 참조)
이에 따른 최신화가 필요합니다.
Jongjin's-studyroom
의
fbd9a08 - CS-1 CS-122 CS-386 TODO - malloc/free와 new/delete의 차이 작성
Commit
에 대한 Issue
입니다.
Jongjin's-studyroom
의
6c5f5bf - 더블 링크드 리스트 클론 코딩
Commit
에 대한 Issue
입니다.
LinkedList.h
5 template <typename T>
6 class CListNode
7 {
8 template <typename T>
9 friend class CLinkedList;
...
T
라는 typename
이 중복되어 Compile
이 불가합니다.
Visual Studio
에선 보통 두 개 이상의 typename
을 사용할 때 Tx
, Ty
와 같이 구분합니다.
[Stack Overflow] Class template with template class friend, what's really going on here?
위 링크에 같은 문제 상황에 대한 토론이 있습니다.
my_unique_ptr
의 release
함수의 설명이 바뀌었습니다.
다른 구현이 필요해지므로, 멤버 함수 선언 과제를 위한 코드를 작성하셨다면 참고하여 수정해주시기 바랍니다.
assignments
의
f0d707d - fixed description of my_unique_ptr<T>::release()
Commit
에 대한 Issue
입니다.
두 분 다 확인하셨다고 댓글 달아주시면 Issue
를 닫겠습니다.
cpp-study/dataStructure/Project1/Project1/main.cpp
Lines 40 to 41 in 62f17d0
cpp-study/dataStructure/Project1/Project1/main.cpp
Lines 140 to 146 in 62f17d0
CLinkedList
에는 원소를 뒤에 추가할수있는 push_back
함수가 있습니다.
파일에서 데이터를 모두 읽어 push_back
하는 기능을 가진 함수를 만들려고 합니다.
함수의 매개변수를 CLinkedList<_T>& _Linkedlist
으로 정의하였으나
main
에서와는 달리 push_back
함수를 호출할 수 없었습니다.
어떻게 해야할까요.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.