Nice programing

객체 지향 프로그래밍에서 추상 데이터 유형은 무엇입니까?

nicepro 2020. 11. 30. 19:53
반응형

객체 지향 프로그래밍에서 추상 데이터 유형은 무엇입니까?


객체 지향 프로그래밍에서 추상 데이터 유형은 무엇입니까? 이 주제에 대해 위키를 살펴 보았지만 아직 명확하지 않습니다. 누군가 명확히 할 수 있습니까?


추상 클래스는 일반화 된 개념이다. 상속을위한 기본 클래스로만 사용하고 개체를 인스턴스화하지 않기 위해 만든 클래스입니다.

그리고 추상적 인 데이터 타입 ( ADT는 ) 반드시 OOP의 개념이 아니다. 구현을 설명하지 않고 기능 측면에서 예를 들어 Stack 및 Queue의 개념을 설명하는 것은 이전 용어입니다.


" 추상 데이터 유형 "과 " 추상 클래스 " 사이에는 차이가 있습니다 .

추상 클래스 가 정의하는 모든 방법에 대한 정의가 없을 수입니다. 따라서 추상 클래스를 직접 인스턴스화 할 수 없습니다. 서브 클래스를 생성 한 다음 인스턴스화해야합니다.

추상 데이터 타입 A는 모델 예 데이터 구조의 특정 종류의 스택 . 스택에는 push () 및 pop () 작업이 있으며 잘 정의 된 동작이 있습니다.

ADT (추상 데이터 유형) 자체 는 특정 프로그래밍 언어 또는 패러다임의 특정 구현이 아니라이 모델을 참조합니다 . 객체 지향 언어로 스택을 구현할 수 있지만 함수형 프로그래밍 언어로 구현할 수도 있습니다.

ADT를 사용하면 ADT의 모든 올바른 구현을 유지하는 스택, 큐 등의 속성에 대해 토론 할 수 있습니다.


글쎄, 그것은 모두 추상화 에 관한 것 입니다. 추상화는 프로그래밍에서 특히 유용합니다. 주요 이점은 실현 세부 정보를 숨기는 기능입니다. 하나의 모듈 (소위 "서버 모듈") 내에 숨기고 다른 모듈 (소위 "클라이언트 모듈")에 대한 공용 인터페이스를 제공합니다. 이제 세 가지 가능성이 있습니다.

서버 모듈은 ADS (추상 데이터 구조) 자체를 제공 할 수 있습니다 .

이 경우 ADS 엔티티 자체가 포함됩니다. 공용 인터페이스는 일부 프로 시저 (및 일부 상수)로 구성됩니다.

서버 모듈 (stack_ads.h)의 인터페이스 :

#ifndef STACK_ADS
#define STACK_ADS

const int capacity = 10;

void clear();
int size();
int pop();
void push(int value);

#endif STACK_ADS

구현 (stack_ads.cpp) :

#include "stack_ads.h"

int items[capacity];
int top = -1;

void clear()
{
  top = -1;
}

int size()
{
  return top + 1;
}

int pop()
{
  top -= 1;
  return items[top + 1];
}

void push(int value)
{
  top += 1;
  items[top] = value;
}

클라이언트 모듈 (main.cpp)에서 서버 모듈을 가져 와서 데이터 구조를 직접 사용합니다.

#include <iostream>
#include "stack_ads.h"

int main (int argc, char* const argv[]) 
{
  push(1);
  push(2);
  push(3);

  std::cout << pop() << std::endl;
  std::cout << pop() << std::endl;
  std::cout << pop() << std::endl;

  return 0;
}

서버 모듈 은 struct / record 형식으로 ADT (추상 데이터 유형)를 제공 할 수 있습니다 .

클라이언트 모듈에서 변수를 해당 유형으로 선언 할 수 있습니다. 모듈은 둘 이상의 변수를 내 보낸 유형으로 자유롭게 선언 할 수 있으므로 둘 이상의 데이터 구조를 가질 수 있습니다. 각 추상 데이터 구조는 추상 데이터 유형의 변수입니다.

