Java에서 객체 배열 만들기
저는 Java에 익숙하지 않아서 한동안 Java에서 객체 배열을 만들었습니다.
예를 들어 클래스 A가 있습니다.
A[] arr = new A[4];
다만, 이것은, 에 대한 포인터(참조)를 작성하는 것에 지나지 않습니다.A
4개의 오브젝트가 아니라이거 맞는건가요?작성한 오브젝트의 함수/변수에 액세스하려고 하면 늘 포인터 예외가 발생한다는 것을 알 수 있습니다.오브젝트를 조작/액세스 하려면 , 다음의 조작이 필요했습니다.
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]
델은, 델이 필요로 하는 것은,int
s, 사이즈 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에서는 객체 배열을 만드는 몇 가지 단계가 있습니다.
선언 후 인스턴스화('4' 개체를 저장할 메모리 생성):
A[ ] arr = new A[4];
오브젝트 초기화(이 경우 클래스 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
'programing' 카테고리의 다른 글
Vue-Router를 사용할 때 컴포넌트 간에 데이터를 전달하는 방법 (0) | 2022.07.12 |
---|---|
Vue 라우터와 VueJ의 반응성 (0) | 2022.07.12 |
왜 GCC는 거의 동일한 C코드에 대해 이렇게 근본적으로 다른 어셈블리를 생성합니까? (0) | 2022.07.12 |
오브젝트 배열 - Vue.js 생태계 내의 오브젝트를 올바르게 갱신하는 방법 (0) | 2022.07.12 |
Vue 구성 요소에서 비동기 결과를 기다리는 올바른 방법 (0) | 2022.07.12 |