[[프로그래밍_NOTE]]/C , C++

언어론 중심의 C언어 용어 간략 정리

갑빠돌격기 2008. 7. 26. 22:51

=============================
언어론 중심의 C언어 용어 정리
=============================

*** 수 - 사물의 물리적인 성질과는 아무런 관련이 없는 특별한 기호의 세계(추상화)
            개념이 수로써 정식으로 인정받기 위해서는 사칙연산이 성립되어야 한다.
            (대상의 복잡성을 제거하여 단순화시키는 도구로 사용)

*** 단순화 - 주어진 문제에 대해 직접적인 영향을 미치지 않는 요소들을 제거하고
                  본질에 대해 더 이상 쪼갤 수 없을 정도의 작은 단위로 분할하여 원래의
                  문제를 재구성하는 단위전략(unit strategy)에 의해 일반화 시킬수 있다.  
                  (프로그램이 단순 - 문제발생률 저하, 신뢰성 향상)

*** 변수와 상수
       변수 - 기억장소에 대한 이름, (메모리 공간).                         -> 선언으로 형을 가짐.
       상수 - 변하지 않는 값을 나타내는 데이터.(재사용성이 없다.)   -> 묵시적으로 형을 가짐.

*** 연산 - 데이터를 처리하여 원하는 결과를 얻기 위한 과정
               임의의 상황에 능동적으로 대처할 수 있도록 범용성을 띤다.
              ( x+y= 값이 달라질수 있다 )
              연산자(연산방법) + 피연산자(데이터)         

*** 연산자
       산술 연산자( + , - , * , / , % ) - 5개
       증감 연산자( ++ , --)
       논리 연산자( ! , && , || ) - 우선순위 = NOT(!) > AND(&&) > OR(||)
       관계 연산자( > , < , >= , <= , == , != ) - 6개
       비트 연산자( ~ , & , | ,  ^ , << , >>) - 6개

*** bit, byte, word, code   -  디지털 컴퓨터의 기본요소
      
        bit   - 컴퓨터 연산의 기본단위. 불 대수 기반으로 한 0 과 1 로 모든 동작,
                 상태 및 결과등을 표현한다.
        byte - 데이터나 명령의 최소구성 단위 8bit = 1byte. 코드의 기본단위.
       word - 처리기에서 한 번에 처리하는 바이트의 묶음.
                   하나의 연산을 통해 저장장치로 부터 프로세서의 CPU 로 옮겨놓을 수 있는
                   데이터의 단위.
                   (컴퓨터는 처리효율을 높이기 위해 바이트 단위가 아닌 워드 단위로 데이터를
                    처리한다)
       code - 미리 정의된 규칙이나 의미를 구분하기 위해 단순화시켜 표현하는 방법으로
                 기호화시킨 표현방법 과 그 기호(규칙)의 의미

*** 폰 노이만형 컴퓨터 (메모리에서 레지스트리로 순차적 제어흐름)
       Storage  ->  Memory  ->  Register  ->  Execute Unit | Control Unit  ->  Device
             <-----------------  CPU  ------------------>

*** 형(Type)
       변수의 형 - 저장장소(메모리)의 크기 정의
         형체크 (컴파일러가 변수의 잘못된 사용을 검사)
         연산규칙(식이 나타낼 수 있는 값과 그것에 적용될 수 있는 연산을 구분하기 위해)

*** 치환효과(내부 저장된 값을 변경 -> 기계의 상태를 변경)
       상태 - 기억장소에 대한 순간적인 모습을 의미.
       위치 - 기억장소에 대한 접근 경로로 변수명에 의해 은폐.
       값    - 위치에 저장된 데이터

***구조적 제어흐름
       합성(composition) - 리스트를 통해 순차적으로 흘러간다. ({~})
               문장에 대한 리스트는 블록에 의해 구현되며 블록에 대한 유효영역이 형성된다.
       조건(conditional)  - 단일조건, 다중조건 (if, 다중if문)
       무한반복(loop forever) 
               프로그램을 강제로 종료시키지 않는 한 영원히 반복되는 것으로 프로그램
               (loop~ end)  작성시점에서 종료를 예측할 수 없을 경우 주로 사용,
               예외를 검사하는 조건제어 포함
       조건반복(conditional forever) - 조건검사는 반복이 이뤄지기 전이나
               반복이 1회 이뤄진 후 수행(while, for, do-while)

