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

당신은 몇 가지 간단한 동작으로 자동차를 운전합니다. 가속 페달을 밟고, 핸들을 돌리고, 브레이크를 밟습니다.

연료가 엔진에 어떻게 들어가는지 알 필요는 없습니다. 피스톤이 어떻게 움직이는지, 기어가 어떻게 변속되는지 이해할 필요도 없습니다. 자동차는 이러한 세부 사항을 사용자로부터 숨깁니다. 당신은 복잡한 기계를 제어하기 위해 단순한 인터페이스를 사용합니다.

소프트웨어도 이와 동일하게 작동합니다.

이메일을 보내는 상황을 생각해 보세요. 당신은 단 하나의 명령을 호출합니다: emailService.send().

보이지 않는 곳에서는 많은 일이 일어납니다:

이러한 단계들을 볼 필요는 없습니다. 당신은 그저 이메일이 전송되기만을 원할 뿐입니다.

만약 추상화를 사용하지 않는다면, 코드는 다음과 같은 모습일 것입니다:

매번 이렇게 하는 것은 문제를 일으킵니다. 코드의 모든 부분이 너무 많은 것을 알게 되기 때문입니다. 만약 이메일 제공업체를 변경한다면, 메일을 보내는 모든 코드 라인을 일일이 수정해야 합니다. 시스템을 변경하기가 매우 어려워집니다.

추상화는 이 문제를 해결합니다. 객체가 '무엇을 하는지'는 보여주되, '어떻게 작동하는지'는 숨깁니다.

단순한 인터페이스를 노출합니다. 호출자는 작업에만 집중할 수 있고, 구현 세부 사항은 숨겨진 상태로 유지됩니다. 이를 통해 코드는 결합도가 낮아지고 유지보수가 쉬워집니다.

사람들은 종종 추상화(Abstraction)와 캡슐화(Encapsulation)를 혼동합니다.

캡슐화는 묻습니다: "누가 이 데이터를 변경할 수 있는가?" 이는 내부 상태를 보호합니다. 추상화는 묻습니다: "사용자가 어떤 세부 사항을 볼 필요가 있는가?" 이는 복잡성을 숨깁니다.

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

다음으로 상속(Inheritance)에 대해 살펴보겠습니다. 우리는 한 가지 질문에 답할 것입니다: "만약 객체들이 동작을 공유한다면, 같은 코드를 두 번 작성해야 할까요?"

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