The Concept of Abstraction
- 추상화
- 특징적인, 가장 중요한 특성으로 전체를 표현하는 것
- 공통적인 속성이나 기능을 묶어 이름을 붙이는 것
- 거의 모든 프로그래밍 언어는 subprogram을 통해 process abstraction을 지원한다.
- 1980년대 이후의 거의 모든 프로그래밍 언어는 data abstraction을 지원한다.
- process abstraction에서 처리하는 데이터까지 추상화하는 방법
Abstract Data Type
- 다음의 두 조건을 만족하는 사용자 정의 자료형을 ADT라 칭한다:
- Hidden data representation
- 서비스하고자 하는 기능만 보여주며, 구체적인 내부 동작과 객체의 데이터 타입 등은 모두 숨긴다.
- 일종의 캡슐화
- Operation
- 이 타입에 대한 연산들이 문법적으로 하나의 단위(single syntactic unit) 에 모두 포함되어야 한다.
- Hidden data representation
- 장점
- data representation 부분을 모두 숨기므로 신뢰성이 높다.
- program organization 방법을 제공한다. 수정이 쉬워진다.
- ADT 구현을 위한 언어 조건
- 이러한 조건을 만족하는 어떠한 구조에 대한 타입 정의를 캡슐화할 수 있는 문법적 단위가 필요하다.
- class 등
- 가시성 조절 가능
- private, protected 등
- 몇몇 주요 operation은 프로세서 안에서 처리해줄 수 있어야 함
- 이러한 조건을 만족하는 어떠한 구조에 대한 타입 정의를 캡슐화할 수 있는 문법적 단위가 필요하다.
Language Examples
1. C++
- C의 구조체 + Simula 67의 class
- class는 타입이면서 캡슐화 장치다.
- 모든 클래스 인스턴스는 같은 멤버 함수의 코드를 공유한다.
- 각 클래스 인스턴스는 저마다의 클래스 데이터 멤버를 가진다.
- 인스턴스는 static, stack dynamic, heap dynamic할 수 있다.
- 가시성 조절이 가능하다.
- private, public, protected
- constructor(생성자)
- 인스턴스의 멤버를 초기화하는 함수
- 인스턴스가 Heap-dynamic할 때에는 공간을 할당하는 역할도 함
- 인스턴스가 생성될 시 묵시적으로 호출되지만, new 키워드를 통해 명시적으로 호출할 수도 있음
- 생성자의 이름은 클래스의 이름과 동일함
- Destructor(소멸자)
- 소멸자는 클래스 이름 앞에 ~를 붙여 호출할 수 있음
- 인스턴스의 lifetime이 끝나면 묵시적으로 호출되지만, 명시적으로 호출될 수도 있음(위의 방법으로)
- 객체가 사라질 때 공간을 메모리에 반납하는 역할을 함
- clause
2. Java
- 대부분 C++와 비슷함
- 모든 사용자 정의 자료형은 class임
- 모든 객체는 heap에 할당됨
- 클래스 안의 모든 멤버들은 (clause 대신) 접근 제어 지정자를 가짐. 사용 안하면 garbage collection이 회수해감
- package scope
- 같은 package의 접근 제어 지정자가 없는 클래스 내 멤버들은 visible함
3. C#
- C++와 Java를 기반으로 함
- 2개의 접근 지정자를 가짐: internal과 protected internal
- 모든 클래스 인스턴스들은 heap dynamic함
- 모든 클래스가 사용할 수 있는 default constructor가 있음
- Garbage collection이 있으므로, destructor는 잘 사용되지 않음
- 구조체는 경량 클래스로, 상속 지원이 되지 않음
- 데이터 멤버에 접근하기 위해서 getter와 setter를 사용함
- getter와 setter를 묵시적으로 사용할 수 있는 방법을 제공함
Parameterized Abstract Data Types
- = Generic Abstract Data Types
- Java 5.0에서의 Parameterized Classes
- Generic parameter들은 무조건 class여야 함. 기본 타입에 대해서는 wrapper가 있으니 걱정 ㄴㄴ
- Collection types(ArrayLiss, LinkedList, Vector 등)등이 generic type임
- 사용자 정의 generic class를 생성할 수 있음
- 인덱스를 통해 원소에 접근할 수 없음
- C#에서의 Parameterized Classes
- Java 5.0과 비슷하지만, 얘는 wildcard classes를 지원하지 않음
- Array, List, Stack, Queue, Dictionary 등이 미리 정의되어 있음
- Parameterized structures의 원소들은 인덱스를 통해 접근할 수 있음
Encapsulation Constructs
- 조직화(organization): 한 프로그램을 여러 서브프로그램으로 나눠 작성
- 물리적인 파일로 구분(partial compilation): 부분 컴파일 가능
- 👉🏻 서브프로그램을 그룹화하여 논리적으로 연관되며 부분 컴파일이 가능하도록 함 = 캡슐화
- Nested program이 지원된다면 특정 서브프로그램 내에서만 쓰이는 기능들은 그 안에 nested하게 정의
Language Examples
1. C
- 서브프로그램을 묶어 독립적으로 컴파일될 수 있는 파일로 분리
- 인터페이스는 header 파일에 위치
- 단점: 링커가 인터페이스와 구현부 간의 타입 검사를 진행하지 못함. #include로 링킹해줘야 함
2. C++
- header와 code file로 분리할 수 있다는 점은 C와 유사
- 캡슐화를 위해 class를 사용할 수 있음
- Java의 package와 비슷한 개념인 friends가 있음. friends로 지정하면 동일 파일의 다른 클래스의 Private한 멤버에 접근할 수 있음
3. C# Assemblies (.NET 친구들)
- 분리되어 컴파일할 수 있는 dll 파일이나 exe 파일로 묶임
- dll: 클래스나 메서드의 집합
- internal: 어셈블리 안의 모든 클래스에서 볼 수 있게 해주는 접근 지정자
Naming Encapsulation
- 이름을 위한 scope 생성
- C++의 namespace, Java의 Packages
'강의노트' 카테고리의 다른 글
[2021-1 프로그래밍언어론] Chapter 14: Exception Handling and Event Handling (0) | 2021.06.01 |
---|---|
[2021-1 프로그래밍언어론] Chapter 12: Object-Oriented Programming (0) | 2021.06.01 |
[2021-1 프로그래밍언어론] Chapter 10: Implementing Subprograms (0) | 2021.05.30 |
[2021-1 데이터마이닝및분석] Chapter 2: Data (3) Similarity (0) | 2021.04.16 |
[2021-1 데이터마이닝및분석] Chapter 2: Data (2) Preprocessing (0) | 2021.04.15 |