인터페이스 (stack_adt.h) :

#ifndef STACK_ADT
#define STACK_ADT

const int capacity = 10;

typedef struct
{
  int items[capacity];
  int top;
} StackADT;

void clear(StackADT* stack);
int size(StackADT* stack);
int pop(StackADT* stack);
void push(StackADT* stack, int value);  

#endif STACK_ADT

구현 (stack_adt.cpp) :

#include "stack_adt.h"

void clear(StackADT* stack)
{
  stack->top = -1;
}

int size(StackADT* stack)
{
  return stack->top + 1;
}

int pop(StackADT* stack)
{
  stack->top -= 1;
  return stack->items[stack->top + 1];
}

void push(StackADT* stack, int value)
{
  stack->top += 1;
  stack->items[stack->top] = value;
}

클라이언트 모듈 :

#include <iostream>
#include "stack_adt.h"

int main (int argc, char* const argv[]) 
{
  StackADT stack1;
  StackADT stack2;
  stack1.top = -1;
  stack2.top = -1;

  push(&stack1, 1);
  push(&stack1, 2);
  push(&stack1, 3);

  std::cout << pop(&stack1) << std::endl;
  std::cout << pop(&stack1) << std::endl;
  std::cout << pop(&stack1) << std::endl;

  push(&stack2, 10);
  push(&stack2, 20);
  push(&stack2, 30);

  std::cout << pop(&stack2) << std::endl;
  std::cout << pop(&stack2) << std::endl;
  std::cout << pop(&stack2) << std::endl;

  return 0;
}

마지막으로 서버 모듈 class 형식으로 ADT (추상 데이터 유형)를 제공 할 수 있습니다 .

언어가 OOP를 지원하는 경우 클래스를 통해 ADT를 설명 할 수 있습니다. 그리고 다시 한 번 클라이언트 모듈에서 변수를 해당 유형으로 선언 할 수 있습니다. 객체 지향 용어에서는 유형을 클래스 라고하고 해당 유형의 변수를 객체 라고 합니다 .

서버 모듈 인터페이스 (Stack.h) :

#ifndef STACK
#define STACK

const int capacity = 10;

class Stack
{
public:
  Stack();
  void clear();
  int size();
  int pop();
  void push(int value);
private:
  int items[capacity];
  int top;
};

#endif STACK

구현 (Stack.cpp) :

#include "Stack.h"

Stack::Stack()
{
  this->top = -1;
}

void Stack::clear()
{
  this->top = -1;
}

int Stack::size()
{
  return this->top + 1;
}

int Stack::pop()
{
  this->top -= 1;
  return this->items[this->top + 1];
}

void Stack::push(int value)
{
  this->top += 1;
  this->items[this->top] = value;
}

마지막 두 옵션의 차이점은 다음과 같습니다.

  • 위에서 언급 한 용어 (유형 <-> 클래스, 변수 <-> 개체).
  • 비 클래스 ADT에서 모든 프로 시저의 형식 매개 변수 목록에는 Stack 유형의 변수 s가 포함되어야합니다. 스택 클래스에서 데이터 구조 s의 사양은 프로 시저 이름 다음의 다른 형식 매개 변수에 포함되지 않지만 프로 시저 이름 앞에 괄호로 묶여 있습니다. 절차 이름을 수신자 라고 부르기 전에 스몰 토크 용어 형식 매개 변수를 사용합니다 .
  • 절차의 위치. 비 클래스 ADT에서 프로시 저는 Stack 구조체 외부에 있습니다. 수업에서 절차는 수업 내에 있습니다. 객체 지향 용어에서 수신자가 있으므로 클래스 유형 내에 포함되는 프로 시저를 메소드 라고 합니다 .

클라이언트 코드 :

#include <iostream>
#include "stack.h"