*** 목적파일  : 컴파일과 링킹의 결과물
       - 재배치 가능한 목적 파일(relocatable object file) -정적 라이브러리로 사용
             바이너리 코드와 데이터로 구성되며 컴파일 시간에 재배치 가능한
             다른 오브젝트 파일들과  결합되어 최종목적 파일이 된다.

       - 공유 목적파일(shared object file) -공유 라이브러리로 사용
             재배치 가능한 목적 파일의 특별한 유형으로 로드시간이나 실행 시간에
             동적으로 메모리에 로드되고 실행 가능한 목적 파일이나
             또 다른 공유 목적 파일에 바인딩 된다.

       - 실행 가능한 목적 파일(executable object file) -실행환경에 의해 실행
             바이너리 코드와 데이터로 구성되어 실행 환경에서 직접 메모리에 로드되며
             대상 기계에서 실행되는 실행 파일


*** 번역 환경(Translation environment) 과 실행환경(Execution environment)

//////////////
*** 번역 환경 : 비기계어로 작성된 소스 코드를 최종 기계에서 수행 가능한
                     기계어로 번역하는 과정에서 필요로 하는 환경

      -전처리기 - 매크로치환  - 반복 작업에 대한 매크로 정의를 제공,
            컴파일 전에 소스코드 상에서 사용된 매크로 이름을 정의된 내용으로 치환

      -조건부컴파일 - 조건에 따른 코드선택 기능을 부여하여 조건에 따라 컴파일 되는
             코드를 선택

      -파일첨부 - 헤더파일을 소스코드에 첨부하여 컴파일러에게 프로그램 상에서 사용된
             해당 함수의 형에 대한 컴파일 정보를 제공
             (*헤더파일 - 표준함수나 사용자가 정의한 함수의 원형(prototype) 정보를 제공)

      -컴파일러 - 프로그램으로부터 문장을 구성하는 토큰을 구분,구분된 각토큰의 의미를 파악
                변수나 상수에 대한 할당범위를 계산, 이를 토대로 기계어 코드를 생산한다.
              (*토큰 - 문장 기본구성요소, 상수, 변수 이름, 산술 연산자, 예약어 등)
         * 컴파일러의 구조 특성으로 번역 과정(2-6 그림)
            소스코드 -> 어휘분석(스캐너) -> 구문분석(파서) -> 중간코드 생성  //front
             ->  코드 최적화  ->  목적코드 생성                                          //back

       -링커 - 서로 독립적으로 작성되고 번역된 모듈간에 연관관계를 설정하는 링킹 작업
            컴파일러와 어셈블러에 의해 시작주소가 0으로 설정된 목적코드를 입력받아 .
            code영역과 .data영역에 대한 동일 영역별로 결합,
            심볼들에 대해 실행시간 메모리 주소를 할당한 후 심볼의 참조를 재배치
            목적파일  -> 실행파일

       -로더 - 실행가능한 목적 파일을 실행가능한 형태로 기억장소에 적재하는 것
            (번역 시간과 기억장소의 문제를 해결)

/////////////
***실행 환경 : 기계어로 번역된 프로그램을 실행하기 위해 제공되는 환경
                    (해당시스템, 운영체제)
                          실행환경에 대한 구체적인 처리과정은 운영체제에 종속적.
  
* 실행 시간(execution time),  컴파일 시간(compile time),  로드시간(load time)
       - 실행 시간     - 프로그램을 실행하는 시점.
       - 컴파일 시간  - 소스코드를 번역하는 시점.
       - 로드시간      - 실행을 위해 목적 프로그램을 준비하고 로드하는 시점. 

* 헤더파일 - 표준함수나 사용자가 정의한 함수의 원형(prototype) 정보를 제공,
        매크로함수, 매크로상수의 정의  함수선언, 전역변수 선언

* 실행
       - 전역변수와 같은 정적 공간 초기화
       - 환경변수와 전달 인자 초기화
       - 전달 인자와 함께 main 함수를 호출

* 레지스터(Register)
       - CPU 가 느린 메모리의 접근 시간을 줄이기 위해
          CPU 내부에 고속의 기억 소자로 구성된 메모리.
 
* 범용 레지스터(General-Purpose Register) - 임시저장소
          EAX, EBX, ECX, EDX
             - 하위호환을 위해 16비트영역과 8비트영역에 대한 별도의 이름을 가지고 있고
                산술연산과 같은 범용연산에 주로 사용
          ESI, EDI, EBP, ESP
             - 번지 지정을 위한 인덱스나 옵셋을 저장하는 용도

