내가 이해하고 받아들였던 추상화란 '핵심의 요약'이었다.
그래서 추상화를 이해하고 난 뒤 "강의를 정말 잘하는 사람은 추상화를 잘하는 사람이었구나"라는 생각을 하게 되었다.
하지만 추상메서드를 보면서 난 또 고민에 빠진다.
핵심을 잘 요약해 주는 강의를 보고 나면 이해가 쏙쏙 되는데..
"왜 추상메서드는 봐도 아무런 이해가 안 되는 거지?"
추상화는 복잡한 시스템에서 중요한 부분을 강조하고, 불필요한 세부 사항을 숨김으로써, 개발자가 좀 더 쉽게 이해하고 관리할 수 있도록 하는 과정이라 한다. 이는 코드를 더 간결하고, 유지보수하기 쉽고, 재사용 가능하게 만든다.
예를 들어, 자동차를 추상화한다면, 자동차의 엔진, 변속기, 브레이크와 같은 핵심 기능에 초점을 맞추고, 각 부분의 복잡한 내부 메커니즘은 숨긴다.
이렇게 함으로써, 나는 자동차를 '운전하는 방법'에 대해서만 생각하면 되고, 자동차가 어떻게 내부적으로 작동하는지에 대한 복잡성은 신경 쓰지 않아도 된다.
즉, 추상화는 복잡성을 관리하는 방법이라 한다. 이를 통해 중요한 부분에 초점을 맞추고, 불필요한 세부 사항으로부터 주의를 분산시키지 않도록 해준다. 그러나 나는 추상메서드를 보면서 다시 깊은 고민에 빠진다.
"메서드의 선언부만 살려놓은 걸 보면 핵심의 요약은 시도한 것 같은데.. 왜 구현부는 다 비워둔 거지?,
추상메서드.. '추상'이라는 단어가 붙었으니 당연히 내가 배운 추상화가 맞을 텐데.."
나는 그동안 추상메서드의 구현부가 비어있어도 사용하는데 크게 문제 없으니, 정작 본질인 왜 '핵심 요약의 제목'만 추상화하고 '핵심 내용'은 빠져있는지를 생각해보지 않았던 것이다.
자, 문제를 해결하기 위해서 써치해보자.
인터페이스에서 추상메서드를 사용하는 이유는?
내가 궁금해 하는 핵심 내용의 구현(구현부 코드 작성)을 강제하기 위해서란다.
어? 여기서 느낌이 오기 시작한다.
"그럼 컴퓨터는 핵심 내용이 빠진 걸 올바른 추상화라고 이해한다는 것 같은데?"
느낌이 오던 찰나에 "다양한 구현을 추상화된 인터페이스의 뒤에 숨긴다"는 GPT 형님의 추가 답변을 보고 확신했다.
그럼, 마지막으로 위에서 추상화의 예로 적어둔 자동차 설명과 다시 비교해 보자.
자동차 추상화란?
1. 자동차의 핵심 기능에만 초점을 맞춘다.
2. 나는 '운전하는 방법'만 생각하면 된다.
3. 자동차의 복잡한 내부 작동은 신경 쓰지 않아도 된다.
이 세 가지가 "다양한 구현을 추상화된 인터페이스의 뒤에 숨긴다"와 딱 들어맞는다.
1. 추상메서드의 핵심 기능을 선언부에만 초점을 맞춘다.
2. 사용자는 '메서드의 호출 방법'만 생각하면 된다.
3. 추상메서드의 복잡한 구현 내용은 신경 쓰지 않아도 된다.
But 사용자 입장일 뿐, 개발자는 신경 써야지.
컴퓨터는 자기만의 기준으로 올바른 추상화를 하고 있었다.
나는 당연히 메서드의 구현부도 핵심 요약의 일부이니 포함 되어야 한다고 생각했으나, 컴퓨터의 기준은 구현부가 핵심 요약의 일부가 아닌 것이었다. 단순히 프로그램의 내부 기능으로써 자신이 처리해야 할 부분으로 인식하나보다.