본문 바로가기
Computer Science/컴퓨터공학(김용담 강사님)

추상 자료형(ADT)이란? 개념과 특징

by 코듀킹 2023. 4. 5.

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

추상 자료형을 설명하기 전에 우선 추상화(Abstraction)가 무엇인지 알아보겠습니다.(추상화는 참고로, 컴퓨터 사고력 파트에서 나오는 개념입니다.) 추상화란, 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내고, 그것을 수치화 하는 것을 뜻합니다. 즉, 문제에서 해결해야할 주요한 정보를 수치화 하는 과정이죠.

 

예를 들어, 쇼핑몰 사이트를 만든다고 가정해보겠습니다. 쇼핑몰 사이트에서는 고객 정보, 판매 정보 등이 필요하겠죠? 이 때, 고객 정보에는 아이디, 비밀번호, 주소, 전화번호, 구매목록, 직장, 자산 등이 포함될 수 있습니다. 여기에서 쇼핑몰 사이트에서의 고객 정보로 불필요한 세부사항인 직장, 자산 같은 정보는 제거하고, 핵심적인 정보만 간추린 다음 이 정보들을 계산가능한 형태로 수치화하는 것을 추상화라고 할 수 있죠.

 

그리고 자료형(Data Types)에 대한 설명은 앞서 '기본 프로그램 개념'을 설명한 포스팅에서 언급한 바가 있죠. 

 

기본 프로그래밍 개념: 언어, 변수, 자료형, 연산자, 제어구조, 함수, 모듈

