우리는 흔히 추상화라는 말을 듣게 된다.
어릴땐 미술에서 듣다가 프로그래밍 세계에서 만나게 되면 약간의 모호감을 느낄 수 있을듯.
추상이란 말은, ab + straction
ab 는 약, 대략의 의미고
extraction 이 추출의 의미, tract 가 범주의 의미인 '계' 이니
말 그대로 뽑을 추, 형태 상.
개략적인 형태를 뽑아내는걸 말한다.
그말은 구체적인 부분을 배제하고, 보다 포괄적인 의미, 큰 붓으로 그릴 이미지를 뽑는단 말이다.
추상없이 모든 디테일을 기억하려 들다간 우리의 머리는 곧 포화상태에 이르게 된다.
다른말로, 추상을 통해 개략적으로 표현된 데이타를 컴퓨터에게 연산시키는 편이 성능을 높이는데도 짱이다.
필요한 개괄적 특징을 뽑아내는것,
즉 의미로운 특징을 뽑아내는것,
즉 시그널이라 불릴 기준을 정해서 사물에서 뽑아내어 정보량으로 표현하는것.
이것이 컴퓨팅 이론에서 말하는 추상이다.
쉬운 예를 들어보자.
갤러그 스러운 슈팅 게임을 만들려고 보니 남은 비행기의 댓수를 표현하고 싶다.
혹은 비행기의 남은 에너지를 표현하고 싶을수도 있고,
잠수함의 남은 배수량을 ( 배수량 한계까지 물이 차면 꼬로록 ) 표현하고 싶다면,
가장 기본적으로는 정수 하나면 충분하겠다. ( 여기서 깨알같이 등장하는 상수. 훗 )
int air_plane = 5;
int sub_marine = 5; // displacement
이것이 추상이다.
여기서 비행기가 한 대 죽은 경우는 air_plane-- 로 정의된다.
배수량이 감소하는 것도 마찬가지.
마찬가지로 비행기를 한 대 획득한 경우는 air_plane++ 로 정의된다.
배수량이 증가하는 것도 마찬가지.
이건 일반적인 흐름이 된다.
그렇지만 특수한 흐름이 필요하고, 그것은 바로 죽음이다.
아이러니하게도 모든 생물은 죽음이란 상태를 통해 정의가 완성된다.
비행기 한 대의 죽음과, 게임의 끝.
배수량의 감소와, 잠수함의 침몰을 완전히 정의하기 위해 다음과 같은 표현이 필요하다는 것이다.
if( --air_plane == 0 ) game_over();
이런 추상의 과정에 있어서, 일반화와 특수화라는 개념을 포함시키면,
추상은 보다 실제적이지 않은, 개념적 영역에 속하게 되고,
일반화는 추상의 논리적 형태와 가까운 실제화,
특수화는 일반화의 형태에서 부족한 부분을 표현한 실제화가 된다.
말이 어렵지?
일반화는 큰 붓, 특수화는 작은 붓이다.
산을 그리는데 삼각형으로 충분하면 그건 쉬운 산이고 아주 쉽게 일반화 된다.
그런데 나무가 보이는 산 ( 근경 )과 보이지 않는 산으로 구별해야 할 필요가 생기면,
앞서 삼각형으로 정의한 산에 대해 보완이 필요하다. 그게 특수화의 개념이지.
template 의 경우에도 추상, 일반화와 특수화가 적용되고
class 의 경우에도 추상과 일반, 특수의 개념이 적용된다.
우리가 만약, 반복적인 흐름 속에 if 문 한 줄을 통해 예외적 처리를 해야하는 경우를 만난다면,
반복적 흐름은 큰 붓, 즉 일반화, if 문 한 줄의 예외 또한 특수화로 정의 되는 것이다.
이 개념은 OOP 전반, TMP 전반, 실상 모든 프로그래밍 영역에서 활용되는 개념으로,
정리해주고 싶었다.
이거 개념 헷갈렸는데 이제 좀 감이 잡히네요 잘 보고 갑니다~
감사합니다~
냥냥 이거 댓글 없어서 개념 못가는군. ㅠㅠ
개추
내가 댓글 달았으니 개념갈 거임 ㅅㄱ
ㄴ 이미 개념에 있던거야 ㅋㅋ