- 구현을 몰라도 기능만 알면 사용할 수 있게 해주는 것, 코드를 재활용하고 협업할때 중요!
- 추상자료형을 생각하면 코드의 흐름에 집중 할 수 있다.
기능을 나열해놓음
각 연산을 어떻게 할지에 대하여 묶어논 개념, 구체적으로 구현까지 포함한 내용
자료구조 (동적배열 과 링크드리스트) 두가지를 모두 사용하여 구현을 가능하다. 그럼 둘중 무엇을 사용해야될까?
상황에 따라 다르지만 추상 자료형은 어떤 기능을 생각하냐에 따라서 프로그램의 큰 틀을 잡는데에 있어서 구현보다 조금더 쉽다는 장점이 있다.
사실 우리는 프로그래밍할 때 말고 실생활에서도 많은 물건들이나 개념들을 추상화해서 사용합니다. 남녀노소 누구나 가지고 있는 “핸드폰”도 추상화의 한 예시인데요.
“핸드폰”이라는 개념을 어떻게 정의할 수 있을까요? 주변을 보면 핸드폰인 많은 물건들은 있지만 딱 “핸드폰은 X다”라고 하기 쉽지가 않습니다. 한 번 핸드폰의 가장 기본적인 기능들을 정리해서 핸드폰이 뭔지 간단하게 정의해볼게요.
핸드폰은:
특징
전기선 없이 이곳저곳 들고 다닐 수 있다
행동
전화를 걸 수 있다
전화를 받을 수 있다
문자 메시지를 보낼 수 있다
문자 메시지를 받을 수 있다
이런 기능들을 갖는 것입니다. 핸드폰이 뭔지 물어봤을 때 딱 정확히 손가락으로 가리켜서 “이거다”라고 하기는 힘들지만 “저 기능들을 갖는 어떤 것이다”라고는 얘기할 수 있는 거죠.
조금 다르게 생각해보면 저 기능들을 갖는 존재들을 다 핸드폰이라고도 할 수도 있습니다. 기술적으로 어떻게 구현했는지는 기계가 핸드폰인지 아닌지와 전혀 상관이 없습니다. 그러니까 핸드폰은 구현은 없고 기능으로만 정의한 개념인 추상 자료형과 비슷한 거죠.
추상 자료형을 핸드폰에 비유할 수 있으면, 자료 구조는 뭐에 비유할 수 있을까요? 자료 구조는 핸드폰의 기능들을 가지고 있는 기계 모델들에 비유할 수 있습니다.
아이폰 6s, 삼성 갤럭시 S10, LG v50 이렇게 특정 방식에 의해서 전화와 문자를 보내거나 받을 수 있는 것들이 자료 구조에 해당하는 거죠.
실제로 어떤 모델 또는 회사인지에 따라 부수적으로 갖는 기능들도 다를 수도 있고 전화를 거는 구체적인 방식이 모두 다를 수는 있긴 합니다. 하지만 핸드폰의 모든 기능들을 모두 갖고 있습니다. 실질적으로 “핸드폰”의 기능을 모두 할 수 있으면, 그러니까 핸드폰을 “구현”하고 있으면 핸드폰이라고 부르고 사용할 수 있는 거죠.
여러분들은 평소에 여러분의 핸드폰에 대해 어떤 식으로 얘기를 하시나요? “내 핸드폰 어딨지?”, “너 핸드폰 번호 뭐야?” 이런 식으로 실제 사용하는 핸드폰의 모델명 대신, 추상화해서 핸드폰이라고 표현하면서 사용하는 경우가 많을 텐데요. 물론 “내 갤럭시 S10” 어딨지 이런 식으로 구체적인 모델 이름을 사용해도 틀린 건 아니지만 일반적으로 그렇게 얘기하지는 않죠?
추상 자료형의 개념도 똑같습니다. 추상 자료형 리스트에 대해서 생각해봅시다.
특징
데이터 사이 순서 관계를 유지할 수 있다
연산
접근 연산: 특정 위치에 있는 데이터를 가지고 오거나 수정할 수 있다
탐색 연산: 특정 조건을 만족하는 데이터를 찾을 수 있다
삽입 연산: 특정 위치에 새로운 데이터를 저장해줄 수 있다
삭제 연산: 특정 위치에 데이터를 지울 수 있다
핸드폰이라는 추상적인 개념과 똑같이 이런 특징과 연산들을 가지는 존재를 “리스트”라고 부르는 겁니다. 여러분들이 핸드폰을 찾을 때 “내 핸드폰 어딨지“ 이런 식으로 얘기하는 것처럼, 데이터를 저장하고 사용할 때도 “리스트를 사용해야겠다!”이런 식으로 추상적으로 얘기할 수 있는 거죠.
추상 자료형과 자료 구조는 뭐가 더 중요한 건 없습니다. 그냥 서로 다른 개념이죠. 기능을 중점적으로 얘기하고 싶을 때나, 흐름을 생각할 때와 같이 구현에 집중할 필요가 없을 때 추상 자료형을, 그리고 코드의 성능을 분석하거나 최적화 시켜야 될 때나 (성능을 최대로 끌어올리고 싶을 때) 자료 구조를 중심적으로 생각하면 됩니다.
핸드폰이라는 개념과 단어가 우리한테 굉장히 중요하고 널리 쓰이는 거 만큼, 정확히 어떤 핸드폰을 쓰는지, 그러니까 아이폰 6s, 삼성 갤럭시 S10, LG v50 중에 어떤 모델을 쓰는지도 많은 사람들한테 굉장히 중요합니다.
그러니까 아이폰 6s보다는 아이폰 11 pro가 훨씬 빠르고, LG v50는 화면이 두 개고, 삼성 갤럭시 노트는 화면이 크고… 이런 구체적인 핸드폰의 세부 구현들도 핸드폰이라는 개념만큼 중요하다는 말이죠.
컴퓨터 과학을 공부하는 우리에게 추상 자료형들과 자료 구조들의 개념이 모두 중요한 거랑 비슷하죠.