객체 배열 Java

⚡ 스마트 요약

객체 배열 Java 객체 참조는 고정 크기의 연속된 슬롯에 저장되므로, 하나의 변수로 클래스의 여러 인스턴스를 저장하고 인덱스를 통해 각 인스턴스에 접근하여 반복, 변경 및 메서드 전달이 가능합니다.

  • 📦 참조 저장소: 각 슬롯은 다음과 같습니다. Java 객체 배열은 객체 자체가 아니라 객체에 대한 참조를 저장하며, 이는 객체 변수와 유사합니다. Java.
  • 🧱 2단계 생성: 배열을 `new ClassName[size]`로 할당한 다음, 각 객체를 호출하기 전에 해당 객체에 대해 `new ClassName()`으로 다시 할당합니다.
  • ⚠️ NullPointerException: 모든 슬롯은 null로 시작합니다. 초기화되지 않은 슬롯에서 메서드를 호출하면 런타임에 NullPointerException이 발생합니다.
  • 🔁 반복: 배열 길이를 지정하는 for 루프 또는 확장된 for 루프를 사용하여 배열의 모든 객체를 순회하세요.
  • 📏 고정 크기: 배열은 할당 후에는 크기를 늘릴 수 없습니다. 런타임에 객체 수가 변경될 경우에는 ArrayList를 사용하십시오.
  • 🏗️ 생성자 초기화: 생성 시 인라인으로 전달되는 생성자는 사후에 setter를 호출하는 것보다 더 간결하고 안전한 설정을 제공합니다.
  • 🚚 메서드 매개변수: 배열을 메서드에 전달하면 참조가 전달되므로 메서드 내부의 변경 사항은 호출자에게 그대로 표시됩니다.

객체 배열 Java

객체 배열이란 무엇인가요? Java?

A Java 객체 배열 동일한 클래스의 여러 객체 인스턴스를 하나의 고정 크기 컨테이너에 저장합니다. 값 등을 저장하는 기본 배열과는 다릅니다. int, double및 boolean 각 슬롯에는 객체 배열이 직접 저장됩니다. 참조각 슬롯은 객체의 메모리 위치를 가리키며, 객체 자체는 해당 위치에 저장됩니다. Java 더미.

이 레이아웃은 모든 객체의 레이아웃과 일치합니다. 변수 in Java 잘 작동합니다. 배열은 단순히 여러 객체 참조를 그룹화하여 인덱스로 접근할 수 있도록 해줍니다. 객체의 개수가 미리 정해져 있고 프로그램 실행 중에 변하지 않는 경우에 가장 적합한 선택입니다.

통사론

ClassName[] obj = new ClassName[array_length];

오른쪽에는 다음과 같은 공간이 할당됩니다. array_length 참조, 모두 초기화됨 null어떤 객체도 없습니다. ClassName 아직 존재하지 않는 것은 그러한 객체에 대한 참조를 담을 수 있는 컨테이너뿐입니다.

객체 배열을 만드는 방법 Java

객체 배열을 생성하는 데는 항상 두 단계의 메모리 할당이 필요합니다. 첫 번째는 참조 컨테이너를 할당하고, 두 번째는 해당 컨테이너가 가리킬 각 객체를 할당합니다. (이 부분은 생략합니다.)ping 두 번째 단계는 가장 흔한 원인입니다. NullPointerException 초보자 Java 암호.

단계 1) 당신을 엽니 다 코드 편집기 다음 코드를 복사하세요:

class ObjectArray {
    public static void main(String args[]) {
        Account obj[] = new Account[2];
        // obj[0] = new Account();
        // obj[1] = new Account();
        obj[0].setData(1, 2);
        obj[1].setData(3, 4);
        System.out.println("For Array Element 0");
        obj[0].showData();
        System.out.println("For Array Element 1");
        obj[1].showData();
    }
}

class Account {
    int a;
    int b;

    public void setData(int c, int d) {
        a = c;
        b = d;
    }

    public void showData() {
        System.out.println("Value of a = " + a);
        System.out.println("Value of b = " + b);
    }
}

단계 2) 파일을 저장 ObjectArray.java그런 다음 컴파일하고 실행하세요.

단계 3) 오류를 기록해 두세요. 4단계로 진행하기 전에 오류를 디버깅해 보세요.

