PL Abstraction
프로그래밍 언어 추상화
- 추상화는 상위 개념에서 사용하기 위해 주어진 객체, 작업의 속성들 중 사용자에게 필요하지 않은 부분은 은닉 또는 삭제시키는 것이다.
- 추상화를 통해 일부 속성들만을 가지고 주어진 객체, 작업들을 필요한 정도로 묘사할 수 있다.
- 추상화는 소스 코드의 Readability를 증가시킨다. (생소한 PL이더라도 추상화 된 형태를 보면 짐작이 가능하다.)
Abstraction Category (추상화 범주)
Main-Category : 추상화 주체(데이터, 실행흐름)에 따라 분류한다.
1. Data Abstraction(자료 추상화) : 데이터를 추상화한다.
2. Control Abstraction(제어 추상화) : 프로그램 실행순서를 제어하는 특성을 추상화한다. (Loop, Condition, Call 등)
Sub-Category : 추상화 과정에서 포함되는 정보의 양에따라 분류한다.
A. Basic Abstraction(기본적 추상화) : 기계 정보에 대한 추상화
B. Structured Abstraction(구조적 추상화) : 프로그램 구조에 대한 추상화 (기본적 추상화보다 Global한 추상화)
C. Unit Abtraction(단위 추상화) : 단위 프로그램 전체의 추상화
Main \ Sub | Basic Abstraction (Local) | Structured Abtraction (Global) | Unit Abtraction (Entire) |
Data Abtraction | 1-A | 1-B | 1-C |
Control Abstraction | 2-A | 2-B | 2-C |
1. Data Abstraction (자료 추상화)
A. Basic-Data Abstraction (기본적 자료 추상화)
- 컴퓨터 내부의 Data Type을 추상화한다.
- 기억 장치의 위치는 변수이름, 데이터 값(2진수)은 실수 범위로 추상화된다.
ex) 기본적 자료 추상화의 결과물 : \(\texttt{int x; float y;}\)
B. Structured-Data Abstraction (구조적 자료 추상화)
- 연관된 Data Set을 추상화한다. (단일 데이터가 아닌 데이터 집합을 추상화한다.)
- 데이터들이 Array, Record와 같은 형태로 묶이게 된다.
- 구조적 추상화가 이루어진 Data Type을 Structured Type(구조 자료형) 또는 구조형이라 부른다.
- 구조형은 내부의 기계적 표현이 아닌, 프로그래머가 생성한 새로운 데이터형이다.
ex) 구조적 자료 추상화의 결과물 : \(\texttt{struct dataSet {...}}\) (C의 구조체 키워드)
C. Unit-Data Abstraction (단위 자료 추상화)
- 데이터 정의, 인터페이스, 값을 하나로 Encapsulation(캡슐화)된다.
- 프로그래머가 자료 구조의 세부사항을 신경쓰지 않아도 된다.
- 데이터의 세부사항에 대한 접근을 제한하여 데이터형의 구조가 수정되어도, 프로그램 전체에 영향을 끼치지 않게 된다.
- 단위 자료 추상화가 이루어진 Data Type을 ADT(Abstraction Data Type)이라고 한다.
ex) 단위 자료 추상화의 결과물 : C++/Java의 \(\texttt{class}\), Ada의 \(\texttt{package}\), Modula-2의 \(\texttt{module}\) (사실, 이 예시들은 단위 제어 추상화도 지원된 결과이다.)
2. Control Abstraction (제어 추상화) = Algorithm Abstraction (알고리즘 추상화)
A. Basic-Control Abstraction (기본적 제어 추상화)
- 기계 명령어들이 조합되어 하나의 단순한 Abstract Statement(추상 구문)으로 추상화한다.
- 배정문, 분기문과 같은 명령어들이 그 결과이다.
ex) Java의 배정문 \(\texttt{x := x + y}\) / FORTRAN의 조건 분기문 \(\texttt{IF (A.GT.B) GOTO 10}\)
B. Structured-Control Abstraction (구조적 제어 추상화)
- 이 단계에서는 단일 Statement(구문)들이 조합되어 하나의 그룹을 이룬다.
- Condition(조건문), Loop(반복문), Sub-Program Call(함수 호출)*와 같은 구문들이 그 결과이다.
(이 내부에서도 추상화의 정도가 나뉜다. 조건문에서 서브프로그램 구문으로 갈 수록 추상화 레벨이 높아지며, 복잡해진다.)
ex) C/Java의 \(\texttt{for}\), Pascal의 \(\texttt{repeat, while}\), Ada/Modula-2의 \(\texttt{loop_exit}\)
* Function, Method 모두 특정언어에 귀속되는 개념이며, PL에서는 Sub-Program 혹은 Procedure라 통칭한다.
- Procedure Declaration : 프로시저 선언 (프로시저의 이름과 동작 내용을 정의)
- Procedure Invocation(Activation) : 프로시저 호출
C. Unit-Control Abstraction (단위 제어 추상화)
- Procedure들이 모여서 하나의 그룹을 이룬다.
- 사용자는 이러한 Procedure 뭉치들의 인터페이스와 기능만 숙지하고, 내부의 구현사항은 알 필요가 없다.
- Library 형태가 단위 제어 추상화의 결과물이다.
ex) 실제 여러 PL들에서는 아래 예시들과 같이, 자료추상화와 제어추상화를 동시에 지원하는 단위 추상화의 형태를 띈다.
C++/Java의 \(\texttt{class}\), Ada의 \(\texttt{package}\), Modula-2의 \(\texttt{module}\)
※ 위 카테코리에 속하지 않는 제어 추상화의 결과물로 Concurrent Programming(병행 프로그래밍)이 있다.
- 병행 프로그래밍을 지원하는 PL은 병렬로 실행되는 프로그램들 간 동기화/통신을 위해 아래 예시와 같은 방법들을 제공한다.
ex) Modula-2의 Coroutine, Ada의 task, Java의 Multithread 등