# [프로그래밍 언어] 8. Abstract Data Types and Encapsulation Constructs

## 추상화

---

### 추상화

![Image](https://upload.cafenono.com/image/slashpagePost/20250103/225754_Dde0oMBXyHs7JfMRRF?q=80&s=1280x180&t=outside&f=webp)

- 중요한 속성만을 포함하는 개체의 개관 또는 표현

- 공통적인 속성이 고려될 필요가 없는 그룹

- 개체들의 인스턴스들을 모으는 것을 허용

- 공통적인 속성 → 다시 작성 X

- 자동차 인스턴스는 자동차 클래스를 상속

### 프로세스 추상화

- 어떻게 실행되는지 상세하게제공X, 호출 방법을 다른 프로그램에게 제공

- 모든 부프로그램은 프로세스 추상화라고 할 수 있다

    - e.g. 정렬 프로세스를 위한 부프로그램 → 어떤 방식으로 정렬하는지 알 필요 없음

- 사용자는 이름, 프로토콜을 아는 것이 필요

### 데이터 추상화

- 레코드 데이터 구조에서 출발

- **추상 데이터 타입**: 레코드 형태인 데이터 구조 + 데이터를 다루는 부프로그램

    - 데이터 표현, 그 타입의 연산을 제공하는 부프로그램이 포함된 인클로저

- **접근 제어 → 인클로저 외부 단위로부터 숨길 수 있음**

    - 추상 데이터 타입의 변수를 선언 O, 내부 데이터 알 수 없음

    - 추상 데이터타입의 인스턴스 = 객체 (클래스)

- **사용자 정의 추상 데이터 타입**

    - 타입 정의

    - 연산자들 집합

- **추상 데이터 타입**

    - 객체 표현: 프로그램 단위로부터 숨겨짐 → **정보 은폐**

        - **신뢰성 증가**: 클라이언트는 객체 기본 표현 바꿀 수 없음 → 무결성 증가

        - **프로그래머가 유의할 변수 개수 감소**

        - **변수 이름 충돌 감소**

        - **클라이언트에게 독립적**: 코드를 수정해도 클라이언트 변경 X

    - 타입 선언&타입의 객체 연산의 프로토콜 → 단일 구문 단위에 포함

    - 정의된 타입 변수 생성 가능 (int 등)

- **접근자 메서드**

    - 객체의 데이터 멤버가 클라이언트로부터 은폐 →접근자 메서드(게터, 세터)로 간접 접근

    - 읽기 전용 접근: 게터

    - 세터 + 제한 조건 (어떤 범위로 제한 가능)

    - 클라이언트에게 영향을 주지 않고 구현 수정

    - 데이터 멤버를 공용으로 명세 X, private으로 명세

## 추상 데이터 타입의 설계 고려 사항

---

**추상 데이터타입 사용**

- 추상 데이터 타입 선언

- 부프로그램의 프로토타입

**타입의 설계자에 의해 제공되는 대표적인 네 가지 연산**

- 반복자

- 접근자

- 생성자

- 소멸자

## 언어 예제

---

### C++ 추상 데이터 타입

- 추상 데이터 타입 → C언어 struct와 유사한 C++ 클래스 제공

- **캡슐화**: 멤버 데이터 + 멤버 함수

    - 멤버 데이터와 멤버 함수는 클래스와 관련

    - 인스턴스 데이터와 인스턴스 멤버 함수는 인스턴스와 관련

    - 클래스 인스턴스 종류: 정적, 스택 동적, 힙 동적

        - 스택 동적: Player player;

        - 힙 동적: Player *player = new Player; // new 생성 delete 소멸

- **정보 은폐**: 은폐 개체 + 가시 개체

    - 은폐 개체(멤버 데이터)는 private 절, 가시 개체(멤버 함수)는 public 절

- **생성자와 소멸자**

    - **생성자**: 클래스와 동일한 이름, 묵시적 호출, 멤버 데이터들 초기화, 중복 가능

    - **소멸자**: 틸트(~)가 선행, 묵시적 호출, delete 연산자 사용 가능

    - 생성자, 소멸자 모두 반환 타입 X, 명시적 호출 가능

### Java 추상 데이터 타입

- 모든 객체들은 **힙에 할당**, 참조 변수로 접근

- Java는 메소드 머리부 + 몸체 모두 정의해야함

- private, public 절보다 접그 수정자(public, private, protected, default)를 가짐

- 가비지 수집 → **소멸자가 없다**

## 매개변수 추상 데이터 타입

---

- 추상 데이터 타입을 매개변수화 하는 것이 편리

    - 임의의 스칼라 타입 원소들을 저장할 수 있는 스택 추상 데이터 타입을 설계하는 것이 좋음

**Java**

```javascript
ArrayList<Integer> myArray new ArrayList<Integer>();
```

- 포괄형 매개변수가 클래스인 경우 → 매개변수 추상 데이터 타입의 형태

- collection 타입은 항상 다중 타입을 저장할 수 있다

- **객체 저장 시 문제점**

    - collection 제거될 때마다 적당한 타입으로 캐스팅

    - collection에 추가될 때 오류 검사 없음

    - 원시 타입 저장 불가능

- **collection 클래스 → 포괄형 클래스 generic class ****<T>**

    - 각괄호 안에 포괄형 매개변수를 보냄

    - 원시 타입 저장 불가능

    - 색인을 사용할 수 없음

For the site tree, see the [root Markdown](https://slashpage.com/yerim-devnote.md).
