3. 추상 데이터 타입

a. 정의
i. 데이터 타입을 추상적*(수학적)으로 정의한 것
1) 추상 = 어떤 물체나 현상의 중요한 특징만을 추출하여 표현하는 것
2) 가장 중요한 추상의 타입
i) 부분으로 나누기(Has-A abstraction) → 요소(component)로 나누어 별개로 생각
  ex) A car has-a engine, has-a transmission. A window has-a menu bar.
ii) 전문성으로 나누기(Is-A abstraction) → 일반화(generalization)된 객체로 본다
  ex) A car is-a means of transportation. A bicycle is-a wheeled vehicle.
3) Model
i) 예상되는 공식 또는 해법을 만드는 데 사용되는 추상 또는 개념적 객체(오브젝트)
ii) 문제에 대한 추상적인 관점을 정의 & 문제와 관련된 것과 정의하려는 속성(property)에만 집중
iii) ADT는 Model의 일종. 모델에 대한 부분적인 해법(partial solution). 
ii. 데이터 연산이 무엇(what)인지는 정의O, 하지만 어떻게(how) 컴퓨터 상에 구현할 것인지는 정의X
  → 구현의 독립: 단지 수행 기능만 함축적으로 나타내므로 표현이나 구현에 대한 자세한 설명 불필요(인터페이스)
1) 연산에 필요한 추상: 무엇(what)이 수행되는지 알지만 어떻게(how) 수행되는지 몰라도 좋다는 것
iii. 제공자: 사용자에게 데이터 객체 이름과 연산자 이름 제공
   사용자: 이를 이용하여 실제로 필요한 데이터 객체와 연산자 구현
iv. <객체의 명세 & 객체에 대한 연산의 명세>가 <객체의 표현 & 연산의 구현>으로부터 분리된 데이터 타입
    ex) Ada의 package, C++의 class 등
v. 프로그램의 제어보다는 자료에 관심을 두고 자료구조 및 그와 관련된 연산들로 구성된 모듈을 작성
  → 정수나 실수형 같은 하나의 자료형으로 취급
vi. 데이터의 표현이나 연산의 구현은 제외하고 데이터와 연산의 본질에 대한 명세만 정의
b. 속성
i. 추상으로 잘 정의된 개체(entity) 생성
ii. 개체들은 항목들(items)의 자료 구조(data structure)를 정의
   ex) 관리자 이름생일주민등록번호 등을 가진다.
iii. 자료 구조는 정의된 연산(defined operations)에 의해서 접근 가능. 즉, 해당 타입의 자료 구조에 접근하는 유일한 방법.
   → 이 연산들의 집합(a set of operations)을 인터페이스라 하고 개체에 의해 밖으로 전달(export)된다.
iv. 위와 같은 속들을 가진 개체를 ADT라 한다.
     
1) 예제: List
i) List 타입의 객체(instance)에 대한 인터페이스는 인터페이스 정의 파일에 의해 정의된다.
ii) 정의된 연산: insert, get, append, delete, search ... etc
iii) 어플리케이션 영역(domain)은 제공되는 연산들의 어의적 의미(semantic meaning)에 의해 정의된다. 
iv) 공리(axioms)와 전제조건(preconditions)들은 다음과 같은 진술을 포함한다
a) 빈 list는 list이다
b) l = (d1, d2, d3, ... dn)을 list라 하자. 
   그렇다면 l.append(dm)의 결과 l = (d1, d2, d3, ... dn, dm)이 된다.
c) list트의 첫번째 요소(element)는 오직 리스트가 비어있지 않을 때만 삭제될 수 있다. 
c. 캡슐화(encapsulation)
i. 데이터와 연산을 결합. 변수들과 함수들을 에워싼다.
ii. ADT의 사용자들로부터 자료와 연산의 세부사항을 지킨다
iii. 복소수(complex number)에 대한 ADT인 Complex를 만들었다면, 잘 알려진 자료형인 정수(integers)처럼 사용 가능
iv. 모듈 방법을 가능하게 한다
v. 자료에 대한 접근 통제
vi. 인터페이스로부터 구현을 분리
vii. 기본형(build-in types)을 확장
d. ADT의 특징
i. 프로그램의 추상화 → 알고리즘 → 구체화 → 프로그램
  데이터 타입의 추상화 → 추상 데이터 타입 → 구체화 → 데이터 타입
