본문 바로가기
프로그래밍언어/프로그래밍 지식(programming knowledge)

abstraction(추상화)

by 바코94 2022. 4. 17.

# 정의
> wekipedia 정의
추상화
(abstraction)는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.

> 해석
추상화란 `구체적인 것에서 핵심을 찾아내는 것`라고 정의할 수 있다
`구체적인 것`과 `핵심`은 무엇일까?

`구체적인 것`이라는 것은 상대적인 것이며 상황에 따라 다르다.
`A문서를 a4 용지에 좌우 여백은 10으로 하고 상하 여백은 20으로 해서 출력하라` 라는 문장이 있다고 하자. 위 문장에서 핵심은 무엇일까?
"A문서를 출력하라" 가 위 문장에서 어떻게 하는지는 숨기고 핵심만 뽑아낸 것이다. 무언가 핵심적인 것만 추려낸 느낌이다. "A문서를 출력하라"에서 더 핵심을 뽑아내기란 어려워 보인다.
`A문서를 a4 용지에 좌우 여백은 10으로 하고 상하 여백은 20으로 해서 hp 프린터를 이용해 출력하라` 로 구체적인 것이 한 단계 더 숨겨져 있던 것일 수도 있다.

추상화에서 `핵심`이란 어떻게(how) 하는지를 숨기고 무엇(what)을 하는지로 나타난다. 

프로그래밍에서 가장 익숙한 추상화는 `1+1` 이 있다. 1+1은 사실 메모리 수준에서 bit 단위 연산을 해서 나온 결과의 값이다. bit 단위 연산을 어떻게 하는지도 있기 때문에 더 들어가면 이런 구체적인 것들까지 알아야만 1+1을 할 수 있다.
우리의 멘탈 모델 중 수학에서의 `1과 1을 더한다` 라는 것이 어떻게 되는지 실제적으로 되는지는 숨기고 무엇을 하는지에 집중하게끔 프로그램 언어가 높은 수준의 추상화 수준을 지원하는 것이다. 
우리는 높은 수준의 추상화 수준을 제공하는 시대에 살고 있다. 

프로그램을 보던 중 다음과 같은 코드를 보면 이 코드가 무엇을 하는 코드인지 알 수 있을까? (python 코드)

n = 10
k = n - 1
for i in range(0, n):
    for j in range(0, k):
        print(end=" ")
    k = k - 1
    for j in range(0, i+1):        
        print("* ", end="")
    print("\r")

이 코드가 `무엇(what)`을 하는지 알려면 코드를 한줄 한줄 들여다 보아야한다. 심지어 변수명도 i, n, k 등으로 의미를 알 수 없어 더욱 파악하기 어렵다.
https://www.online-python.com/ 같은 곳에서 코드를 실행해봐야만 어떤 코드인지 이해할 수 있다. 

코드가 what을 나타내지 않는 경우에는 추상화 수준을 높여주는 작업이 필요하다 
위 예시 코드는 삼각형 모양을 출력해주는 함수이다. 따라서 `삼각형을 출력한다` 라는 의미로 함수를 선언하면 코드를 읽는 사람이 삼각형을 출력하는지 한 눈에 알 수 있다.

def printTriangle(n):
    k = n - 1
 
    for i in range(0, n):
        for j in range(0, k):
            print(end=" ")
    
        k = k - 1
        for j in range(0, i+1):
            print("* ", end="")
        print("\r")
 
n = 10
printTriangle(n)


# 활용
프로그래밍 과정에서 어떤 부분에서 무엇(what)을 파악하기 어렵다면 추상화를 통해 how는 숨기고 핵심만 뽑아내는 작업을 해볼 수 있다.