OOP의 추상화: 복잡성 숨기기

페달을 밟고 핸들을 돌려 자동차를 운전합니다. 연료 분사 방식이나 피스톤의 움직임을 이해할 필요는 없습니다. 자동차는 이러한 세부 사항을 사용자로부터 숨깁니다. 여러분은 그저 단순한 인터페이스를 사용할 뿐입니다.

소프트웨어도 마찬가지입니다.

이메일을 보내는 상황을 생각해 보세요. 여러분의 코드는 아마 다음과 같을 것입니다:

emailService.send(email);

단순해 보이지만, 이면에서는 시스템이 다음과 같은 많은 작업을 수행합니다:

이러한 단계를 일일이 볼 필요는 없습니다. 여러분은 그저 이메일이 전송되기만을 바라면 됩니다.

모든 단계를 노출하면 문제가 발생합니다. 모든 개발자가 다음과 같은 메서드를 수동으로 호출해야 한다고 상상해 보세요:

이는 코드를 취약하게 만듭니다. 만약 이메일 제공업체를 변경한다면, 앱의 모든 곳을 수정해야 합니다. 코드가 구현 방식에 강하게 결합(tightly coupled)되기 때문입니다.

추상화가 이 문제를 해결합니다.

추상화는 객체가 '무엇을 하는지'를 드러내고, '어떻게 하는지'는 숨깁니다. 사용자에게는 필요한 것만 보여줍니다.

사용자는 안정적인 인터페이스와 상호작용합니다. 사용자는 여러분의 인증 로직이나 재시도 전략에는 관심이 없습니다. 그러한 세부 사항은 숨겨진 상태로 유지됩니다.

많은 사람들이 추상화(Abstraction)와 캡슐화(Encapsulation)를 혼동합니다. 차이점은 다음과 같습니다:

캡슐화는 "누가 이 객체의 상태를 변경할 수 있는가?"를 묻습니다. 즉, 데이터를 보호합니다.

추상화는 "사용자에게 어떤 세부 사항을 보여줘야 하는가?"를 묻습니다. 즉, 복잡성을 숨깁니다.

이 둘은 함께 작동하여 더 나은 시스템을 구축합니다.

다음에는 상속(Inheritance)에 대해 논의하겠습니다. 동일한 코드를 두 번 작성하지 않고 공유된 동작을 처리하는 방법을 살펴보겠습니다.

출처: https://dev.to/ashay_tiwari_3658168ad5db/abstraction-in-oop-hiding-complexity-without-hiding-capability-1111