추상화 (Abstraction)
소프트개발에서의 추상화란 복잡한 자료, 모듈, 시스템등으로부터 핵심적인 개념 또는 기능을 간추려내는 것을 말한다.
프로그래밍에서의 추상화는 클래스를 정의할 때 중요하고 공통된 부분만 추출하여 부모(Super) 클래스를 선정하는 개념이다.
객체 지향 프로그래밍에서 추상화는 크게 제어 추상화, 데이터 추상화 두 분류로 나눌 수 있다.
제어 추상화는 쉽게 말해 어떤 클래스의 메소드를 사용하는 사용자에게 해당 메소드의 작동방식과 같은 내부 로직을 숨기는 것이다.
예를 들어 소비자가 스마트폰을 사용할때를 생각해보자, 소비자 입장에서는 카메라, 동영상, 문자, 전화 같은 스마트폰 사용방법만 알면 터치 한번만으로 쉽게 접근해서 사용할 수 있다.
만약 각각의 카메라, 통화 같은 어플들을 사용하기 위해 내부적으로 어떻게 작동하는지 소비자가 알아야 한다면 사용 복잡도 때문에 정말 소수의 전문가들만 사용했을 것이다.
이제 예제 코드를 보면서 추상화 개념을 좀 더 명확하게 알아보자. 아래는 상품을 등록하고 구매 했을때 세금을 포함한 총 가격을 계산해주는 코드다.
// 추상화 된 상품 등록
const product = createProduct("phone", 1000);
// 추상화 된 총가격 계산
console.log(product.getPriceWithTax(10)); // 1100
createProduct()에 상품이름과 가격을 넣으면 상품이 등록이 되고 getPriceWithTax()에 세율을 넣으면 총 가격이 출력되는 것을 알 수 있다.
사용자 입장에서는 createProduct의 내부로직을 몰라도 결과값을 쉽게 얻어낼수 있기에 내부로직을 이해하지 못해도 상관 없다.
실제로 내부 로직을 까보면 아래와 같다.
// 내부 로직
function createProduct(name, price) {
return {
name,
price,
getPriceWithTax(taxRate) {
const tax = this.price * (taxRate / 100);
return this.price + tax;
},
};
}
실제로 내부로직을 보니 사용 방법에 비해 복잡한 로직으로 구현되어 있는 것을 알 수 있다.
즉 사용자는 추상적으로 메서드 동작을 가늠해 결과값만 받으며 되며 이는 곧 추상화의 기능을 이용한다라고 볼 수 있다.
우리는 이미 for, while문 같이 이미 추상화가 잘 되어 있는 문법을 프로그래밍 시작할 때부터 사용해왔다. 처음부터 프로그래밍 설계가 아닌 사용법을 배우고 시작하기에 추상화라는 개념이 어렵게 느껴진거 일수도 있다.
객체 지향은 설계 이론이지 사용 이론이 아니다
데이터 추상화란 공통된 특징으로 묶어 이름을 붙이는 것이라 생각하면 편하다.
예를 들어 아이폰이라는 객체를 추상화를 통해 객체 정보 분리를 하게 되면, 아이폰 => 휴대폰 => 통신기기 => 전자제품 순으로 추상화를 시킬 수 있다.
해당 추상화 사이클을 코드를 통해 정의해보도록 하자.
// 전자제품
class Electronics {
// 전원 기능
power() {
// Implementation
}
}
// 통신기기
class CommunicationDevice extends Electronics {
// 통화 기능
call() {
// Implementation
}
}
// 휴대폰
class MobilePhone extends CommunicationDevice {
// 카메라 기능
camera() {
// Implementation
}
// 게임기능
game() {
// Implementation
}
}
// 아이폰
class iPhone extends MobilePhone {
power() {
// Implementation
}
call() {
// Implementation
}
camera() {
// Implementation
}
game() {
// Implementation
}
// 애플 제품 연동 기능
appleProductIntegration() {
// Implementation
}
}
오직 아이폰 객체를 위해 다음과 같이 추상화하는건 비효율적으로 보여질 수 있지만, 만약에 기기의 종류가 다양해지게 되면 공통 기능을 미리 개발 해놓는 것 만으로 나중에 기능 상속을 통해 제품을 빠르게 확장 할 수 있다는 장점 있다.