programing

Java에서 객체 배열 만들기

kingscode 2022. 7. 12. 23:46
반응형

Java에서 객체 배열 만들기

저는 Java에 익숙하지 않아서 한동안 Java에서 객체 배열을 만들었습니다.

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

A[] arr = new A[4];

다만, 이것은, 에 대한 포인터(참조)를 작성하는 것에 지나지 않습니다.A4개의 오브젝트가 아니라이거 맞는건가요?작성한 오브젝트의 함수/변수에 액세스하려고 하면 늘 포인터 예외가 발생한다는 것을 알 수 있습니다.오브젝트를 조작/액세스 하려면 , 다음의 조작이 필요했습니다.

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

이게 맞습니까, 아니면 제가 잘못하고 있는 건가요?이게 맞다면 정말 이상하다.

편집: C++에서는 new 라고만 하기 때문에 이상하다고 생각합니다.A[4]4개의 오브젝트를 만듭니다.

이게 맞아요.

A[] a = new A[4];

...사후 4호A다음과 같이 참조할 수 있습니다.

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"), .. };

이 구문은 method 인수 등 어디서든 배열을 작성 및 초기화할 때도 사용할 수 있습니다.

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

네, 기본값 null로 설정된 참조만 생성됩니다.그렇기 때문에 Null Pointer를 사용할 수 있습니다.예외 개체를 별도로 생성하고 참조를 할당해야 합니다.Java에서 어레이를 작성하려면 3가지 단계가 있습니다.

선언 – 이 절차에서는 작성하는 어레이의 데이터 유형과 치수를 지정합니다.하지만 아직 치수에 대해서는 언급하지 않았습니다.그것들은 비어 있다.

인스턴스화 – 이 절차에서는 새로운 키워드를 사용하여 어레이를 작성하거나 어레이에 메모리를 할당합니다.이 단계에서 어레이 치수의 크기를 언급합니다.

초기화 – 어레이는 항상 데이터 유형의 기본값으로 초기화됩니다.하지만 우리만의 초기화는 할 수 있습니다.

Java에서의 어레이 선언

Java에서는 이렇게 1차원 어레이를 선언합니다.

int[] array;
int array[];

어레이 선언에는 이전 구문을 사용하는 것이 좋습니다.다음은 기타 법적 선언의 예입니다.

// 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]델은, 델이 필요로 하는 것은,ints, 사이즈 5 입니다.따라서 JVM은 메모리를 생성하고 새로 할당된 메모리의 참조를 어레이에 할당합니다.이 어레이는 타입의 "참조"입니다.int[]

초기화

루프 사용– for 루프를 사용하여 어레이 요소를 초기화하는 것이 어레이를 가동시키는 가장 일반적인 방법입니다.기본값 자체를 할당하는 경우 for 루프를 실행할 필요가 없습니다.JVM이 대신 할당하기 때문입니다.

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

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

여기서는 크기를 언급하지 않습니다. JVM은 5가지 값을 제공하고 있음을 알 수 있기 때문입니다.

따라서 참조가 인스턴스화될 때까지 null로 유지됩니다.제 답변이 도움이 되었기를 바랍니다.:)

출처 - Java 어레이

정답입니다.일부 "공장"에서 제공하는 요소로 채워진 특정 크기의 배열을 만들고 싶다면 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그 외는 거의 없습니다.

다음은 파라미터를 사용하는 컨스트럭터를 사용하여 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에서 새 배열을 선언하는 genaral 형식은 다음과 같습니다.

type arrayName[] = new type[numberOfElements];

여기서 type은 원시 유형 또는 개체입니다. numberOfElements는 어레이에 저장하는 요소의 수이며, Java는 동적 배열을 지원하지 않기 때문에 이 은 변경할 수 없습니다(개체를 유지하기 위해 유연하고 동적인 구조가 필요한 경우 Java 컬렉션 중 일부를 사용하는 것이 좋습니다).

어레이를 초기화하여 5명의 소규모 회사에서 모든 직원의 급여를 저장합니다.

int salaries[] = new int[5];

배열 유형(이 경우)int)는 배열 내의 모든 값에 적용됩니다.유형을 하나의 배열에 혼재시킬 수 없습니다.

급여 배열을 초기화했으므로 몇 가지 가치를 부여하고 싶습니다.이것은, 다음과 같이 초기화중에 실시할 수 있습니다.

int salaries[] = {50000, 75340, 110500, 98270, 39400};

또는 나중에 다음과 같이 하는 경우:

salaries[0] = 50000;
salaries[1] = 75340;
salaries[2] = 110500;
salaries[3] = 98270;
salaries[4] = 39400;

어레이 작성의 보다 시각적인 예:

어레이에 대한 자세한 내용은 가이드를 참조하십시오.

네, 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];  

클래스 A가 다음과 같다고 가정합니다.

class A{
int rollno;
int DOB;
}        

클래스 A의 오브젝트 배열을 만듭니다.이렇게 하면

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

그건 전적으로 옳습니다.

여기서 A는 클래스이고 스테이트먼트1의 클래스 A는 어레이의 데이터형입니다.새로운 키워드로 인해 이 문이 실행되면 오브젝트가 생성되고 메모리가 동적으로 할당됩니다.이것은 데이터형 A의 4블록에 필요한 공간과 같습니다(즉, 필요한 배열 공간의 1블록은 8바이트(4+4)입니다). int는 4바이트의 공간을 차지한다고 가정합니다.따라서 어레이에 할당된 총 용량은 4*4바이트입니다).그런 다음 객체의 참조가 arr 변수에 제공됩니다.여기서 주의할 점은 스테이트먼트1은 클래스A의 오브젝트 작성과는 무관하며 이 클래스에는 오브젝트가 작성되지 않으며 어레이의 메모리 할당에 필요한 클래스A의 크기를 나타내는 데이터 타입으로만 사용됩니다.

그런 다음 for 루프가 실행되고 스테이트먼트2가 실행되면 JVM은 클래스 A에 메모리를 할당하고(즉, 오브젝트를 작성합니다), arr[i]에 참조를 제공합니다.루프가 호출될 때마다 객체가 생성되고 그 참조가 arr[i]에 주어집니다.

따라서 8바이트의 공간을 보유한ar[0]에는 클래스 A의 객체에 대한 참조가 주어지고 루프가 실행될 때마다 새로운 객체가 생성되어 해당 객체가 해당 객체의 데이터에 액세스할 수 있도록 참조가 제공됩니다.

언급URL : https://stackoverflow.com/questions/5364278/creating-an-array-of-objects-in-java

반응형