본문 바로가기
IT 공부/공부하며 드는 의문들

배열에 대해.. 자료 구조와 알고리즘 구조가 같아야 할까?

by exdus3156 2023. 11. 27.

배열(Array)은 대부분의 프로그래밍 언어가 지원하는 기본 데이터 타입으로, 같은 형식의 데이터를 인덱스를 통해 임의 접근(random access) 할 수 있는 자료구조다.

프로그래밍 언어를 배우는 초창기에 배열에 대해 학습하기 때문에 개발자에게 너무나 친숙한 자료구조이고, 조금만 훈련하면 누구나 쉽게 배열을 사용할 수 있다.

하지만 약간은 생각해볼 거리가 있다. 왜냐하면 자료구조와 알고리즘 구조가 같아야 한다는 코딩 원칙을 지켜야 한다면, 배열이 어떻게 사용될 것인지 고려해 볼 법한 요소가 있기 때문이다.

for (int i = 0; i < arr.length; i++) {
    //...
}

 

위 예제에서 arr을 도대체 어떻게 선언해야 하는 것이 좋을까? 너무나 습관적으로 배열을 선언할 수도 있고, 전혀 문제될 것은 없어 보인다.

하지만 예제의 알고리즘은 데이터 세트에 대해 순차적으로 접근하고 있을 뿐이다. 

그렇다면 배열과 같이 인덱스를 통해 접근하는 구조는 과하지 않을까? 배열은 인덱스를 키로 삼아 자유로운 random access가 가능한 구조인데 그러한 요소를 활용하지 않으니까 말이다..

그렇다면 아래 예제로 바꾸는 것은 어떨까?

for (int number : numbersList) {
    //...
}

 

위 코드는 불필요한 인덱스 계산이 필요하지 않다. 예제의 제어구조가 데이터를 순차 접근하는 정도로 만족하기 때문에 굳이 배열로 만드는 것보다 리스트를 활용해 순차 접근을 취하면 가독성이 좋아지는 것 같다.

하지만 어디까지나 내 개인적인 생각일 뿐이다. 나는 자료구조와 알고리즘의 제어구조가 일치해야 한다고 보는 관점에 더욱 끌리는 편이다. 하지만 협업하는 다른 개발자가 어떻게 생각할지는 잘 모르겠다...

 

<코드 컴플리트> 책을 보면, 어떤 연구자들은 기본 데이터 타입으로서 편의성이 좋은 배열을 사용하되, 인덱스를 통한 임의 접근 코드를 작성하는 것을 지양하라고 말한다.

하지만 나는 배열이 index를 통한 임의 접근을 혀용하는 것이 배열의 본질이라고 생각한다. 인덱스로 임의 접근하는 연산을 제공하는데도 그것을 피해야 한다고 따로 원칙을 정하고 문서화해서 팀 모두가 지키도록 만드는 것은 올바르지 못한 원칙이라고 생각한다.

그럴 바에는 차라리 리스트나 스택처럼 처음부터 임의 접근이 불가능한 자료구조를 사용하는 것이 논리적으로 앞뒤가 맞다고 생각한다.

자료구조란 단순히 메모리에서 데이터가 어떻게 배치되었는지 파악하는 것이 아니라, 그 자료구조가 어떤 형태의 연산을 허용하는지, 그래서 어떤 제어구조를 허용하는지와도 관련있다.