[C++ Programming] Chapters 4 : Computation
🏫Chapters 4 : Computation
📖You already know most of this
=
는 같다는 의미보단 assignment의 의미. 대입연산- if
- iterate (for, while)
- ⭐functions
- most important thing in structure programming
- user defined funtion in right time
📖Computation
- Compute : 수학 이론적인 기반에서 시작하여 그것을 현실화 한 것
- state machine : 이론적인 기반 중 하나. A라는 상태를 B로 바꾸고 싶은 것에서 부터 시작한다. 예를 들어 1,3,2]에서 1,2,3이라는 state로 바꿔 주는 것이다.
초기 입력 state : Input
우리가 원하는 결과 state : Output
Input에 어떠한 방법을 써서 변화하여 Output으로 바꾸는 일련의 과정 : Computation - Computation의 필수적인 요소
- 정확성 Correctly : 원하는 결과가 정확하게 나와야함
- ⭐효과적 Efficiently : 두 개의 리소스(시간과 공간)를 최소로 쓰고 결과를 내야함 (비용 최소화, 생산성 향상)
- 시간 > 공간(memory) 시간은 돈으로도 살 수 없는 불가성이 있어 상대적으로 더 중요하다
- 간단함 Simply : 위의 정확성과 효과성을 달성하기 위해 중요한 것은 Simple한 접근
- Divide and Conquer
- 하나의 문제를 낱개로 쪼개어 각각의 문제로 풀으라는 것
- 분리된 문제들을 하나하나 풀어나감으로써 큰 문제를 풀 수 있는 방법론
- 이 방법을 코드로 구현하는 것이 function()이다
- Another tool is Abstration
- 예를 들어, 운전을 할 때 가장 대표적으로 차를 조종하는 것은 핸들, 페달, 기어인데, 만약 차에 본네트가 열려있고 김이 나고 여기저기 열려있다면 어떤 것을 손대야할지 혼란을 초래한다
- 이와 같이 필요한 것만 보여주고 필요없는 것은 보여주지 않는 것이 프로그래밍의 중요한 과제이다
- Organization of data is often the key to good code
- 코드를 얼마나 체계적으로, 구조적으로 구현할 수 있어야 좋은 프로그래밍이 된다
📖Language features
- if문이 없다면 프로그램은 하나의 결과밖에 나오지 않는다. 항상 실행의 순서과 결과가 동일하고 표현이 제한된다. 따라서 if문을 사용하면 표현의 능력이 확장되고 다양한 결과값을 도출할 수 있다.
- while문은 표현의 확장의 기능보다는 라인 수를 덜어주는 역할이 크다. 같은 수행을 여러번 반복할 때 간단하게 명시할 수 있다
- Function을 사용함으로써 코드의 재사용으로 인해 라인 수를 덜어주고, 무엇보다도 divide and conquer함으로써 생각의 능력을 향상시킨다
📖Expressions
- 표현식 : 연산자와 피연산자로 구성된다
- 일반적으로 이항연산자를 많이 사용한다 (ex.
+
,-
) - Unary Operator(단항 연산자)
- 일반적으로 이항연산자를 많이 사용한다 (ex.
- Boolean type
==
,!=
&&
,||
,!
>
,<
- char
- Integers : short, int, long
📖Statements
- 완벽하게
;
까지 찍히는 하나의 문장
📖Selection
-
if/else
if(a<b) max = b; else max = a;
📖Iteration
- while loop
- false 될 때까지 계속해서 도는 반복문
- C의 경우 함수의 지역변수는 미리 선언이 되어 있어야함. C++의 경우 함수 안에서 선언해도 됨
// C의 경우 for문 전에 i를 미리 선언해주어야 한다
int main(void){
int i;
for(i=0; i < 100 <i++){
printf("%d", i);
}
printf("%d", i);
}
// 그러나 C++의 경우 i의 선언을 for문 안에서 해도 된다
int main(void){
for(int i=0; i < 100;i++){
cout << i;
}
cout << i; // 이 때, 위의 i는 for문을 빠져나가면(i의 scope) 소멸되기 때문에, 이러한 경우 에러가 난다
}
- 초기화는 한번 실행되고, 가장 많이 실행되는 것은 조건문, 그것보다 한번 덜 실행되는 것은 증감문이다
📖Functions
- Declaration :
ReturnType FuncName(parameter);
형태로 컴파일러에게 알려준다.- 함수가 동일한 경우 여러번 선언해도 문제되지 않는다.(C기준)
int main(void){ myfunc(); // 여기서 에러가 뜬다. 컴파일러는 위에서 아래로 읽기 때문에 myfunc이 아래 정의되어 있더라도 오류가 난다 } void myfunc(){ cout << "hello"; }
void myfunc(); // 함수 선언. 컴파일러에게 신고가 되었으므로 아래에서 에러가 나지 않는다. int main(void){ myfunc(); } void myfunc(){ cout << "hello"; }
void myfunc(){ cout << "hello"; } int main(void){ myfunc(); } void myfunc(){ // 동일한 이름으로 정의하면 에러가 난다. 정의는 메모리를 할당하기 때문에 동일한 이름이 있으면 모호성으로 인해 문제가 된다 cout << "hello"; }
void myfunc(); void myfunc(); // 선언은 중복이 되어도 문제가 되지 않는다. 선언은 규칙을 알려줄 뿐 메모리를 할당하지는 않기 때문에 에러를 띄우지 않는다 int main(void){ myfunc(); } void myfunc(){ cout << "hello"; }
- C++ 기준
void myfunc(){ cout<<"hello"; } void myfunc(int a){ // C의 경우에는 에러를 띄우지만, C++에서는 선언이 다름으로 에러를 띄우지 않는다. cout << "hello"; // 변수와 달리 함수는 이름외에도 인자를 같이 부르기 때문이다. 따라서 파라미터를 구분할 수 있다면 중복으로 보지 않는다.(다형성) } int main(void){ myfunc(); }
함수의 이름이 같더라도 파라미터로 구분이 가능하다면 중복으로 인정하지 않는다. 다형성
void myfunc(); void myfunc(int a); // 컴파일러는 불만이 없지만 링커는 불만이 있다. // 현재에서는 링크에러도 되지 않는 이유가 optimized되기 때문이다. 즉, 선언만 되어 있지만 한번도 사용되지 않으므로 넘기는 것이다. int main(void){ myfunc(); } void myfunc(){ cout << "hello"; }
- 이름과 인자가 같고 리턴타입이 다른 경우는 모호성으로 에러가 난다. 함수를 읽고 구분할 때 리턴타입은 고려하지 않는다.
void myfunc(int i){ cout << "int" << i; } void myfunc(float i){ cout << "float" << i; } int main(){ myfunc(1.0); // ambiguous에러가 뜬다. 1.0을 더블로 인식하고 컴파일러는 형 변환을 시도하지만 더블은 int, float로 모두 변환할 수 있기 때문. // 따라서 1.0f를 넣는다면 에러가 뜨지 않는다. }
📖Control Flow
- Function의 특징
- 코드의 재사용성
- control flow : 항상 다시 돌아옴.
- ⭐divide conquer의 가장 중요한 도구⭐
📝Vector
- Array : 주소의 연속성(연속된 메모리 공간이 보장). 원하는 위치에 한번에 도달할 수 있다. 따라서, 동시에 연속성 보장을 위해 메모리 할당에 대한 부담이 크다.
-
LinkedList : 노드 하나씩 메모리를 할당한다. 대신 연속성이 보장되지 않으므로 다음 값의 주소를 가지고 있어야한다. 원하는 값에 대해 한번에 접근할 수 없다. 필요한 만큼만 메모리를 쓰기 때문에 메모리 공간에 대한 flexibility가 좋음.
위의 두 가지 자료구조의 장점을 합친 자료구조가 VECTOR
- Vector : 가변크기의 배열
- doubling : 공간을 두 배씩 늘린다.
- 배열을 옮길 때, 오버헤드의 문제가 있다. 예를 들어, 512개의 자리에 모두 앉아있다가 1개가 더오면 513개가 1024개의 배열로 모두 옮겨가야한다. 그러나 이 오버헤드에 드는 비용은 일반 배열을 쓸 때와 차이가 없다.