* 세그먼트 레지스터(Segment Register) - 세그먼트의 시작주소.
           CS, DS, SS, ES, FS, GS
                  - 전체 메모리를 효율적으로 관리하기위해
                  크기가 가변적인 일정단위의 구역으로 나눠진 세그먼트주소 저장
    (코드 레지스터 1개,  스택 레지스터 1개,  데이터 레지스터4개) 데이터 처리의 다양성 위해)

* 플래그 레지스터(Flags Register) - 상태플래그, 제어플래그, 시스템플래그
             EFLAGS - 연산결과에 따른 프로그램의 상태나 제어정보를 다룸

* 명령 포인터 레지스터(Instrucion Pointer Register)
            - CPU 가 실행해야할 다음 주소를 저장(EIP).

               EIP - 읽기전용으로 CPU가 실행해야 할 다음 주소를 저장
               EAX(Accumulator) - 산술연산 과 정수형 반환값을 호출함수에 넘김.
               EBX(Base) -  함수나 변수의 주소(특히 DS안의 데이터 주소) 를 저장하거나 
                                   이동명령의 피연산자로 사용.
               ECX(Count) - 카운터 역활을 수행하며 반복될 때마다 ECX 값이 자동 감소.
               EDX(Data)   - EAX 범위를 초과하는 64비트 산술연산의 상위 결과값을
                                   저장하거나  I/O 포인터로 사용.
               ESI(Source Index) - 스트링 명령을 수행할 때 출발지 주소를 지정하거나
                                   DS 안의 데이터 주소를 저장.
               EDI(Destination Index) - 스트링 명령을 수행할 때 목적지 주소를 지정하거나
                                   ES 안의 데이터 주소를 저장.
               EBP(Base Pointer) - SS 를 기반으로 스택내의 데이터에 접근하기 위한
                                   기준주소를 저장.
               ESP(Stack Pointer) - SS 를 기반으로 스택의 스택의 최상위 주소를
                                   유지하는 용도로 사용.
                                    push, pop, call, ret  명령에 의해 자동 증감.
              EIP(Instruction Pointer) - 다음에 실행할 명령의 주소를 저장. 사용자 조작은 불가.

              CS(Code Segment) - 명령어들이 위치한 시작 주소를 보관.
              DS(Data Segment) - 데이터을이 위치한 시작 주소를 보관.
              ES(Extra Segment), FS, GS - 변수들을 위한 추가 메모리 영역의 시작 주소를 보관.
                                   주로 스트링 명령에 사용
              SS(Stack Segment) - 스택 영역의 최상위 주소(top)를 보관. (지역변수)
       
EFLAGS(Flags)
              상태 플래그(Status Flag)그룹 - 특정명령결과, 산술명령에 대한 결과를 가리킴.
              AF(Auxiliary carry flag) - 10진수 덧셈, 뺄셈 연산에서 보정이 필요한때 enable.
              CF(Carry flag) - 양수 연산에서 연산 결과가 주어진 레지스터 길이를
                                     초과할때 enable.
              OF(Overflow flag) - 음수 연산에서 연산 결과가 주어진 레지스터 길이를
                                     초과할 때 enable.
              PF(Parity flag) - 연산 결과 1 이 짝수 개일때 enable.
              SF(Sign flag) - 연산 결과가 음수일때 enable.
              ZF(Zero flag) - 연산 결과가 0 이 아닐때 enable.  
             
 제어 플래그(Control Flag) - CPU동작제어, 문자열 처리명령의 제어.
              DF(Direction flag) - 문자열 관련 명령에 사용하며
              enable 은 역방향,   disable 은 순방향 접근.
              시스템 플래그(System Flag)


*** 스택(Stack)
     EBP (bottom), ESP (top) 에 의해 관리. LIFO( last in first out ) 방식.
     미리 예약된 임시 저장소 역할하는 메모리.
     데이터 저장하면(push) 주소감소(esp 감소)
     데이터 읽으면(pop)     주소증가(esp 증가)
     스택의 크기는 유한 하므로 top이 스택영역보다 큰가를 확인후 push.....   
      bottom 확인후 pop.

