# Задание на лабораторную работу

{% hint style="warning" %}
Для каждого класса необходимо предоставить его графическое представление в диаграмме классов UML. Графическое представление добавить в протокол лабораторной работы и принести на защиту лабораторной работы.
{% endhint %}

### Класс DynamicIntArray

Необходимо создать класс `DynamicIntArray`, который реализует функционал динамического массива целых чисел.

При реализации динамического массива учитывайте следующее:

* при реализации класса вам необходимо указать область видимости для полей и методов. Подумайте о том, какие методы необходимо отнести к "интерфейсу", а какие к реализации;
* размер динамического массива для внешнего пользователя не имеет значения и теоретически неограничен;
* внешний пользователь не должен знать и догадываться, что динамический массив "внутри" реализован с помощью обычного статического массива;
* вы должны предусмотреть различные проверки на некорректность индексов, которые мог ввести пользователь;
* вы должны написать "реализацию" класса таким образом, чтобы можно моделировать динамическое поведение массива с помощью обычного статического;
* продумайте, какие аргументы методы должны принимать и какие значения возвращать.

{% tabs %}
{% tab title="Читать внимательно!" %}
**Перейдите во вкладку "Подсказка", чтобы получить подсказку, которая поможет вам в реализации класса или попробуйте реализовать класс без подсказки.**
{% endtab %}

{% tab title="Подсказка" %}

* При создании динамического массива инициализируйте внутренний статический массив с каким-то дефолтным изначальным размером;
* При вставке элементов проверяйте, не выходите ли вы за пределы внутреннего статического массива;
* Если внутренний массив переполнен, создавайте новый массив б**о**льшего размера: создавайте новый массив, копируйте значения из старого массива в новый, заменяйте новый массив на старый. Помните, что массивы в Java - объекты и что поле - просто указатель на массив и что указатель может указывать на другой массив;
* При уменьшении размера массива реализуйте уменьшение внутреннего статического массива. Подумайте, как это лучше сделать, чтобы не уменьшать внутренний массив при каждом удалении элемента.
  {% endtab %}
  {% endtabs %}

{% hint style="warning" %}
**ВАЖНО! Динамический массив необходимо реализовать с помощью статического целочисленного массива!**
{% endhint %}

Для внешнего пользователя класса поведение класса выглядит следующим образом:

* пользователь может создать новый динамический массив с конструктором без параметров или с указанием начальных значений динамического массива;
* пользователь может вставить элемент в определенный индекс динамического массива (остальные элементы динамического массива сдвигаются вправо) с помощью метода `add()`. Если метод `add()` вызывается без указания индекса, элемент добавляется в конец динамического массива;
* пользователь может перезаписать значение i-го элемента динамического массива с помощью метода `set()`;
* пользователь может удалить элемент динамического массива по индексу с помощью метода `removeAt()`. Если метод `removeAt()` вызывается без указания индекса, то удаляется последний элемент в динамическом массиве.
* пользователь может удалить первое вхождение значения в динамическом массиве с помощью метода `remove()`.&#x20;
* пользователь может получить индекс первого вхождения элемента в динамическом массиве с помощью метода `indexOf()`. Подумайте о том, как сигнализировать пользователю о том, что искомый элемент в динамическом массиве не найден;
* пользователь может проверить, есть ли такой элемент в массиве с помощью метода `contains()`;
* пользователь может получить размер динамического массива с помощью метода `size()`;
* пользователь может проверить, пустой ли массив с помощью метода `isEmpty()`;
* пользователь может очистить массив полностью с помощью метода `clear()`.
