추상화

위키백과 - “컴퓨터 과학에서 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.”

즉, 정확하게 표현하기 힘든 것을을 중요한 부분이나 특징점을 잡아 설명하는 것을 ‘추상적으로 표현한다’, ‘추상화한다’고 할 수 있다.

객체지향 프로그래밍에서 추상화는 클래스를 정의할 때 불필요한 부분들을 생략하고 객체의 속성 중 중요한 것에만 중점을 두어 개략화(모델화) 하는 것을 말한다. 객체지향 프로그래밍의 추상화는 데이터 추상화와 제어 추상화로 나뉜다.

제어 추상화

제어 추상화는 어떤 클래스의 메소드를 사용하는 사용자에게 해당 메소드의 작동방식과 같은 내부 로직을 숨기는 것을 말한다. 현실세계에 예를 들어 운전자는 운전할 때, 자동차의 시동, 정지, 가속, 블레이크와 동작의 메커니즘을 이해할 필요 없이 사용 방법만 알면된다. 프로그래밍의 예를 들면 특정 라이브러리를 받아 그 내부의 메서드를 사용하는 것, 사용자는 메서드 내부의 동작은 모르지만 사용방법(호출, 인자)을 알고 사용할 뿐이다.

javascript에서 배열 관련 메서드도 마찬가지다.

사용자는 map 메서드의 실제 동작 과정은 모른다. (유추할 순 있다.) 다만 map 메서드는 이터러블한 객체에 사용할 수 있고 인자로 콜백을 받아 사용한다는 방법을 알기에 사용할 수 있는 것이다.

const arr = [1,2,3,4,5]
const newArr = arr.map((e, i) => e + 5 );

제어 추상화는 생산성 증가, 가독성 증가, 에러 감소, 유지 보수시 시간 단축 등의 효과를 준다. 프로그래밍 노력과 복잡성을 줄여준다.

데이터 추상화

데이터 추상화는 대상을 간단한 개념으로 일반화 하는 과정을 말한다. 삼각형, 사각형, 원이라는 객체가 있을 때, 이들을 하나로 묶어 도형이라 이름을 붙이는 것을 데이터 추상화라 볼 수 있다.

예를 들어 아이폰이라는 객체를 추상화를 통해 정보를 분리하면, 아이폰 → 휴대폰 → 통신기기 → 전자체품으로 추상화가 이어질 수 있다.

class 전자제품 {
    전원기능();
}
 
class 통신기기 extends 전자제품 {
    통신기능();
}
 
class 휴대폰 extends 통신기기 {
    카메라기능();
    게임기능();
}
 
class 아이폰 extends 휴대폰 {
    통화기능() { ... }
    카메라기능() { ... }
    게임기능() { ... }
    애플 제품 연동기능() { ... }
}