단계 4) 라인을 검사하세요 Account obj[] = new Account[2];이 함수는 두 개의 참조 변수로 구성된 배열을 할당합니다. Account하지만 아무것도 할당하지 않습니다. Account 물체를 담을 수 있습니다. 두 슬롯 모두에 물체가 들어갑니다. null그리고 전화 obj[0].setData(...) 에 null 참조가 오류를 발생시킵니다. NullPointerException 런타임에.

Java 객체 배열 참조 변수

단계 5) 4번과 5번 줄의 주석을 해제하세요. 이 두 줄이 실제를 생성합니다. Account 객체를 생성하고 할당합니다. obj[0] obj[1]이제 배열에는 실제 참조가 저장되어 있으며 코드가 제대로 실행됩니다.

Java 객체 배열이 채워졌습니다

출력:

For Array Element 0
Value of a = 1
Value of b = 2
For Array Element 1
Value of a = 3
Value of b = 4

객체 배열을 초기화하는 방법 Java

위에서 보여준 setter 기반 초기화 방식 외에도 객체 배열을 초기화하는 더 깔끔한 세 가지 방법이 있습니다. 각 방식은 간결성을 위해 코드의 장황함을 감수해야 하므로 상황에 가장 적합한 방식을 선택하세요.

  1. 루프 초기화 — 배열을 할당한 다음 각 인덱스를 순회하며 새 객체를 할당합니다. 이는 대규모 배열이나 객체 수가 동적일 때 사용하는 표준 패턴입니다.
  2. 생성자 초기화 — 생성 시점에 값을 생성자에 직접 전달하므로 별도의 setter 호출이 필요하지 않습니다.
  3. 배열 리터럴 초기화 — 인라인을 사용하여 단일 문장으로 선언하고 값을 채웁니다. { ... } 초기화 도구로, 소규모 고정 세트에 적합합니다.
class Account {
    int a, b;

    public Account(int a, int b) {   // constructor
        this.a = a;
        this.b = b;
    }
}

public class InitDemo {
    public static void main(String[] args) {

        // 1) Loop initialisation
        Account[] loopArr = new Account[3];
        for (int i = 0; i < loopArr.length; i++) {
            loopArr[i] = new Account(i, i * 10);
        }

        // 2) Constructor initialisation, one slot at a time
        Account[] ctorArr = new Account[2];
        ctorArr[0] = new Account(1, 2);
        ctorArr[1] = new Account(3, 4);

        // 3) Array literal initialisation
        Account[] litArr = {
            new Account(5, 6),
            new Account(7, 8),
            new Account(9, 10)
        };

        System.out.println("loop size   = " + loopArr.length);
        System.out.println("ctor size   = " + ctorArr.length);
        System.out.println("literal size= " + litArr.length);
    }
}

루프 초기화는 슬롯이 남지 않도록 보장하기 때문에 가장 안전한 기본값입니다. null생성자 초기화를 통해 각 객체가 서로 다른 인수를 필요로 할 때 의도를 명확히 할 수 있으며, 배열 리터럴을 사용하면 간단한 데모 코드를 간결하게 유지할 수 있습니다. 특별한 이유가 없는 한 같은 배열 내에서 스타일을 혼합하지 마세요. 일관성을 유지하면 버그를 더 쉽게 발견할 수 있습니다.

반복 및 요소 접근 Java 객체 배열

객체 배열이 생성되면 세 가지 패턴으로 거의 모든 접근 요구 사항을 충족할 수 있습니다. 코드가 인덱스에 대해 얼마나 세밀한 제어가 필요한지에 따라 루프 스타일을 선택하십시오.

클래식 for 고리 인덱스에 접근할 수 있으며, 이는 요소를 교체하거나, 이웃 요소를 비교하거나, 하위 범위를 순회하는 데 유용합니다.

for (int i = 0; i < obj.length; i++) {
    System.out.println("Element " + i);
    obj[i].showData();
}

강화 for 고리 ("for-each" 루프는) 인덱스를 숨겨 인덱스가 필요하지 않을 때 더 자연스럽게 읽을 수 있도록 합니다.

for (Account acc : obj) {
    acc.showData();
}

스트림(Java 8세 이상) 배열을 파이프라인으로 변환하면 필터링 및 매핑에 편리합니다.ping또는 루프를 작성하지 않고 집계하는 방법:

import java.util.Arrays;

Arrays.stream(obj)
      .filter(acc -> acc.a > 0)
      .forEach(Account::showData);

예를 들어, 단일 요소를 읽거나 업데이트하려면 직접 인덱스 접근 방식을 사용하십시오. obj[1].setData(10, 20)항상 먼저 길이를 확인하세요. obj.length 피하기 위해 ArrayIndexOutOfBoundsException어떤 슬롯이든 될 수 있습니다. null널 체크 또는 다른 방법으로 접근을 보호하십시오. Optional 프로그램이 충돌하지 않고 계속 실행되도록 하기 위해서입니다.