int main (int argc, char* const argv[]) 
{
  Stack stack1;
  Stack stack2;

  stack1.push(1);
  stack1.push(2);
  stack1.push(3);

  std::cout << stack1.pop() << std::endl;
  std::cout << stack1.pop() << std::endl;
  std::cout << stack1.pop() << std::endl;

  stack2.push(10);
  stack2.push(20);
  stack2.push(30);

  std::cout << stack2.pop() << std::endl;
  std::cout << stack2.pop() << std::endl;
  std::cout << stack2.pop() << std::endl;

  return 0;
}

추상 데이터 유형 (ADT)은 데이터 유형의 수학적 모델입니다. 데이터에 대해 수행 할 수있는 연산과 방정식을 사용하는 연산의 수학적 정의를 설명합니다.

예를 들어, pop (), push (), top ()과 같은 연산과 빈 스택을 나타내는 상수 기호를 사용하여 완벽하게 추상적으로 숫자 스택의 동작을 모델링 할 수 있습니다.

예를 들어 다음은 숫자 스택 정의의 일부를 구성 할 수있는 몇 가지 방정식입니다.

pop(empty) = empty  // silently ignores popping an empty stack
pop(push(N,S)) = S  // i.e. pop removes the top element of push(N,S)
top(push(N,S)) = N  // return topmost element of the stack without changing the stack

추상 데이터 유형은 객체 모델의 클래스와 전혀 동일하지 않습니다.

중요한 개념의 이름은 다음과 같습니다. 초기 대수 의미론, 동 형사상, 몫, 합동

추상 데이터 유형의 요점은 방정식과 각 구현이 "동형"임을 보여주는 멋진 수학을 사용하여 등가 유형 표현의 전체 클래스의 동작을 이해하는 것입니다. 걱정.

이것에 대한 wikipedia 항목은 꽤 좋습니다 : http://en.wikipedia.org/wiki/Abstract_data_type

다음은 ADT가 무엇인지를 보여주는 좋은 (그러나 매우 이론적 인) 코스 노트입니다. http://www-compsci.swan.ac.uk/~csulrich/ftp/adt/adt.pdf

일부 객체 지향 프로그래밍 언어의 "클래스"개념과 표면적으로 유사하지만 "클래스"는 ADT가 아니지만 특정 ADT를 구현하는 데 클래스를 사용할 수 있습니다.

일반적으로 ADT 개념은 모든 객체 지향 프로그래밍 언어가 클래스를 가지고 있지 않고 ADT 스타일 사고가 덜 효과적인 OO 디자인을 생성하기 때문에 객체 지향 프로그래밍보다 함수형 프로그래밍에 더 적용 할 수 있습니다.

  • 다음은 OO 언어의 ADT 관점에서 사고의 문제를 보여주는 논문입니다. http://portal.acm.org/citation.cfm?id=74885
  • 기본적으로이 문서는 ADT를 구현하는 데 사용하는 "클래스"가 몇 가지 강력한 고추 상 메서드가 아닌 아주 작은 메서드 (ADT 방정식의 기초처럼 보이는)로 끝나는 것을 보여줍니다.

정의:

대략적으로 말하면, ADT ( Abstract Data Type )는 데이터 구조를 보는 방법입니다. 데이터 구조 는 무엇을하는지에 초점을 맞추고 작업 방식을 무시합니다 .

추상 데이터 유형은 주로 해당 인터페이스, 즉 수행 할 수있는 허용 가능한 작업에 의해 정의됩니다. 이를 구현하는 데 사용되는 기본 메커니즘은 일반적으로 사용자에게 표시되지 않습니다.


예 :

Stack, Queue그리고 PriorityQueue그들이 말하는 배열, 연결리스트 및 다른 많은 데이터 저장 구조보다 더 추상적이다는 ADT를의 예제의 일부입니다.

예를 들어 스택의 기본 메커니즘은 Array이거나 LinkedList. A에 대한 근본적인 메커니즘은 PriorityQueue될 수 있습니다 Array또는 나무의 특별한 종류는라고 Heap.


암호:

다음은 PriorityQueueHeap을 사용하여 구현 된 라는 추상 데이터 유형의 Java 예제입니다 .