*** EXE 구조의 프로그램
       최소한 CS 와 SS 는 반드시 있어야 하며,
       CS, SS는 운영체제에 의해 초기화
       DS, ES, FS, GS 는 프로그램에 의해 초기화.

*** 주소(옵셋) 지정 방식(6개) - (offset-기준주소로 부터 시작하는 상대적 주소==인덱스)
 1 변위,    2 베이스(직접주소),    3 베이스 + 변위(간접주소),  4 (인덱스*스케일) + 변위,
 5 베이스 + 인덱스 + 변위,       6베이스 + (인덱스 *스케일) + 변위.

*** 리스팅 파일(PDB파일) - Program Debug dataBase
       소스 코드와 번역 과정의 다른 중요한 정보(기계어, 경고, 에러 등)가 포함된 보고서

*** 크로스 참조 파일 - 프로그램에 정의된 행 번호를 포함한 모든 이름 목록.

*** 맵파일 - 메모리에 로드되는 각 세그먼트와 순서 정보
     (프로그램 실행시 메모리에 로드되는 순서)를 가짐.
 
***이름(=식별자)
   프로그램에서 어떤 개체를 식별하기 위해 사용되는 문자들의 집합이다.
   변수, 함수, 형식매개변수, 구조체, 공용체, 열거체, 형 재정의, 레이블 등에서 사용.

*** 미리 정의된 이름의 종류
       C 표준 라이브러리에 등록된  -  매크로 함수 이름,  매크로 상수 이름
       경우에 따라 사용자에 의해 다시 정의 될 수있는 이름들.

***속성과 특징에 대해 설명..

***변수 - 기억장소의 기본 접근 단위, 메모리 블록에 대한 추상화
      변수명-할당된 공간의 첫번째주소
      변수형- 할당된 공간의 크기
     
      속성(6) - 바인딩시점
           이름 - 코딩시간, 심볼
           주소 - 컴파일시간, 실행시간
           값 - 코딩시간,실행시간
           형 - 코딩, 컴파일
           존속기간 - 실행시간
           영역 - 코딩, 컴파일

       특징(8)  
           - 별칭, 바인딩, 바인딩시간, 선언, 형검사, 강타입, 영역 규칙, 참조환경

*** 변수의 선언과 함수의 선언
       선언 - 형과 다른 (전역변수는 전부 정의,   extern 은 선언)
       정의 - 기억 장소(메모리 공간) 까지 할당.
       변수의 선언 - 데이터의 크기를 할당.  형체크
       함수의 선언 - 반환형 과 인자의 정보를 제공.

***바인딩 -  속성과 개체 혹은 기호와 연산을 연관시키는 것.
                  언어의 설계, 구현, 컴파일, 링크, 적재, 실행과정에서 바인딩 시간이 발생.

***변수 바인딩

      정적바인딩 - 바인딩이 실행시간 전에 발생하고
                         프로그램 실행과정에서 바인딩 상태를 유지하는것
      동적바인딩 - 바인딩이 실행시간 중에 발생하거나
                          프로그램 실행과정에서 바인딩 상태가 변경되는것
      형기반 바인딩
         동적 형바인딩 - 선언문에 명시되지 않고 값이 변수에 할당될 때
                                값에 따라 변수의 형이 바인딩되는 것 (인터프리터언어)
         정적 형바인딩 - 선언문에 형이 명시 됨으로써 프로그램에서 변수를 참조하기 전에
                                데이터 형이 바인딩되는 것 (C언어)
         (지역변수의 경우 변수를 최초로 사용하는시점에서 변수의 바인딩이 일어나고
          전역변수는 프로그램이 실행될 때 일어난다.)

*** 명시적 형 선언 바인딩을 위해 필요한것
       선언문 - 형의 명시는 변수의 선언과 함께 이루어 진다.

***존속기간(=바인딩타임) -  할당된 메모리 공간이 회수되기
                                        이전까지의 바인딩 되어있는 시간.

