Codong's Development Diary RSS 태그 관리 글쓰기 방명록
자료구조, 알고리즘 (1)
2021-01-24 16:54:03

자료구조

자료를 효율적으로 저장하는 방식

1) 메모리 저장 공간 절약, 프로그램 수행(실행) 시간 단축
2) 프로그램의 수행 시간 혹은 저장공간을 고려한 자료구조 설계
=> 프로그램의 목적 및 기능에 부합하는 자료구조 설계

※ c/c++을 사용하여 강의 하는 이유 포인터로 설명하기 위해
저급 프로그래밍 언어 : 이해하기 쉬워 빠르지만, 어려움 hardware, memory접근 가능
고급 프로그래밍 언어 : 사람이 이해하기 쉽게 작성 가독성 높고 다루기 간단

자료구조의 필요성

메모리를 어떻게 사용하면 좋을 것인가에서 시작하여, 이렇게 사용해보니 좋더라 와 같은 것들이 리스트, 트리 등등 가장 작은 단위인 변수들을 합쳐서 효율적으로 관리하기 위해 필요하다.

1)자료 구조의 분류

1) 단순 구조 : 프로그래밍 언어에서 제공하는 기본적인 데이터 타입 ex) 정수, 실수, 문자와 문자열 등

2) 선형 구조 : 자료들 사이의 앞뒤 관계가 일대일인 경우 ex) 리스트 스택 큐 덱

3) 비선형 구조 : 자료들 사이의 앞뒤 관계가 계층 구조 혹은 망 구조를 가지는 경우 ex) 트리 그래프 등

4) 파일 구조 : 보조기억장치(ex. 하드디스크)에 저장되는 파일에 대한 자료구조

2) 객체 구현

현실에 있는 물체, 또는 가상한 존재. 이를 객체(Object)라 정의하고 Class를 이용하여 프로그래밍에 옮겨 구현. 수치나 값에 대한 것은 클래스의 속성(Attribute)으로, 행동과 연산에 대한 것은 클래스의 메소드(Method)로 작성

3) 추상 과정

프로그래밍에 옮겨 구현. 자동차를 직접 코드에 넣을 수 없으니, 자동차에 대한 값들과 기능 및 수행 작업들을 머리 속에서 대강 코드에 어떻게 옮길지 구상. 이 과정에서 필요한 정보만 코드로 옮기는데 이 것을 추상화(Abstract)라고 봄.

4) 객체 구현 = 새로운 자료형 정의 ≠ 자료구조

자료구조는 데이터를 저장 및 관리 정돈(정렬)을 효율적으로 하기 위한 구성체를 만듭니다. 이를 위해 기본적으로 탐색, 삽입, 삭제 등의 연산이 들어갑니다. 대표적 자료구조는 파이썬 기본 자료형인 리스트.

노드

관리할 데이터를 보관(존재)하는 곳을 노드(Node)라 함. 대체로 자료구조를 공부할 때 이 노드를 클래스로 직접 구현한다. 하지만 자료구조에서 구조적 설계보다 연산(메소드)이나 연산으로 인한 구조적 변화에 학습을 집중해야될 때는 노드를 따로 구현하지 않는다.

추상 자료형

추상 자료형(Abstract Data Type, ADT)

  • 자료 구조를 기술(표현)하는 가장 대표적인 방법 중 하나 정보 은닉(information hiding)
  • 자료 구조를 사용할 수 있는 인터페이스(interface) 정의 혹은 자료구조의 연산(Operation)들의 정의
  • 내부 분석 없이 신속하게 자료구조를 이용가능
  • 개발자 관점에서 자료구조를 구현하기 전에 설계도를 미리 그려볼 수 있음.
class 클래스이름:
    # 클래스 생성자 정의
    def __init__(self, 인자1, 인자2):
        self.필요한속성1 = 인자1
        self.필요한속성2 = 인자2

    # 필요한 메소드 구현
    def 필요한메소드1(self):
        코드구현

    def 필요한메소드2(self):
        코드구현


# 메인 코드 영역

# 인스턴스 생성
c1 = 클래스이름(c1의 인자1,c1의 인자2)
c2 = 클래스이름(c2의 인자1,c2의 인자2)

# 메소드 사용하여 인스턴스 활용
c1.필요한메소드1()
c2.필요한메소드1()

파이썬은 기본적으로 인스턴스의 속성에 직접 접근을 허용한다. 이러한 접근 방법을 막아서 은닉화를 할 수 있다.

...

def __init__(self, Child_name, Child_height):
    self.__name = Child_name
    self.__height = Child_height

...

c1.__height+=10

# output
AttributeError: 'Child' object has no attribute '__height'

위와 같이 클래스에서 사용하는 속성 또는 메소드 앞에 __(언더바 2개)를 붙이면 외부에서 접근하여 사용할 수 없다. 비슷한 예로 클래스 생성자 메소드(__init__)이 있다. 이렇게 하면 속성에 직접 접근할 시 에러가 발생한다. 공개가 안되있으니 없는 속성이라는 메시지가 나온다.

reference