class Heap {
  private Node heapArray[];
  public void insert(Node node) {...}
  public Node remove() {...}
}

class PriorityQueue {
  private Heap heap;
  public void insert(Node node) { 
    heap.insert(node);
  }
  public Node remove() {
    return heap.remove();
  }
}

여기에서 PriorityQueue클래스에 대한 메서드가 기본 Heap클래스에 대한 메서드를 단순히 감싸는 것을 볼 수 있습니다 . 마찬가지로 삽입 및 제거와 같은 작업을 처리하기 위해 더 많은 코드가 필요한 경우에도 동일한 기능을 구현하는 Array대신 사용할 수 있습니다 . 이 예제는 a 가 힙, 배열 등을 사용하여 다양한 방식으로 구현할 수있는 ADT라는 것을 개념적으로 명확하게해야합니다 .HeapArrayPriorityQueue

ADT는 객체 지향 프로그래밍 (OOP) 언어에서 더 의미가 있지만 OOP 언어에만 국한되지 않으며 비 OOP 언어를 사용하여 만들 수도 있습니다.



학교에서 그들은 ADT가 데이터 모음과이 데이터를 인수 할 수있는 일련의 작업을 포함하는 그룹이라고 가르쳐주었습니다. 그것은 단지 아이디어를 언급하고, 어떤 언어, 구현, 패러다임과도 관련이 없습니다.

업데이트 됨 :
따라서 질문을 다시 읽고 이에 따라 mi 정의에 따라 OOP의 추상 데이터 유형은 데이터 (속성, 필드 등) 및 작업 (메소드)을 포함하기 때문에 상속 여부에 관계없이 클래스 추상화 여야합니다.

문안 인사


초록은 프로그래밍과 실제 생활에서 가장 기본적이고 일반화 된 개념입니다.

객체 지향 프로그래밍에서 추상 데이터 유형은 무엇입니까?

ADT는 사양이있는 다양한 유형의 객체를 보유하는 컨테이너입니다. 데이터의 논리적 표현 (즉, 인터페이스 또는 프로토콜) 및 데이터의 구성 요소를 조작하는 작업.

ADT의 예 : 목록, 맵, 세트, ​​스택, 대기열, 트리, 그래프.

데이터 구조는 하나 이상의 특정 추상 데이터 유형 (ADT)을 구현할 수 있습니다. 예를 들어 Java에서 ArrayList, LinkedList, Stack 및 Vector는 List의 데이터 구조 구현 (클래스)입니다.

실생활에서의 스택 예시 :

  1. 사람이 마모되면 팔찌 착용 마지막 팔찌는 제거 할 첫 번째는 첫 번째 팔찌는 제거 할 마지막이 될 것입니다. 이것은 스택의 후입 선출 (LIFO) 원칙을 따릅니다.
  2. 접시 더미 에서 한 번 상단에서 접시를 꺼내거나 상단에 접시를 유지할 수 있습니다. 가장 먼저 놓인 접시가 마지막으로 꺼낼 것입니다. 이것은 스택의 LIFO 원칙을 따릅니다.
  3. 손전등의 배터리 :-마지막에 넣은 배터리를 제거하지 않으면 두 번째 배터리를 제거 할 수 없습니다. 따라서 처음에 넣은 배터리가 마지막으로 꺼낼 것입니다. 이것은 스택의 LIFO 원칙을 따릅니다.
  4. 트렁크의

실생활의 대기열 예

  1. 매표 창구 의 대기열 : 먼저 오는 사람이 먼저 티켓을받습니다. 마지막에 오는 사람이 마지막으로 티켓을 받고 있습니다. 따라서 선입 선출 (FIFO) 전략을 따릅니다.
  2. 차량 부스 먼저 유료 세금 부스 잎에 먼저 차량 : 수신자 세금 다리. 마지막으로 오는 차량이 마지막으로 출발합니다. 따라서 선입 선출 (FIFO) 전략을 따릅니다.
  3. 수하물 검사기 : 수하물 검사기는 먼저 오는 수하물을 먼저 확인합니다. 따라서 큐의 FIFO 원칙을 따릅니다.
  4. 병원 밖에서 대기중인 환자 : 먼저 오는 환자가 먼저 의사를 방문하고 마지막에 오는 환자가 마지막으로 의사를 방문합니다. 따라서 대기열의 선입 선출 (FIFO) 전략을 따릅니다.