ii. 객체(instance)의 생성을 가능하게 한다. OOP에서 ADT는 class에 해당.
iii. C언어는 ADT를 명시적으로 구현하는 기법 없지만, ADT의 개념을 갖도록 설계 가능
iv. ADT로 작성된 모듈은 일반 자료형과 같은 방법으로 사용
v. 저급 언어보다 객체지향언어에서 구현하기 더 쉽다
vi. 프로그램 속에 표현될 복잡한 관계를 가진 대량의 데이터 → 추상화 및 단순화 → 문제 해결 방법을 찾기
e. ADT의 조건
i. 자료형과 연산에 대한 정의가 한 곳에서 가능
ii. 자료형과 연산이 하나로 묶인 자료형에 대한 프로그램의 접근 제한할 수 있어야 함
f. ADT의 구현 방법
i. 자료와 그에 관련된 연산들의 기본적인 특성 기술
ii. 이미 존재하는 자료형 이용하여 기술된 내용 구현
iii. 기술 내용과 구현 결과가 일치함을 보여야 함
g. 자료의 추상
i. 문자열, 숫자, 이진트리 등과 같이 연산의 대상이 되는 자료를 추상화
ii. 종류
1) 기본적 추상: 컴퓨터 안에 저장된 자료 값을 추상화
   ex) 변수: 자료 값이 저장된 메모리에는 이름을 부여하여 추상화
2) 구조적 추상: 연관된 자료 값의 집합을 추상화
   ex) 배열, 레코드 등
3) 단위 추상: 단위 프로그램 전체에 대한 추상화
   ex) C++의 class, Ada의 package, Java의 class
h. 공식
i. 객체 지향(Object-Orientation) = 
객체(Abstraction)
+ 클래스(ADT & 클래스화(Classification))
+ 상속(재사용
+ 동적 바인딩(Dynamic Binding. 즉, 다형성(Polymorphism), 유연성(Flexibility)) 
ii. 객체 지향의 발전: 
모듈 → 정보 은닉(Information hiding) → 자료 캡슐화 → ADT → 클래스와 객체
i. ADT의 구성 요소
i. 구조 이름
ii. 객체(data, 자료)의 정리
iii. 함수(연산)의 정리
1) 데이터 쿠조는 크게 세 부분으로 나눌 수 있다
   표현하려는 데이터 구조  =  ( 데이터 구조의 정의영역 집합,   함수의 집합,  공리의 집합 )
  Structure         =  (              Domain,              Function,      Axiom    )
2) S와 D의 관계: S ∈ D 
iv. NaturalNumber 추상 데이터 타입 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ADT NaturalNumber
objects : 0에서 시작해서 컴퓨터상의 최대 정수 값(INT_MAX)까지 
          순서화된 정수의 부분 범위이다.
functions : 
    Nat_Number의 모든 원소 x, y와 Boolean의 원소 TURE, FALSE에 대하여,
    +, -, <, ==는 일반적인 정수 연산자이다.
 
    NaturalNumber Zero()          ::=    0
 
    Boolean IsZero()              ::=    if(x) return FALSE
                                         else return TRUE
 
    Boolean Equal(x, y)           ::=    if(x == y) return TRUE
                                         else return FALSE
 
    NaturalNumber Successor(x)    ::=    if(x == INT_MAX) return x
                                         else return x + 1
 
    NaturalNumber Add(x, y)       ::=    if((x + y) <= INT_MAX) return x + y
                                         else return INT_MAX
 
    NaturalNumber Subtract(x, y)  ::=    if(x < y) return 0
                                         else return x - y
end NaturalNumber
 

