From c7b7d7206e57979325af0a614ac56832c7cb384a Mon Sep 17 00:00:00 2001 From: hellomatia Date: Sat, 18 May 2024 00:07:49 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[ArrayList]:=20JavaDiverCustomArrayList=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/List/ArrayList/JavaDiverCustomArrayList.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/List/ArrayList/JavaDiverCustomArrayList.java diff --git a/src/main/java/List/ArrayList/JavaDiverCustomArrayList.java b/src/main/java/List/ArrayList/JavaDiverCustomArrayList.java new file mode 100644 index 0000000..480d3c7 --- /dev/null +++ b/src/main/java/List/ArrayList/JavaDiverCustomArrayList.java @@ -0,0 +1,8 @@ +package List.ArrayList; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface JavaDiverCustomArrayList { +} From e45f12911522dcd220dcea859a19e07d81b97f4c Mon Sep 17 00:00:00 2001 From: hellomatia Date: Sat, 18 May 2024 00:08:14 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[ArrayList]:=20ArrayList=5Fhellomatia=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EC=B2=B4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../List/ArrayList/ArrayList_hellomatia.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/main/java/List/ArrayList/ArrayList_hellomatia.java diff --git a/src/main/java/List/ArrayList/ArrayList_hellomatia.java b/src/main/java/List/ArrayList/ArrayList_hellomatia.java new file mode 100644 index 0000000..0a14703 --- /dev/null +++ b/src/main/java/List/ArrayList/ArrayList_hellomatia.java @@ -0,0 +1,66 @@ +package List.ArrayList; + +import List.List; + +@JavaDiverCustomArrayList +public class ArrayList_hellomatia implements List { + + private static final int INITIAL_CAPACITY = 10; + private E[] array; + private int size; + private int maxCapacity; + + @SuppressWarnings("unchecked") + public ArrayList_hellomatia() { + this.array = (E[]) new Object[INITIAL_CAPACITY]; + maxCapacity = array.length; + } + + @Override + public void insert(E data) { + if (size() == maxCapacity) { + maxCapacity = 2 * maxCapacity; + @SuppressWarnings("unchecked") + E[] newArray = (E[]) new Object[maxCapacity]; + System.arraycopy(array, 0, newArray, 0, size()); + array = newArray; + } + array[size()] = data; + ++size; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size() == 0; + } + + @Override + public boolean contains(E o) { + for (int i = 0; i < size(); i++) { + if (array[i].equals(o)) { + return true; + } + } + return false; + } + + @Override + public E get(int index) { + return array[index]; + } + + @Override + public E remove(int index) { + E removed = array[index]; + for (int i = index; i < size() - 1; i++) { + array[i] = array[i + 1]; + } + --size; + return removed; + } +} From 6c51f90a103a49ded95ba041c224f2ed2395655e Mon Sep 17 00:00:00 2001 From: hellomatia Date: Sat, 18 May 2024 00:09:01 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[ArrayList]:=20=EB=A6=AC=ED=94=8C=EB=A0=89?= =?UTF-8?q?=EC=85=98=EC=9D=84=20=EC=9D=B4=EC=9A=A9=ED=95=B4=20=EB=AA=A8?= =?UTF-8?q?=EB=93=A0=20=EA=B5=AC=ED=98=84=EC=B2=B4=EC=9D=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=ED=95=9C=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=97=90=EC=84=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../java/List/ArrayList/ArrayList_name.java | 2 +- .../ArrayList/ArrayListTest_hellomatia.java | 88 +++++++++++++++++++ 3 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 src/test/java/List/ArrayList/ArrayListTest_hellomatia.java diff --git a/build.gradle b/build.gradle index 4368f97..a2f8cfb 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,7 @@ dependencies { testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.25.3' + implementation group: 'org.reflections', name: 'reflections', version: '0.10.2' } compileJava.options.encoding = 'UTF-8' diff --git a/src/main/java/List/ArrayList/ArrayList_name.java b/src/main/java/List/ArrayList/ArrayList_name.java index f7fd310..a7715bc 100644 --- a/src/main/java/List/ArrayList/ArrayList_name.java +++ b/src/main/java/List/ArrayList/ArrayList_name.java @@ -1,9 +1,9 @@ package List.ArrayList; import List.List; - import java.util.ArrayList; +@JavaDiverCustomArrayList public class ArrayList_name implements List { // 구현시 삭제 diff --git a/src/test/java/List/ArrayList/ArrayListTest_hellomatia.java b/src/test/java/List/ArrayList/ArrayListTest_hellomatia.java new file mode 100644 index 0000000..429103f --- /dev/null +++ b/src/test/java/List/ArrayList/ArrayListTest_hellomatia.java @@ -0,0 +1,88 @@ +package List.ArrayList; + +import List.List; +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.TestFactory; +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; + +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Set; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class ArrayListTest_hellomatia { + + + @TestFactory + @SuppressWarnings("unchecked") + Collection testAllArrayLists() throws Exception { + java.util.List dynamicTests = new ArrayList<>(); + + String packageName = "List.ArrayList"; + + Set> annotatedClasses = findClassesWithAnnotation(packageName); + + for (Class clazz : annotatedClasses) { + Constructor constructor = clazz.getDeclaredConstructor(); + constructor.setAccessible(true); + + dynamicTests.add(DynamicTest.dynamicTest(clazz.getSimpleName() + " - ArrayList의 생성 및 초기화", + () -> testArrayListCreation((List) constructor.newInstance()))); + + dynamicTests.add(DynamicTest.dynamicTest(clazz.getSimpleName() + " - 데이터 5개 저장", + () -> testArrayListInsertion((List) constructor.newInstance()))); + + dynamicTests.add(DynamicTest.dynamicTest(clazz.getSimpleName() + " - 데이터 5개 저장 후 22인 데이터 모두 삭제", + () -> testArrayListDeletion((List) constructor.newInstance()))); + } + + return dynamicTests; + } + + private Set> findClassesWithAnnotation(String packageName) { + Reflections reflections = new Reflections(packageName, Scanners.TypesAnnotated); + return reflections.getTypesAnnotatedWith(JavaDiverCustomArrayList.class); + } + + private void testArrayListCreation(List list) { + assertThat(list).isNotNull(); + } + + private void testArrayListInsertion(List list) { + list.insert(11); + list.insert(11); + list.insert(22); + list.insert(22); + list.insert(33); + + assertThat(list.size()).isEqualTo(5); + assertThat(list.get(0)).isEqualTo(11); + assertThat(list.get(1)).isEqualTo(11); + assertThat(list.get(2)).isEqualTo(22); + assertThat(list.get(3)).isEqualTo(22); + assertThat(list.get(4)).isEqualTo(33); + } + + private void testArrayListDeletion(List list) { + list.insert(11); + list.insert(11); + list.insert(22); + list.insert(22); + list.insert(33); + + for (int i = 0; i < list.size(); i++) { + if (list.get(i) == 22) { + list.remove(i); + i--; + } + } + + assertThat(list.size()).isEqualTo(3); + assertThat(list.get(0)).isEqualTo(11); + assertThat(list.get(1)).isEqualTo(11); + assertThat(list.get(2)).isEqualTo(33); + } +} \ No newline at end of file