Source1Source2 에서 수집 된 위의 예


지난주까지 같은 문제가있었습니다.

추상 클래스는 일반적이거나 일반적인 것입니다. 이 클래스를 사용하여 원하는 방식으로 성형하고 확장 할 수 있습니다.

여기서 실용적인 예를 들어 보겠습니다

동물이라는 수업을 들으십시오. 그리고 그것은 모든 동물이하는 일반적인 식사, 소리, 움직임과 같은 기능을 포함합니다. 이 클래스를 확장하여 고양이, 개 등과 같이 구체적으로 지정할 수 있습니다.

예.

abstract class animal {

    abstract protected function eat();
    abstract protected function sound();        

}

class dogs extends animal
{
   protected function eat() {
       return "meat";
   }

   public function sound() {
       return "bow wow";
   }
}

내 대답이 당신에게 이해되기를 바랍니다


코드에서 한 걸음 물러서십시오.

초록은 무엇을 의미합니까? 요약

그것의 요지는 "진짜가 아니라 실제 사물의 속성을 포착하는 것"입니다.

개체 유니버스를 디자인 할 것이기 때문에 OOP에 대해이를 알아야합니다. 이러한 개체가 어떻게 관련되어 있는지 생각해야합니다.

추상화를 사용하면 이러한 개체 중 일부를 그룹화하여

1) 사고 과정 2) 코드


  1. 클래스는 absract 데이터 유형으로 알려진 데이터 추상화 개념을 사용합니다.

  2. 추상 데이터 유형은 구현을 설명하지 않고 기능 측면에서 스택 및 큐의 개념을 설명하는 오래된 용어입니다.


ADT (Abstract Data Type)는 해당 모델에 정의 된 연산 모음이있는 수학적 모델입니다.

또한 ADT는 일련의 값 및 작업 집합에 의해 동작이 정의되는 데이터 유형입니다.


요약하자면 추상은 정의 된 클래스에서 개체를 만들 수 없다는 것을 의미합니다. 예 : 모양, 정사각형 및 직사각형 클래스가 있지만 모양에서 객체를 정의하지 않으려면 추상으로 표시합니다.

그 후 사용자가 모양에서 새 개체를 정의하려고하면 컴파일러 오류가 발생합니다.


이것은 Code Complete -Quote에서 가져온 것입니다. 추상 데이터 유형은 클래스 개념의 기초를 형성합니다. 클래스를 지원하는 lanuage에서는 자체 클래스에서 각 추상 데이터 유형을 구현할 수 있습니다. 클래스는 일반적으로 상속 및 다형성의 추가 개념을 포함합니다. 클래스를 생각하는 한 가지 방법은 추상 데이터 유형과 상속 및 다형성입니다.

그래서 제 생각에는 OO의 추상 데이터 유형은 추상 클래스를 의미합니다.


객체 지향 프로그래밍에서 추상 데이터 유형은 무엇입니까?

Class / Abstract 데이터 유형은 객체 지향 방식으로 문제를 해결하는 동안 처리 할 수있는 모든 속성 및 함수 (데이터 액세스 용)의 그룹입니다.

개체는 무엇입니까?

객체는 속성과 함수에 액세스 할 수있는 클래스 / 추상 데이터 유형에 대한 인터페이스입니다. 객체에는 데이터 저장에 사용되는 관련 메모리가 있습니다.


ADT는 데이터 값 집합과 이러한 값에 대한 작업 집합을 정의합니다.


에서 이 게시물 :

