자료구조란?

자료구조는 데이터를 표현하고 저장하는 ‘방법’에 대하여 설명한다.

프로그램의 정의를 알고 있는가?

“데이터를 표현하고, 그렇게 표현된 데이터를 처리하는 것이다.” 라고 설명한다.

데이터의 표현은 데이터의 저장을 포함하는 개념이라고 보아도 되겠다. 이렇듯 ‘데이터의 저장’을 담당하는 것이 바로 자료구조이다.

자료구조라는 것을 넓은 의미에서 int형 변수도, 구조체의 정의도 자료구조에 속한다.

자료구조의 분류

  • 선형구조
    • 리스트
    • 스택
  • 비선형구조
    • 트리
    • 그래프
  • 파일구조
    • 순차파일
    • 색인파일
    • 직접파일
  • 단순구조
    • 정수
    • 실수
    • 문자
    • 문자열

보통 공부할 때는 선형구조와 비선형구조를 많이 공부하는 것 같다.

사실 실무 단계에서는 본인이 겪은 느낌으로도 알 수 있는 사실인데… 자료구조와 알고리즘을 직접 구현하여 사용하는 것은 많이 못 봤고, 검증된 라이브러리를 사용한다는 것이다. 사실 이러한 방법이 시간과 비용을 줄일 수 있는 아주 간단한 방법이다.

하지만 라이브러리를 잘 사용하기 위해서라도 자료구조를 아예 몰라도 된다고 장담할 수는 없을 것 같다. 같은 라이브러리를 쓰더라도 성능이나 코드 작성에 있어서 무의미한 차이가 날 수 있기 때문이다.

알고리즘과의 관계

자료구조가 ‘데이터의 표현 및 저장방법’을 뜻한다면, 알고리즘은 저장된 데이터를 대상으로 하는 ‘문제의 해결 방법’을 뜻한다.

예를 들어 아래와 같은 코드를 작성했다고 가정하자.

val list = listOf<Int>(1, 2, 3, 4, 5, 6, 7)

    var sum = 0
    
    for (item in list)
        sum += item

    println(sum)

위 코드는 ‘배열에 저장된 모든 값의 합을 구하는 알고리즘’ 이라고 할 수 있겠다. 이처럼 자료구조가 결정되어야 효율적인 알고리즘을 작성할 수 있듯이, 이 둘은 서로 의존적이다.

다른 예시를 들어보자.

크기가 50짜리인 배열에 저장되어있는 특정 값을 찾는다고 가정해보자(값은 정렬되어있다는 조건 하에). 이런 상황에서도 위 예제처럼 순차적으로 모든 인덱스를 뒤져 값을 찾을 것인가? 재수가 없어서 찾는 값이 맨 뒤에 있다면 불필요한 연산을 계속 하게 되는 것이다.

이처럼 자료구조와 알고리즘은 깊은 연관성을 가지고 있다.

앞으로 자료구조를 공부할 때 연관된 알고리즘도 함께 공부해야 되겠다.

마무리

간단한 설명으로는 자료구조가 되게 쉬워보이게 되는 착각을 하게 되는 것 같다.

하지만 수학적 요소가 은근히 많이 포함되어 있고 이 때문에 중간에 포기하지는 않을까 심히 걱정이 된다마는.. 차근차근 다시 공부해 볼 생각이다.


참고

윤성우의 열혈 자료구조