Java로 객체 배열 만들기


196

나는 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]네 개의 객체를 생성 하기 때문에이 이상한 것을 발견 했습니다.


17
나는 이것이 매우 유용한 질문이라고 말하고 싶었다. 물어 주셔서 감사합니다.
pandorym

답변:


262

맞습니다.

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();

... 사용하기 전에.


10
이 답변은 혼란의 전체 무리를 저장, 그 존재에 감사드립니다.
pandorym

1
나는 C ++ 배경에서 왔기 때문에이 혼란을 겪었습니다 .C ++에서와 마찬가지로 Java의 new키워드도 생성자를 호출하고 I 메모리를 할당 한다고 가정했습니다 . Java new에서는 C ++과 비교할 때 실제 객체가 아닌 참조 만 생성한다고 생각합니다. 대답 해줘서 고마워요.
크리슈나 오자

1
@ Krishna_Oza, 여기에 C ++과 차이가 없습니다. 첫 번째 new는 배열 객체를 만듭니다. 이들은 동적으로 할당 된 객체 ( "힙")입니다. 따라서 유사한 C ++ 코드는 다음과 같습니다 A **a = new A*[4]; for (int i = 0; i < 4; ++i) { a[i] = new A(); }.
Vsevolod Golovanov

1
새로운 참조가 생성되지만 C ++에서와 같이 배열의 각 요소에 대한 생성자를 초기화하지 않는 이유는 무엇입니까? 이것은 어리석은 일이지만, 우리가 그렇게한다면, 우리가 가질 수있는 모든 문제를 묻고 싶습니다. @MeBigFatGuy
Jasser

2
@Jasser-요소의 생성자는 무엇입니까? 유일한 요소 생성자가 많은 인수를 취하면 어떻게됩니까? 이러한 객체를 어떻게 만들 것입니까?
MeBigFatGuy 2016 년

77

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

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

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

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

34

예. 참조 만 작성하며 기본값은 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의 배열


5

다음은 매개 변수를 사용하는 생성자를 사용하여 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);
    }
}

3

당신이 올바른지. 그 외에도 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및 몇 가지 다른.


0

예, 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);

0

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

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

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

대신 사용하십시오 :

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

이 줄은 세트 유형이 문자열 인 세트의 배열을 만들려고한다는 것을 의미합니까?
sofs1

0

Java에서 새 배열을 선언하는 일반적인 형식은 다음과 같습니다.

type arrayName[] = new type[numberOfElements];

여기서 type은 기본 유형 또는 Object입니다. 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;

보다 시각적 인 배열 생성 예 : 여기에 이미지 설명을 입력하십시오

어레이에 대한 자세한 내용은 안내서를 확인하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.