목차: 기본 프로그래밍 개념(Basic Programming Concepts) 1. 프로그래밍 언어(Programming Language) 2. 변수(Variables) 3. 자료형(Data Types) 4. 연산자(Operators) 5. 제어구조(Control structures) 6. 함수(Funtions) 7. 모듈(Module

coduking.tistory.com

 

그렇다면, 추상 자료형(Abstract Data Type)은 무엇일까요? 추상적으로 정의된 자료형, 즉 프로그래밍을 함에 있어 데이터를 추상화하여 논리적인 구조를 정의한 것입니다. 

 

예를 들어 RPG 게임을 만들 때, 케릭터들의 실제로 움직이게 하려면, 그걸 프로그램으로 짜야합니다. 케릭터 와 아이템같은 것들의 컨셉을 어떻게 하나하나 다 만들까라는 의문이 생기죠. 게임의 케릭터라는 하나의 컨셉에 존재하는 여러가지 개념(공격을 한다, 물약을 먹는다 등)들이 있는데, 그 개념을 통해 움직임을 구현하려면 하나하나의 개념들이 컴퓨터가 연산할 수 있는 형태로 바뀌어야합니다. 연산할 수 있는 형태가 된다는 것은 변수나 데이터들이 연산가능한 자료형(Data type)으로 정의되어야한다는 것인데, 자료형은 프로그래밍 언어가 정의될 때 함께 정의가 됩니다. 즉, 정해져 있습니다.(int, str, float 등)

 

이 때, 케릭터를 새로운 자료형으로 컨셉을 정의하고 싶은데, 기존의 자료형과 1대1 매칭이 안되죠. 그래서 프로그래밍 언어들은 그런 새로운 컨셉을 만들고 싶을 때, 새로운 자료형으로 만들 수 있도록 여러가지 기능을 제공합니다. 그런식으로 실제 존재하는 개념을 내가 원하는 자료형으로 만드는 것을 추상 자료형(ADT)라고 합니다. 실제 개발에서는 명세를 작성할 때, 어떤 것들을 ADT로 만들지 정의를 합니다.

 

이를 코드로 구현하면서 이야기해보겠습니다. 예를들어, 파이썬으로 아래와 같이 문자형 자료형인 'str'를 활용하여 전화번호를 입력한다고 가정해보겠습니다. 그러면 phone_number라는 변수에는 '010-1234-5678'라는 '문장 자료형'의 값이 들어가게 됩니다. 

phone_number = str('010-1234-5678') 
# 설명의 편의를 위해 str()까지 입력했다. 
# 실제 파이썬에서는 그냥 '010-1234-5678'만 써도 된다.
print(phone_number) # 010-1234-5678 출력
print(type(phone_number) # <Class 'str'> 출력

print(number)로 출력하면, 010-1234-5678이라는 문장이 출력되고, print(type(phone_number)을 쓰면, <Class 'str'>이 출력되는 것을 볼 수 있죠.

 

추상자료형

 

그러면 이번에는 추상 자료형(ADT)을 활용하여 전화번호를 입력해보겠습니다. 파이썬에서는 추상 자료형을 만들 때, 주로 Class문을 사용합니다. '사람(Person)'이라는 컨셉의 추상 자료형을 만들고, 그 안에 들어가야할 핵심 정보가 '이름'과 '전화번호'이며, '인사하다(greet)'라는 개념이 존재한다고 가정해보겠습니다. 

class Person:
    def __init__(self, name, phone_number):
        self.name = name
        self.phone_number = phone_number
    
    def greet(self):
        print(f"안녕하세요, 제 이름은 {self.name}이고, 폰 번호는 {self.phone_number}입니다.")

person1 = Person("코듀킹", '010-1234-5678')
person2 = Person("홍길동", '메롱')

person1.greet() # "안녕하세요, 제 이름은 코듀킹 이고, 폰 번호는 010-1234-5678입니다." 출력
person2.greet() # "안녕하세요, 제 이름은 홍길동 이고, 폰 본호는 메롱입니다." 출력 !?

print(type(person1)) # <Class '__main__.person'> 출력
더보기

위의 코드에서, Person 클래스는 name과 age 두 가지 속성(attribute)을 가지고 있습니다. 클래스의 속성은 클래스 변수로 정의됩니다.클래스 내부에 정의된 __init__ 메소드는 생성자(constructor)입니다. 생성자 메소드는 객체가 생성될 때 호출되며, 객체의 속성을 초기화합니다. 생성자 메소드는 self 매개 변수를 사용하여 클래스 속성에 접근합니다.

 

greet 메소드는 Person 클래스의 인스턴스에서 호출할 수 있습니다. greet 메소드는 해당 인스턴스의 name과 age 속성을 사용하여 해당 객체의 인사말을 출력합니다. 위의 코드에서 person1과 person2는 Person 클래스의 두 개의 객체입니다. person1과 person2는 각각 name과 age 속성을 가지고 있으며, greet 메소드를 호출할 수 있습니다.

 

이러한 방식으로, 클래스와 객체를 사용하여 여러 개의 데이터 및 관련 동작을 그룹화하고 조직화할 수 있습니다. 이것은 프로그래밍에서 코드의 유지 보수성과 재사용성을 높이는 데 도움이 됩니다.

 

이처럼 추상 자료형도 일반적인 자료형과 같이 실제로 본인만의 자료형(Data type)을 가지게 됩니다. 실제로 위 코드를 실행시켜보면, 아래와 같은 결과가 나옵니다. 

 

 

 

추상 자료형(ADT)의 특징

추상 자료형(ADT)에서는 기능들에 대한 세부적인 구현에 대해서는 이야기 하지 않습니다. 우리가 인스타그램을 사용할 때, 피드를 올리는 기능의 세부적인 구현 방법, DM을 보내는 세부적인 구현 방법에 대해서 알지 않아도 되는 것처 말이죠. 또는 자판기를 사용할 때 돈을 넣고 버튼을 누르면, 음료수가 나오는 기능의 세부적인 구현 방법을 알지 않아도 자판기를 사용할 수 있는 것처럼 말이죠. 

 

이처럼 추상 자료형(ADT)을 생성할 때는 사용자로 하여금, 그 안에 들어가는 세부적인 구현 방법을 알지 않아도 기능을 사용할 수 있게끔 만들어야합니다. 그래서 추상 자료형을 설계하는 사람들은 보통 10년 이상의 개발자, 시스템 이키텍트 분들이 만들게 되죠.

 

추상자료형을 사용하면, 데이터에 대한 정보를 이해하고 저장하는 방식을 결정함으로써 최적의 알고리즘을 개발할 수 있다는 장점이 있습니다. 또한, 프로그래밍을 효율적으로 구현할 수 있도록 도와줍니다. 여기까지 추상 자료형(ADT)이 무엇인지 그 개념과 특징에 대해서 알아보았습니다.

댓글