2. 자료의 종류와 표현

  1. 자료 종류와 표현

    1. 자료의 표현
      1. 수치 자료
        1. 정수 표현(고정소수점 수의 표현)
          1. 10진 연산
            1. 팩(packed) 연산
            2. 언팩(unpacked) 연산
          2. 2진 연산
            1. 부호화 크기
            2. 1의 보수
            3. 2의 보수
        2. 실수 표현(부동소수점 수의 표현)
      2. 문자 자료
        1. BCD code(Binary Coded Decimal): 2진화 10진 코드
        2. EBCDIC code: 확장된 2진화 10진 코드
        3. ASCII code: 정보 교환 미국 표준 코드
      3. 논리 자료
      4. 포인터 자료
      5. 문자열 자료
    2. 수치자료
      1. [정수, 고정소수점]10진 연산
        1. 팩(packed) 연산
          1. 1바이트에 10진수 두 자리를 표현 → 처리시간 단축 & 효율적으로 기억공간 이용
          2. 컴퓨터 내부적으로 연산할 때 사용하는 형식. 입출력 불가.
          3. 1 바이트에 2 개의 디지트(digit)를 각각 8421 BCD 코드로 표시
          4. 언팩 10진법은 연산이 불가능
            → 연산 전에 팩 10진법 형식으로 변환시켜 연산
            → 연산 결과 출력할 때 다시 언팩 10진수로 변환
          5. 구성
            1. 양수인 경우: C(1100)
            2. 음수인 경우: D(1101)
            3. 부호가 없는 경우: F(1111)
        2. 언팩(Unpacked) 연산
          1. 개요
            1. 1 바이트에 10진수 한 자리를 표현하므로
              1. 처리 시간이 많이 소요되고
              2. 기억 공간의 낭비 초래
            2. 자료 입출력에 사용되며 zone 형식이라고도 함
            3. 주기억장치에 자료가 기억될 때 사용되는 형식. 부호는 pack 형식과 같다
          2. 구성: 앞 4bit는 zone영역(F = 1111)과 뒤 4bit는 digit 영역
            1. 양수인 경우: C(1100)
            2. 음수인 경우: D(1101)
            3. 부호가 없는 경우: F(1111)
      2. [정수, 고정소수점]2진 연산
        1. 정의
          1. 2진법으로 표시되는 정수는
            1. 부호 비트 부분과
            2. 크기 표시 부분으로 나눈다
          2. 소수점의 위치가 고정되어 있는 수로 정수를 표현
          3. 음수 표현법
            1. 부호화 크기
            2. 1의 보수
            3. 2의 보수
          4. 보통 컴퓨터와 외부와의 입출력에 사용. 유효 숫자에 비해 자릿수가 너무 크기에 직접 컴퓨터에 저장하는 데 효율적이지 못함
          5. 보수가 필요한 이유
            1. 보수를 이용하면 뺄셈을 덧셈의 원리로 가능
              → 가산기로 모든 사칙 연산 가능
              → 감산기 불필요
        2. 부호화 크기(signed magnitude) 표현
          1. MSB(Most Significant Bit)
            Most Significant Bit.gif
          2. 음수 표현이 가장 간단하지만 감/가산기 모두 필요하므로 하드웨어 비용 증가
          3. 수의 표현 범위: -(2^(n-1) -1) ~ (2^(n-1) - 1), +0과 -0 존재.
        3. 1의 보수 표현
          1. 음수 표현 시 0은 1로, 1은 0으로 바꾼다
            oneComplement.png
          2. 덧셈할 때 순환 자리 올림(end around carry) 발생 가능
            → 연산 시 올림수를 더해야 한다
            End-around+carry+occurs.+1.jpg
          3. 수의 표현 범위:  -(2^(n-1) -1) ~ (2^(n-1) - 1), +0과 -0 존재.
        4. 2의 보수
          1. 과정: A - B = A + (-B)
            1. 감소시킬 값(B)의 2의 보수를 찾는다
            2. A에 B의 2의 보수를 더한다
            3. 마지막으로 올림수가 1이면 양수이고 true 형태
              마지막으로 올림수가 0이면 음수이고 2의 보수 형태
            4. 예제: 9 - 4
              1. A = 9 = 1001
                B = 4 = 0100
              2. B의 2의 보수는 “1의 보수 + 1”
                → 0100의 1의 보수는 1011
                → 1011 + 1
                → 1100 = -B(-4)
              3. 1001 + 1100
                1(final carry) 0101
                → 마지막 올림수가 1이면 양수이고 무시
                → 0101 = 5
          2. +0과 -0이 표현되는 것 해결
          3. 수의 표현 범위: -(2^(n-1)) ~ (2^(n-1) -1), +0 존재.
            1. 4개의 변수(0000)에 대하여 -8부터 7까지의 범위
              → 4비트(9)와 4비트(4)의 계산 결과 5비트(10101)가 나오지만 표현이 불가능. 따라서 21이지만 -8과 7의 범위를 초과하므로 1은 overflow로 무시
          4. 오버플로우의 조건
            1. x와 y는 두 수(A와 B)의 sign bit
              x'는 x의 보수, y'는 y의 보수
            2. z는 결과의 sign bit
              z'는 z의 보수
            3. x'·y'·z + z'
              1. = 0 → no overflow
              2. = 1 → overflow
            4. 예제: 0110 - 1011
              1. A = 6 = 0110
                B = 11 = 1011
              2. B의 1의 보수는 0100
                B의 2의 보수는
                → 0100 + 1 = 0101 = 5
              3.    0110
                 +0101(= -11)
                →1011 → 마지막 올림수(final carry)가 0이므로 음수
                → 1의 보수 형태 + 1 = 2의 보수 형태
                → 0100 + 1 = 0101 = 5
                → 음수이므로 -5
          5. 8비트에서 10진수 25를 표현하는 경우
            고정 소수점 표현방식.png
          6. 2의 보수 계산 예제: -9 + 5 = -4
            2의 보수 계산 예제.png
      3. [실수] 부동소수점 수(floating point number)의 표현
        1. 개요
          1. 표현 형식
            1. 부호부
            2. 지수부
            3. 가수부
          2. 큰 수와 작은 수의 표현이 정밀도를 요구하는 과학, 기술 계산에 이용
          3. 지수 + 가수의 형태로 지수부(exponent)는 8bit로 표현
            부동소수점수.png
          4. 정규화(normalize)는 소수점을 이동하여 소수 첫째 자리에 유효 숫자가 오도록 하여 지수부  + 가수부의 형태로 만드는 것으로 연산속도를 느리게 한다
          5. 장점
            1. 수의 크기를 간단히 비교 가능
            2. 표현된 수의 정밀도 높일 수 있음
            3. 유효숫자의 범위 넓힐 수 있음
          6. 예제
            부동소수점 26.5 예제.png
      4. 바이어스(bias)
        1. bias값은 부동소수점 표현에서 지수를 나타내기 위한 비트수 크기 결정 역할
          1. if bias = 64
            → 64 x 2 = 128
            → 지수부 비트수가 7비트
            → 000 0000 ~ 111 1111, 즉 0 ~ 127승의 표현이 가능
          2. 127바이어스: 255가지의 수를 양수와 음수로 표현하면 “-126 ~ 0 ~ +127”승이 존재
            → 지수부 값이 127(=(0111 1111)2)일 때 0승(기준)
            bias.png
    3. 문자 자료
      1. BCD(Binary Coded Decimal) code
        1. 개요
          1. 2bit의 zone bit + 4bit의 digit bit
          2. 알파벳 대문자와 소문자 구별 불가.
          3. 26(64)가지의 문자 표현이 가능
          4. 숫자는 4bit, 문자는 6bit 필요
        2. 구성
          bcd.png
      2. EBCDIC(Extended Binary Coded Decimal Interchange) code
        1. 개요
          1. BCD 코드에 zone 영역을 2bit 추가
            → 8bit로 하나의 문자 표현하는 확장된 2진화 10진 코드
          2. 28(256)가지 문자 표현이 가능
        2. 구성
          ebcdic.png
      3. ASCII(American Standard Code for Information Interchange) code
        1. 개요
          1. 한 개의 parity bit* + 실제 정보 표현하는 7bit(zone bit 3개 + digit bit 4개)
            *정보의 전달 과정에서 오류가 생겼는지를 검사하기 위해 추가된 비트.
          2. ASCII코드는 데이터 전송시 표준 코드로 사용
            → EBCDIC 같은 코드 사용하는 컴퓨터에서는 통신 시 코드 변환 필요
        2. 구성
          ascii.png
          ascii_parity.png
      4. 유니코드(Unicode)
        1. 개요
          1. ASCII 코드의 한계성 극복 위해 개발된 인터넷 시대의 표준
          2. 유니코드 컨소시엄에 의해 UTF-32(32bit), UTF-16(16bit), UTF-8(8bit)의 세 가지 기본 코드 개발
            *UTF = Unicode Transformation Format
          3. 유니코드는 4byte로 구성되어 사용하는 코드 범위에 따라 1~4byte로 변환 가능. UTF-7, UTF-8, UTF-16BE, UTF-16LE 등.
          4. 미국, 유럽, 동아시아, 아프리카, 아시아 지역 등 주요 언어들에 적용 가능
      5. 한글코드
        1. 개요
          1. ASCII코드를 기반으로 16비트를 사용하여 하나의 문자를 표현
          2. 조합형과 완성형으로 분류
          3. 조합형 한글의 원리는 초, 중, 종성에 해당하는 문자를 각각 부호화하여 문자에 따라 부호를 조합하여 만드는 방식.
        2. 역사
          1. 컴퓨터가 한글을 표현하기 시작하던 1980년대에는 2바이트 조합형 한글을 주로 사용. 그러나 초, 중, 종성을 조합하는 부호표가 각 업체마다 달라서 A사의 컴퓨터에서 작성한 프로그램이 B사의 컴퓨터에서는 한글이 깨지는 문제가 발생
          2. 정부는 한글 전자 문자 표준의 제정의 필요성을 느끼고 표준을 제정하게 되는데, 당시 학계에서는 조합형 한글이 한글 창제의 원리에 부합하고 모든 활자를 표현 가능하므로 조합형을 표준으로 제안하였으나 정부는 완성형 한글을 표준(KS_C_5601_1987)으로 제정
          3. 완성형의 문제로 1992년 기존 KSC5601 완성형과 함께 조합형 한글을 함께 수용할 수 있는 KSC5601-92를 표준으로 제정하여 현재까지 사용
        3. KSC5601-92 표
          KSC5601-92.png
        4. EUC(Extend Unix Code)
          1. 유닉스에서 영어를 제외한 문자를 표시하기 위한 확장 부호
          2. euc-kr은 한글 표현 위한 문자 인코딩. 영문은 KSC5636, 한글은 KSC5601로 처리.
          3. euc-kr은 KSC5601-92로 완성형 및 조합형 사용 가능
        5. CP949(Code Page) → MS949
          1. 마이크로소프트에서 사용하는 한글문자의 부호표
          2. IBM에서 최초 고안했으나 MS-window에서 한글 표현 위해 채택
        6. Unicode
          1. 유니코드에 KSC5601 문자집합 포함되어 있음
          2. 4byte의 유니코드의 어느 범주에 속하는지 & 어떤 변환식을 사용하는지에 따라 부호의 값이 달라진다
            → KSC5601을 그대로 사용하는 euc-kr(CP949)와 유니코드는 서로 호환X
    4. 기타 자료
      1. 논리 자료 //boolean
        1. 참/거짓을 표현
        2. 서로 다른 두 가지 상태 구분 위해 최소 기억 단위인 1bit에서 가능
        3. 실제로 컴퓨터 응용에서는 byte나 word로 참/거짓 표현
          ex. C언어서 1 = true / 0 = false
      2. 포인터 자료
        1. 컴퓨터의 주기억 공간은 연속적인 주소로 기억공간 내의 위치를 나타낸다
          → byte, word 등의 단위로 주소 지정 가능
          ex. byte 단위로 주소 지정 → 기억장소는 처음부터 1byte마다 연속된 주소 부여
        2. 포인터 = 주소(번지)
          → 포인터 자료 = 기억공간의 위치를 나타내는 주소를 값으로 갖는 자료 객체
          → 이들 주소는 고정된 크기의 비트로 표현 가능
        3. 포인터가 어떤 주소 값을 가질 때는 그 주소에 수록된 자료를 “가리킨다”라고 말함
          → 포인터가 가리키는 대상이 없으면 nil 또는 null pointer
      3. 그레이 코드(gray code)
        1. 사칙연산에는 부적당
        2. 아날로그/디지털(A/D) 변환기나 입출력 코드로 사용
        3. 배타적 논리합(Exclusive-OR, XOR)의 원리 이용
        4. 변환 방법
          gray code.png
        5. 사용례
          gray code usecase.png
      4. 패리티 비트(parity bit)
        1. 개요
          1. 정보의 전달 과정에서 오류가 생겼는지를 검사하기 위해 추가된 비트.
          2. 비트 중 1의 총 개수를 짝수(even) 또는 홀수(odd)로 유지하며 오류를 검출
          3. 2비트 이상의 오류는 검출할 수 없다.
          4. 에러 교정 기능 없다.
        2. 병렬 패리티
          1. 가로와 세로 데이터들에 패리티를 적용하여 에러 위치 검출하여 정정 가능
            parallel parity.png
        3. 데이터 전송 시스템에서의 패리티 비트 사용례
          1. 에러 검출 위해 송신측에 패리티 발생기, 수신측에 패리티 검출기 구성하여 그 출력을 보고 에러 발생 여부 판단
          2. ex.
            data trans with parity.png
      5. 해밍코드(hamming code) = 에러 정정 코드
        1. 개요
          1. 오류를 검출하고 교정할 목적으로 비트 추가
          2. 추가적으로 많은 비트가 필요하므로 많은 양의 데이터 전달 필요
          3. 해밍 코드에서는 짝수 패리티 사용
        2. 추가되는 패리티 비트 수 2^p >= d +p +1
          1. p = 패리티 비트 수
          2. d = 데이터 비트 수
        3. 8비트 데이터의 에러 정정 코드
          1. P1 = D3 D5 D7 D9 D11
            → 0 0 0 1 1 = 0
          2. P2 = D3 D6 D7 D10 D11
            → 0 1 0 1 1 = 1
          3. P4 = D5 D6 D7 D12
            → 0 1 0 0 = 1
          4. P8 = D9 D10 D11 D12
            → 1 1 1 0 = 1
        4. 해밍코드에서 패리티 비트 생성 과정hamming code with parity.png
        5. 해밍코드에서 패리티 비트 검사 과정
          parity example2.png
          1. P1 = P1  D3 D5 D7 D9 D11
            → 0 0 1 0 1 1 = 1
          2. P2 = P2 D3 D6 D7 D10 D11
            → 1  0 1 0 1 1 = 0
          3. P4 = P4 D5 D6 D7 D12
            → 1 1 1 0 0 = 1
          4. P8 = P8 D9 D10 D11 D12
            → 1 1 1 1 0 = 0
          5. 모든 패리티 = 0 → 에러 없음
            그렇지 않으면 에러 발생
          6. 검사된 패리티를 P8P4P2P1 순서대로 정렬 = 0101  = 5
            → 수신된 데이터 01011101110에서 앞에서 다섯 번째 비트에서 에러 발생
            D5에 에러 발생
    5. 진법 변환
      1. 각 진법의 수체계
        1. 10진법 → 0, 1, 2, … , 9로 표현되는 10의 digit로 숫자 표현
        2. 2진법 → 0, 1 로 표현되는 2개의 digit로 숫자 표현
        3. 8진법 → 0, 1, 2, … , 7로 표현되는 8개의 digit로 숫자 표현
        4. 16진법 → 0, 1, 2, … , 9, A, B, C, D, E, F로 표현되는 16개의 digit로 숫자 표현
        5. 8진법과 16진법이 필요한 이유
          1. 10진수 → 2진수: 나눗셈 사용
            2진수 → 10진수: 곱셈 사용
          2. 2보다 8 또는 16이 나누거나 곱하는 횟수가 줄어 변환시간 단축
      2. 10진수 → 2진수, 8진수, 16진수 //정수 및 소수
        진수변환 최종.png
      3. 2진수, 8진수, 16진수 → 10진수
        1. 해당 진수의 전개식을 사용하여 자릿값을 곱하여 개산
      4. 2진수, 8진수, 16진수 상호 변환
        2진, 8진, 16진 변환.png

3. 추상 데이터 타입