객체 배열과 객체 ArrayList의 차이점 Java

단순한 객체 배열은 빠르고 예측 가능하지만, 실행 중에 객체 개수가 변경되는 순간 고정된 크기가 제약 요소가 됩니다. Java's 컬렉션 프레임워크는 다음을 제공합니다. ArrayList 역동적인 대안으로서, 아래 표는 각 선택이 적절한 경우를 보여줍니다.

제품 특장점객체 배열객체 배열 목록
중량생성 시 고정됨자동으로 커지고 작아집니다.
선언Account[] a = new Account[5];List<Account> list = new ArrayList<>();
접근 요소a[i]list.get(i)
요소 추가생성 후에는 지원되지 않습니다.list.add(obj)
형식 안전성컴파일 타임에 선언에 의해 타입이 지정됩니다.컴파일 시점에 제네릭이 적용됩니다.
성능색인된 읽기 속도가 약간 더 빠릅니다.상각된 O(1) 추가, 요소당 약간의 오버헤드
선호하는 경우크기는 알려져 있고 고정되어 있습니다.크기를 알 수 없거나 런타임에 변경될 수 있습니다.

메모리 사용량을 최소화하고 예측 가능한 인덱싱이 중요한 경우, 예를 들어 매트릭스 레이아웃이나 성능이 중요한 핫 패스에서 배열을 사용하십시오. ArrayList 대부분의 일상적인 애플리케이션 코드에서는 재할당 없이 요소를 추가하고 제거할 수 있는 기능이 요소당 약간의 오버헤드보다 훨씬 중요하기 때문입니다.

자주 묻는 질문

객체 배열 Java `scheduled`는 동일한 클래스의 인스턴스에 대한 참조를 저장하는 고정 크기 컨테이너입니다. 각 슬롯은 힙에 있는 객체를 가리키며, 요소는 대괄호를 사용하여 0부터 시작하는 인덱스로 접근할 수 있습니다.

ClassName[] arr = new ClassName[size]와 같이 배열을 선언한 다음, 루프를 사용하거나 배열 리터럴을 직접 사용하여 new ClassName()으로 각 객체를 생성합니다. 두 단계 모두 필요하며, 첫 번째 단계는 참조 슬롯만 할당합니다.

`new ClassName[size]`는 배열 자체만 할당하기 때문입니다. 모든 슬롯은 처음에 null로 시작하므로 해당 슬롯의 메서드를 호출하면 NullPointerException이 발생합니다. 이 문제를 해결하려면 사용하기 전에 각 인덱스에 `new ClassName()`을 할당하십시오.

배열은 생성 시 크기가 고정되는 반면, ArrayList는 크기가 자동으로 늘어나고 줄어듭니다. 배열은 인덱스를 이용한 읽기 속도가 약간 더 빠르지만, ArrayList는 일상적인 애플리케이션 코드에서 편리하게 사용할 수 있는 추가, 삭제 및 스트림 메서드를 제공합니다.

인덱스가 필요할 때는 `arr.length`를 사용하는 일반적인 `for` 루프를 사용하고, 간단한 반복에는 `for-each` 루프를 사용하세요. 필터링이나 변환이 필요한 경우에는 배열을 `Arrays.stream(arr)`로 감싸고 필요한 파이프라인을 연결하세요.

매개변수를 ClassName[] name으로 선언한 다음, 배열 변수를 사용하여 메서드를 호출합니다. Java 배열 참조를 값으로 전달하므로 메서드 내부에서 요소 필드에 대한 변경 사항이 호출자에게 표시됩니다.

머신러닝 기반 코드 생성기는 2단계 할당 패턴을 인식하고 초보자들이 자주 잊어버리는 누락된 `new ClassName()` 줄을 자동으로 채워줍니다. 또한 대상 컬렉션 크기를 알 수 없을 때는 `ArrayList`를 제안하여 `NullPointerException` 오류를 줄여줍니다.

예. GitHub Copilot은 도메인 모델을 설명하는 주석을 기반으로 배열 선언, 생성자 루프, 반복 블록 및 ArrayList 변환을 생성합니다. Rev생성자 인자가 올바른지, null 값을 안전하게 처리하는지 확인한 후 사용하십시오.

이 게시물을 요약하면 다음과 같습니다.