ADT는 개체 및 작업의 집합이며 ADT의 정의에서 작업 집합이 구현되는 방법에 대한 언급이 없습니다. 컬렉션을 사용하는 프로그래머는 컬렉션 구현의 세부 사항에 대한 걱정없이 미리 결정된 방식으로 데이터를 인스턴스화하고 액세스하는 방법 만 알면됩니다. 즉, 사용자의 관점에서 컬렉션은 추상화이며 이러한 이유로 컴퓨터 과학에서는 일부 컬렉션을 추상 데이터 유형 (ADT)이라고합니다. 사용자는 인터페이스 또는 수행하는 작업 집합을 배우는 데만 관심이 있습니다.

작업과 함께 목록, 집합 및 그래프와 같은 개체는 추상 데이터 유형으로 볼 수 있습니다. ADT는 기본적으로 구현 세부 정보를 숨기는 데이터 유형입니다. ADT에서 작업을 수행해야하는 프로그램의 모든 부분은 ADT 작업을 수행하는 루틴을 변경하기 만하면됩니다. 이를 사용하는 프로그램 (ADT)은 어떤 구현이 사용되었는지 알 필요가 없습니다.


ADT는 일종의 데이터 구조입니다. 데이터 구조를 설명하는 대신 데이터에 대한 작업을 설명합니다.

예를 들어 스택이란 무엇입니까? 검색 트리 또는 선형 데이터 구조 일 수 있지만 사용자는 신경 쓰지 않습니다. 사용자는 "후입 선출"(LIFO)에만 관심이 있습니다.


추상 클래스는 순수 구현 클래스와 달리 실제 세계에서 구체적인 객체를 형성하지 않습니다. 이름에서 알 수 있듯이 추상은 모든 관련 개체에서 독립적으로 재사용 / 정의해야하는 관련 개체의 일반적인 동작을 유지 / 정의합니다.

새의 예를 들어보십시오. 새와 관련이있는 프로그램을 작성하는 경우 먼저 Bird와 같은 추상 기본 클래스와 추상 기본 클래스 Bird에서 파생 된 각 새를 갖게됩니다. 추상 클래스 BIRD는 구체적인 실제 객체가 아니라 새와 같은 관련 객체 유형을 나타냅니다!

클래스 다이어그램으로 시작한 다음 코드를 살펴 보겠습니다.

대체 텍스트 http://ruchitsurati.net/files/birds.png

public abstract class Bird
{
    protected string Name = string.Empty;
    public Bird(string name)
    {
        this.Name = name;
    }

    public virtual void Fly()
    {
        Console.WriteLine(string.Format("{0} is flying.", this.Name));
    }

    public virtual void Run()
    {
        Console.WriteLine(string.Format("{0} cannot run.", this.Name));
    }
}

public class Parrot : Bird
{
    public Parrot() : base("parrot") { }
}

public class Sparrow : Bird
{
    public Sparrow() : base("sparrow") { }
}

public class Penguin : Bird
{
    public Penguin() : base("penguin") { }

    public override void Fly()
    {
        Console.WriteLine(string.Format("{0} cannot fly. Some birds do not fly.", this.Name));
    }

    public override void Run()
    {
        Console.WriteLine(string.Format("{0} is running. Some birds do run.", this.Name));
    }
}

class Program
{
    static void Main(string[] args)
    {

        Parrot p = new Parrot();
        Sparrow s = new Sparrow();
        Penguin pe = new Penguin();

        List<Bird> birds = new List<Bird>();

        birds.Add(p);
        birds.Add(s);
        birds.Add(pe);

        foreach (Bird bird in birds)
        {
            bird.Fly();
            bird.Run();
        }

        Console.ReadLine();
    }
}

추상 형이란 물리적 실체가 없기 때문에 실세계에 존재하지 않는 대상을 의미합니다.

It acts as a base class for concrete class which has physical existance.

e.g.

 Shape is an abstract class whereas circle,rectangle are concrete classes.

참고URL : https://stackoverflow.com/questions/1692933/what-is-an-abstract-data-type-in-object-oriented-programming

반응형