[java] Java로 객체 배열 만들기

나는 Java를 처음 사용했고 당분간 Java로 객체 배열을 만들었습니다.

예를 들어 클래스 A가 있습니다.

A[] arr = new A[4];

그러나 이것은 A4 개의 객체가 아닌 포인터 (참조)를 만드는 것 입니다. 이 올바른지? 생성 된 객체의 함수 / 변수에 액세스하려고하면 null 포인터 예외가 발생합니다. 객체를 조작 / 액세스하려면 다음과 같이해야합니다.

A[] arr = new A[4];
for (int i = 0; i < 4; i++) {
    arr[i] = new A();
}

이것이 맞습니까? 아니면 내가 잘못하고 있습니까? 이것이 맞다면 정말 이상합니다.

편집 : 나는 C ++에서 새로 말하고 A[4]네 개의 객체를 생성 하기 때문에이 이상한 것을 발견 했습니다.



답변

맞습니다.

A[] a = new A[4];

A이 작업을 수행하는 것과 비슷한 4 개의 참조를 만듭니다 .

A a1;
A a2;
A a3;
A a4;

이제 다음 과 같이 a1.someMethod()할당 하지 않고 는 할 수 없었습니다 a1.

a1 = new A();

마찬가지로 배열을 사용하여 다음을 수행해야합니다.

a[0] = new A();

… 사용하기 전에.


답변

맞습니다. 당신은 또한 할 수 있습니다 :

A[] a = new A[] { new A("args"), new A("other args"), .. };

이 구문은 메소드 인수와 같이 어디에서나 배열을 작성하고 초기화하는 데 사용할 수 있습니다.

someMethod( new A[] { new A("args"), new A("other args"), . . } )


답변

예. 참조 만 작성하며 기본값은 null로 설정됩니다. 그렇기 때문에 NullPointerException이 발생합니다. 개체를 별도로 만들고 참조를 할당해야합니다. Java로 배열을 만드는 3 단계가 있습니다-

선언 –이 단계에서는 만들려는 배열의 데이터 유형과 차원을 지정합니다. 그러나 크기의 크기는 아직 언급하지 않았습니다. 그들은 비어 있습니다.

인스턴스화 –이 단계에서는 새 키워드를 사용하여 배열을 만들거나 배열에 메모리를 할당합니다. 이 단계에서는 배열 차원의 크기를 언급합니다.

초기화 – 배열은 항상 데이터 유형의 기본값으로 초기화됩니다. 그러나 우리는 우리 자신의 초기화를 할 수 있습니다.

자바에서 배열 선언

이것이 Java로 1 차원 배열을 선언하는 방법입니다.

int[] array;
int array[];

Oracle은 배열을 선언 할 때 이전 구문을 사용하는 것이 좋습니다. 법적 선언의 다른 예는 다음과 같습니다.

// One Dimensional Arrays
int[] intArray;             // Good
double[] doubleArray;

// One Dimensional Arrays
byte byteArray[];           // Ugly!
long longArray[];

// Two Dimensional Arrays
int[][] int2DArray;         // Good
double[][] double2DArray;

// Two Dimensional Arrays
byte[] byte2DArray[];       // Ugly
long[] long2DArray[];

그리고 이것은 불법 선언의 몇 가지 예입니다.

int[5] intArray;       // Don't mention size!
double{} doubleArray;  // Square Brackets please!

인스턴스화

이것이 우리가 어레이를“인스턴트 화”하거나 메모리를 할당하는 방법입니다.

int[] array = new int[5];

JVM이 new키워드를 발견하면 무언가를 위해 메모리를 할당해야한다는 것을 이해합니다. 그리고을 지정 int[5]하면 int크기 5 의 s 배열이 필요하다는 것을 의미합니다 . 따라서 JVM은 메모리를 작성하고 새로 할당 된 메모리의 참조를 배열에 “할당”유형으로 지정합니다.int[]

초기화

루프 사용 – for 루프를 사용하여 배열의 요소를 초기화하는 것이 배열을 진행하는 가장 일반적인 방법입니다. JVM이 자동으로 수행하므로 기본값 자체를 지정하려는 경우 for 루프를 실행할 필요가 없습니다.

하나로 ..! – 어레이를 한 번에 선언, 인스턴스화 및 초기화 할 수 있습니다. 구문은 다음과 같습니다.

int[] arr = {1, 2, 3, 4, 5};

JVM은 5 개의 값을 제공한다는 것을 알 수 있기 때문에 여기서는 크기를 언급하지 않습니다.

따라서 인스턴스화 할 때까지 참조는 null로 유지됩니다. 내 답변이 도움이 되었기를 바랍니다 ..! 🙂

소스 -Java의 배열


답변

다음은 매개 변수를 사용하는 생성자를 사용하여 10 개의 직원 개체 배열을 만드는 명확한 예입니다.

public class MainClass
{
    public static void main(String args[])
    {
        System.out.println("Hello, World!");
        //step1 : first create array of 10 elements that holds object addresses.
        Emp[] employees = new Emp[10];
        //step2 : now create objects in a loop.
        for(int i=0; i<employees.length; i++){
            employees[i] = new Emp(i+1);//this will call constructor.
        }
    }
}

class Emp{
    int eno;
    public Emp(int no){
        eno = no;
        System.out.println("emp constructor called..eno is.."+eno);
    }
}


답변

당신이 올바른지. 그 외에도 Java 8 ( 스트림 API 를 도입하는)이 있기 때문에 일부 “공장”에서 제공하는 요소로 채워진 특정 크기의 배열을 만들려면 이 단일 라이너를 사용할 수 있습니다.

A[] a = Stream.generate(() -> new A()).limit(4).toArray(A[]::new);
  • Stream.generate(() -> new A())람다에 의해 설명 된 방식으로 생성 된 별도의 A 요소에 대한 팩토리와 같습니다. () -> new A()구현은 Supplier<A>각각의 새로운 A 인스턴스가 어떻게 생성되어야하는지 설명합니다.
  • limit(4)스트림이 생성 할 요소의 양을 설정합니다
  • toArray(A[]::new)(로 다시 쓸 수도 있음 toArray(size -> new A[size]))-반환해야 할 배열 유형을 결정 / 설명 할 수 있습니다.

당신이 사용할 수있는 몇 가지 기본 유형의 경우 DoubleStream, IntStream, LongStream추가로 같은 발전기 제공 range rangeClosed및 몇 가지 다른.


답변

예, Java에서는 객체 배열을 만드는 여러 단계가 있습니다.

  1. 선언 및 인스턴스화 ( ‘4’개체를 저장할 메모리 만들기) :

    A[ ] arr = new A[4];
  2. 객체 초기화 (이 경우 클래스 A의 4 개의 객체를 초기화 할 수 있음)

    arr[0] = new A();
    arr[1] = new A();
    arr[2] = new A();
    arr[3] = new A();

    또는

    for( int i=0; i<4; i++ )
      arr[i] = new A();

이제 방금 만든 객체에서 기존 메소드 호출을 시작할 수 있습니다.

예를 들면 다음과 같습니다.

  int x = arr[1].getNumber();

또는

  arr[1].setNumber(x);


답변

일반 클래스의 경우 랩퍼 클래스를 작성해야합니다. 예를 들어 :

Set<String>[] sets = new HashSet<>[10]

결과 : “일반 배열을 만들 수 없습니다”

대신 사용하십시오 :

        class SetOfS{public Set<String> set = new HashSet<>();}
        SetOfS[] sets = new SetOfS[10];