Java에서 일반 배열 생성

Siddharth Swami 2023년10월12일
  1. 객체 배열을 사용하여 Java에서 일반 배열 만들기
  2. 리플렉션 클래스를 사용하여 Java에서 일반 배열 만들기
Java에서 일반 배열 생성

배열은 인접한 메모리 위치에 저장된 항목 모음으로 정의 할 수 있습니다. 일반 배열은 모든 데이터 유형과 독립적이며 정보 유형은 런타임에 평가됩니다.

그러나 Java에서는 배열이 일반화되는 것을 허용하지 않습니다. Java에서 배열에는 구성 요소와 관련된 정보가 포함되어 있으며 런타임시이 정보가 메모리를 할당하는 데 사용되기 때문입니다.

Java의 객체 배열 및 리플렉션 클래스 기능을 사용하여 배열과 유사한 일반 구조를 시뮬레이션 할 수 있습니다. 아래에서 이러한 방법에 대해 설명합니다.

객체 배열을 사용하여 Java에서 일반 배열 만들기

이 접근 방식에서는 형식 개체의 배열을 멤버로 사용합니다. get()set()함수를 사용하여 배열 요소를 읽고 설정합니다.

다음 프로그램은 객체 배열을 사용하여 일반 배열을 만드는 방법을 보여줍니다.

import java.util.Arrays;

class Generic_Array<E> {
  private final Object[] obj_array; // object array
  public final int length;
  // class constructor
  public Generic_Array(int len) {
    // new object array
    obj_array = new Object[len];
    this.len = len;
  }
  // get new object array(obj_array[i])
  E get(int j) {
    @SuppressWarnings("unchecked") final E e = (E) object_array[j];
    return e;
  }
  // set e at new object array(obj_array[i])
  void set(int j, E e) {
    object_array[j] = e;
  }
  @Override
  public String toString() {
    return Arrays.toString(object_array);
  }
}
class Main {
  public static void main(String[] args) {
    final int len = 5;
    // creating an integer array
    Generic_Array<Integer> int_Array = new Generic_Array(len);
    System.out.print("Generic Array <Integer>:"
        + " ");
    for (int i = 2; i < len; i++) int_Array.set(i, i * 2);
    System.out.println(int_Array);
    // creating a string array
    Generic_Array<String> str_Array = new Generic_Array(len);
    System.out.print("Generic Array <String>:"
        + " ");
    for (int i = 0; i < len; i++) str_Array.set(i, String.valueOf((char) (i + 97)));
    System.out.println(str_Array);
  }
}

출력:

Generic Array <Integer>: [2, 4, 6, 8, 10]
Generic Array <String>: [a, b, c, d, e]

리플렉션 클래스를 사용하여 Java에서 일반 배열 만들기

이러한 유형의 접근 방식에서는 리플렉션 클래스를 사용하여 유형이 런타임에만 알려지는 제네릭 배열을 만듭니다.

이전 접근 방식과이 접근 방식의 유일한 차이점은 리플렉션 클래스가 생성자 자체로 사용된다는 것입니다. 그 후 리플렉션 클래스는 데이터를 생성자 클래스에 명시 적으로 전달하여 객체 배열을 시작합니다.

다음 프로그램은 리플렉션을 사용하여 일반 배열을 만드는 방법을 보여줍니다.

import java.util.Arrays;
class Generic_Array<E> {
  private final E[] objArray;
  public final int length;
  // constructor class
  public Generic_Array(Class<E> dataType, int length) {
    // creatting a new array with the specified data type and length at runtime using reflection
    // method.
    this.objArray = (E[]) java.lang.reflect.Array.newInstance(dataType, len);
    this.len = len;
  }
  // get element at obj_Array[i]
  E get(int i) {
    return obj_Array[i];
  }
  // assign e to obj_Array[i]
  void set(int i, E e) {
    obj_Array[i] = e;
  }
  @Override
  public String toString() {
    return Arrays.toString(obj_Array);
  }
}
class Main {
  public static void main(String[] args) {
    final int len = 5;
    // create array with Integer as data type
    Generic_Array<Integer> int_Array = new Generic_Array(Integer.class, len);
    System.out.print("Generic Array<Int>:"
        + " ");
    for (int i = 2; i < len; i++) int_Array.set(i, i + 10);
    System.out.println(int_Array);
    // create an array with String as data type
    Generic_Array<String> str_Array = new Generic_Array(String.class, len);
    System.out.print("Generic Array<Str>:"
        + " ");
    for (int i = 0; i < len; i++) str_Array.set(i, String.valueOf((char) (i + 65)));
    System.out.println(str_Array);
  }
}

출력:

Generic Array<Int>: [12, 13, 14, 15, 16]
Generic Array<Str>: [A, B, C, D, E]

제네릭 배열은 런타임에 생성 된 인수 유형에 대해 제네릭 클래스를 알 수 없기 때문에 유형 검사 또는 명시 적 메커니즘이 구현되지 않는 한 유형 안전성을 제공 할 수 없습니다.

제네릭을 사용하여 위에서 설명한 안전성없이 정확한 어레이를 원한다면 아래와 같이 수행 할 수 있습니다.

import java.lang.reflect.Array;

public class Gen_Set<E> {
  private E[] x;

  public Gen_Set(Class<E[]> cla, int len) {
    x = cla.cast(Array.newInstance(cla.getComponentType(), len));
  }

  public static void main(String[] args) {
    Gen_Set<String> foo = new Gen_Set<String>(String[].class, 1);
    String[] bar = foo.x;
    foo.x[0] = "xyzzy";
    String baz = foo.a[0];
  }
}

이 코드는 컴파일 타임에 경고를 표시하지 않으며, 메인 클래스에서 선언 된Gen_Set의 인스턴스 유형이 해당 유형의 배열에 대해 x에 동일하게 할당 될 수 있음을 알 수 있습니다. 배열의 값이 잘못된 유형입니다.

관련 문장 - Java Array