* 존속기간 중심의 변수 종류

   -정적 존속기간 - 전역변수, 과거민감변수, static예약어를 사용한 지역변수
       프로그램 실행 전에 할당이 이루어지고 프로그램이 종료될때 까지 바인딩을 유지하는것.
  
    -스택동적 존속기간 - 지역변수 ,(함수가 실행될때 동적으로 만들어져서 지역적으로 운영..)
         형은 정적으로 바인딩 되지만 기억장소는 선언문과 연관된 함수의 범위나 중첩문장의
         범위를 나타내는 블록에 진입할때 스택으로 부터 공간을 할당받아 바인딩되고,
         진입한 블록을 벗어날때 회수된다.

    -명시적 힙동적 존속기간 - 명시적 힙동적변수
        실행시간에 명시적 명령에 의해 힙 영역에 동적으로 할당되고 회수되는 이름없는 영역에
        대한 변수이다.
        이 변수 자체는 주소만 갖고 이름을 갖지 않으므로 이름을 갖는 별도의 참조 변수
        (포인터)에 바인딩되어 사용, 형자체는 컴파일 시간에 바인딩되지만 변수는 실행시간에
         바인딩된다. 연결리스트나 트리..
   
   -묵시적 힙동적 존속기간 - 값을 할당받는 경우에만 힙메모리 할당. C에서 지원되지 않음

***형 검사(3-41)
      - 피연산자와 연산자의 개념을 일반화시켜 함수와 할당문까지 포함
      - 피연산자들이 주어진 연산자에 대해 적법(연산규칙에 맞는지)하거나 컴파일러가
         적법한 형으로 자동변환 되는것을 언어규칙에서 허용하는지 확인하는 행위.
      - 형의 유효성 및 오류를 검사하기 위해 제공

*** 안전한 형 언어
      형의 오류가 항상 탐지 될수 있는것
      C언어는 인자리스트를 기반으로 하여 매개 변수의 형이 검사되지 않는
      함수의 허용 및 공용체의 형을 검사하지 않으므로 안전한 형 언어가 아니다.

*** 형 호환성(C언어)(3-49)
       이름형 호환성 - 서로 다른 변수가 동일한 선언문에 속하거나 동일한 형 이름을 사용하여
                              선언된 경우에 한해 호환 가능한 형으로 간주
       구조형호환성 - 서로 다른 변수의 형이 동일한 구조를 갖는다면 호환 가능한 형으로 간주
       선언동등성 - 이름호환성의 변형으로 한 형이 다른 형의 이름으로 정의 될때
                              호환 가능한 형으로 간주

        (C언어에서는 구조체외 공용체를 제외한 모든 형에 대해 구조 동등성을 사용하고
         구조체와 공용체에 대해서는 선언동등성을 사용한다.)

*** 영역
        변수가 임의의 문장에서 참조될 수있는 가시적인 범위
        C언어에서는 정적영역만을 지원, 현재 실행 중인 함수나 블록의 외부에서 선언된
        변수에 대한 참조가 변수의 선언및 속성과 어떻게 연관되는지를 결정한다.

*** 정적영역과 존속시간의 차이점 - 정적 영역이 공간적 개념인 것에반해
                                                  존속 기간은 시간적 개념이다.
                                                  즉, 장소와 시간

*** 참조환경 - 그 문장에서 가시적인 모든 이름들의 집합

*** C언어의 상수종류(6가지)
      - 정수 상수, 문자 상수, 문자열 상수, 열거 상수, 부동 소수 상수, 이름상수

*** 정수형의 종류
     -char(1byte), wchar_t(2byte), short(2), int(4), long(4), long long(8)
       정수상수 의 디폴트형 - int 형

*** 불형 - C언어는 불형을 기본형으로 제공하지않으므로 int형으로 구현
               논리연산이나 관계연산의 결과 역시 불 결과가 아니라 정수결과가 된다.

*** 문자열을 처리하는 방법(4-12)- 3가지(C언어는 1가지)
       정적길이문자열 - 선언할때 길이를 명시
       제한된 동적길이문자열 - 가변크기를 허용하되 최대길이를 변수의 정의에 제한
       동적길이문자열 - 제한없이 가변길이를 가짐
       C언어는 제한된 동적길이 문자열을 지원
      
      (집합 마지막에 종료문자의 의미로\0을 추가하지만
       이외의공간에도 저장은 가능..출력은 \0이전까지 된다.)

*** 열거형이란?(4-17)
        가능한 값의 범위가 열거 형태로 정의되는 형
        (정수의 값을 생략할 경우에는 최초이름에 0을 할당하고 나머지는 자동으로 1씩 증가)

