4 minute read

🏫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의 필수적인 요소
    1. 정확성 Correctly : 원하는 결과가 정확하게 나와야함
    2. ⭐효과적 Efficiently : 두 개의 리소스(시간과 공간)를 최소로 쓰고 결과를 내야함 (비용 최소화, 생산성 향상)
      • 시간 > 공간(memory) 시간은 돈으로도 살 수 없는 불가성이 있어 상대적으로 더 중요하다
    3. 간단함 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(단항 연산자)
  • 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의 특징
    1. 코드의 재사용성
    2. control flow : 항상 다시 돌아옴.
    3. ⭐divide conquer의 가장 중요한 도구⭐


📝Vector

  • Array : 주소의 연속성(연속된 메모리 공간이 보장). 원하는 위치에 한번에 도달할 수 있다. 따라서, 동시에 연속성 보장을 위해 메모리 할당에 대한 부담이 크다.
  • LinkedList : 노드 하나씩 메모리를 할당한다. 대신 연속성이 보장되지 않으므로 다음 값의 주소를 가지고 있어야한다. 원하는 값에 대해 한번에 접근할 수 없다. 필요한 만큼만 메모리를 쓰기 때문에 메모리 공간에 대한 flexibility가 좋음.

    위의 두 가지 자료구조의 장점을 합친 자료구조가 VECTOR

  • Vector : 가변크기의 배열
    • doubling : 공간을 두 배씩 늘린다.
    • 배열을 옮길 때, 오버헤드의 문제가 있다. 예를 들어, 512개의 자리에 모두 앉아있다가 1개가 더오면 513개가 1024개의 배열로 모두 옮겨가야한다. 그러나 이 오버헤드에 드는 비용은 일반 배열을 쓸 때와 차이가 없다.