*** 배열(4-21)
   동질적인 데이터원소들의 모임,  각 원소의 모임이 첫번째 원소의 상대적인 위치에 의해 식별
   배열의 특정원소는 배열의 이름과 인덱스 또는 첨자로 불리는 2-수준구문 메커니즘에 의해
   참조되는데
   배열이름과 인덱스의 모임에 대한 각 원소의 사상은 정적이므로 유한 사상이라고 한다.
   동일한 구조의 데이터를 대량으로 분석하는 프로그램에서 적합한 형이다.

   *명시적 인덱스 범위검사 - 배열의 전체 할당 크기에서
                                        첫번째 배열 원소의 크기를 나눈 결과를 이용
                                         for(i=0 ; i != sizeof(a) /sizeof (a[0]) ; i++)

*** 배열의 바인딩(4-25)
   정적배열 - 인덱스범위와 기억장소 할당이 정적으로 바인딩되는 배열로
                   동적기억장소의 할당및 회수가 필요없다. 재바인딩 불가

   고정스택동적배열 - 인덱스의 범위는 정적으로
                               기억장소의 할당은 동적으로 선언문의 실행 시점에서 이루어진다.
                               정적배열에 비해 기억장소의 공간효율성이 높다. 재바인딩 불가
   스택동적배열 - 인덱스의 범위와 기억장소의 할당이 동적으로 이뤄지는 배열로
                       인덱스의 범위와 바인딩 및 기억장소가 할당된 뒤에는 변수의 존속기간에
                       귀속된다. 재바인딩불가
   힙동적배열  - 인덱스의 범위와 기억장소의 할당이 동적으로 이뤄지고 배열의 존속기간 동안
                      인덱스 범위의 바인딩과 기억장소의 할당이 여러번 변경될수 있는 유연성이
                      높은 배열. 재바인딩 가능
                    ( C언어 -- 정적영역이나 static 예약어와 함께 지역적으로 선언되는 정적배열
                                   함수나 블록등에  지역적으로 선언되는 고정스택동적배열
                                   malloc, realloc, free표준함수에 의해 힙에 동적으로 할당 회수되는
                                  힙동적배열을 지원한다.)

*** 인덱스와 배열연산 (4-29)

C언어의 배열은 단지 하나의 인덱스만을 지정하는데 배열의 원소로 또 다른 배열을 가질수 있으므로 결과적으로 다차원 배열을 만들 수 있다.

배열에 포함된 항목의 갯수 -  배열에 속한 모든 요소의 형은 동일하므로 첫번째 배열 요소의 크기에 배열 형을 나눈 값이다
  #define LENGTH(a) (sizeof(a) / sizeof(a)[0])) 와 같은 매크로 함수를 정의해 두면
    코드에서 특정 배열의 항목 개수를 파악할 때 편리하다.
    배열의 주소연산 - 행 우선 순위

*** 배열과 함수 전달 인자 - 포인터

배열 자체를 함수의 전달 인자로 사용할 수 없지만 배열과 포인터는 표현 방식이 상호호환되므로 배열의 주소를 함수의 전달 인자로 넘겨주고 함수 내부에서는 포인터를 배열 표현식으로 바꿔 배열처럼 처리할 수있다.
전달되는 것은 배열이 아니라 포인터이므로 문자열 배열을 제외하고는 반드시 배열의 크기를 함께 전달 인자로 넘겨줘야 한다.

*** 배열의 초기화
 배열의 기억장소가 할당과 동시에 초기화, 초기화시 사용자가 배열의 크기를 명시하지 않으면
컴파일러가 계산하여 설정한다.
배열의 선언에서만 전체 값을 초기화 할 수 있다.
char *title[]={"init", "run", "stop", "q"};  
// title이라는 캐릭더형 포인터 공간이 4개 생김.. 문자열 길이가 자유롭다..

***구조체
 여러 속성으로 구성된 그룹화된 데이터를 처리, 이질적인 데이터들의 모임.
 구조체의 원소들- 멤버,  데이터베이스의 레코드 - 구조체
  typedef와 결합되어 새로운 사용자 정의형을 정의하는 용도로 사용되며
  시용자가 정의한 형에 대한 추가연산을 함수로 제공함으로써 프로그램의 데이터 추상화를
  극대화 시킬수있다.

***배열과 구조체
배  열 - 배열 원소들의 동질성, 인덱스를 기반. 순차적인 접근에 의한
            체계적인 방법이 존재할 경우 효과적.
구조체 - 멤버들의 이질성, 필드의 참조는 필드의 이름.
            임의 접근에 의해 처리되어야 할 레코드의 정의에 효과적.
            구조체를 이용하면 서로 다른 형이라도 하나의 자료구조로 표현할 수있으므로
             새로운 자료형의 정의 및 복잡한 자료구조의 구현에 많이 활용.


***멤버참조
완전자격참조 - 가장 외곽에 위치한 구조체부터 특정 멤버에 이르기까지
                      중간에 위치한 모든 구조체의 이름이 포함됨
생략참조 - 필드의 이름은 포함되지만 멤버를 포함하고 있는
                구조체 이름의 일부 또는 전부를 생략할 수 있다.
C언어의 멤버참조는 점(.)표기법을 사용하는 완전자격참조.
  구조체를 가르키는 포인터에서는 포인터참조 연산자(->)를 사용하거나
  포인터 역참조 연산자(*)에 의해 역참조로 변환하여 점표기법을 사용
   구조체의 멤버들은 메모리에 인접하여 저장되며 멤버의 크기가 반드시 같지 않을 수
   있으므로 구조체의 시작주소에 상대적인 옵셋 주소가 각 멤버에 연관되어
   모든 멤버의 접근은 옵셋을 이용하여 처리된다.
  (워드정렬- 메모리 접근의 신속성을 높이기 위해 각 멤버의 시작주소가 짝수가 되도록  설정.)

***구조체 배열(4-76)
  동일한 구조체형에 대한 모임으로 테이블을 구성하는 용도.
  정의된 구조체에 배열을 이용하여 선언.
  멤버의 접근은  테이블 행 - 배열의 인덱스를 기준으로 레코드를 이동
  테이블 열 - 구조체의 멤버 참조를 통해 필드에 접근
  [큰 구조체 배열이 필요할 경우 메모리 효율 측면에서 동적배열을 사용.]

***비트필드 구조체 - C에만 존재(4-83)
  - 구조체의 멤버를 비트 단위로 설정, 데이터 압축효과 및 시스템의 프로토콜이나
      하드웨어 신호와 일대일로 매핑되는 효과
  - 멤버선언시 콜론(;) 연산자와 함께 비트 수를 명시하며, 비트수는 반드시 멤버형 보다
      작거나 같은 값을 사용해야 한다.
  - 메모리 할당의 최소단위는 바이트
  - 비트필드 구조체의 크기는 지정한 비트 크기의 합이 아니라
      구성되는 비트 필드 멤버들의 형 및 컴파일러와 컴파일러에서 제공하는
      성능향상 기능에 따라 달라진다.
     ★ 비트필드멤버들의 형이 모두 동일한 경우  각 비트 필드 멤버에 지정한
        비트의 합을 기준으로 형단위의 크기가 할당
     ★ 멤버들의 형이 동일하지 않을 경우 - 가장 큰 멤버의 형을 기준으로 컴파일러에 따라
        비트의 합을 가장 큰 멤버의 형에 맞춰 각 멤버의 개수를 곱한 결과할당
        비트의 합을 가장 큰 멤버의 형의 크기로 나눈 몫에서 가장 큰 멤버의 형 크기를 곱한 값
        나머지가 발생 할 경우 추가로 나눈 형의 크기를 더한 크기 할당.

***공용체
 프로그램이 실행되는 동안 시점에 따라 다른 형의 값을 저장할 수 있는 형
 구조체와 동일한 형태로 정의되나 구조체의 멤버가 각각 고유의 저장 장소를 할당 받는것과
 달리 기억장소를 서로 공유한다.
 장점- 여러 자료형을 포함하는 하나의 자료형을 정의하는데 있다.

***식과 연산자(5-1)
 언어에서 계산을 표현하는 기본적인 수단
 식의평가는 결합법칙과 우선 순위 규칙에 의해 결정되는 표현식의 연산자평가순서
 형 불일치,강제 형변환,단락회로평가등을 고려해야 한다

***산술식
 연산자,피연산자,괄호,함수호출 단항연산자,이항연산자,삼항연산자(C언어)로 구성되며
 산술식의 목적은 산술 계산을 표현하는것으로 메모리부터 피연산자들을 인출하고 이러한
 피연 산자에대해 산술연상을 수행하는것이다
 C언어의 연산은 동시성을 갖지 않으므로 한시점에 단 하나의 연산만 수행한다

***우선순위
 우선순위규칙은 언어 설계자에 의해 수학을 기반으로 정의된 연산자 우선순위 계층구조에
 기초하고 있다.