자바(Java)- 배열

지원·2023년 9월 2일

Java Programming

목록 보기
20/25

배열


  • 참조 타입

  • 같은 타입의 변수가 여러 개 필요할 때 사용한다.

기본형 배열

  • 배열은 기본형 배열과 참조형 배열로 나뉜다.

  • 기본형 배열: boolean, byte, char, int, long, float, double 타입의 변수를 여러 개 선언할 필요가 있을 때 사용한다.

    	기본형[] 변수명;
    	기본형타입 변수명[];
int[] array1;
int array2[2];
int array3[];

array1, array2, array3는 현재 배열 객체를 참조해야 한다. 하지만 아무 값도 초기화하지 않았으므로 null을 참조하므로 array1을 작업하면 nullPointException 발생

array1 = new int[5];

정수형 변수 5개를 배열로 만들건데, array1이 이것을 참조한다.

array3 = new int[0];

정수를 아무것도 가질 수 없는 배열을 생성하는 것이다.

int[] array1, array2;
int array3[], array4;
  • int형 배열 두 개를 선언하는 것이다.
  • int형 배열 하나와, int형 변수 하나를 선언하는 것이다.

초기값 포함하여 선언

기본형타입[] 변수명 = new 기본형타입[배열의크기];
변수명[index값] = 값;
// 선언과 동시에 초기값 설정
기본형타입[] 변수명 = new 기본형타입[]{ 값1, 값2, ... };
기본형타입[] 변수명 = {값1, 값2, 값3, ...};
  • 첫번째 경우는,
    - 값을 입력받아서 배열에 넣어줄 때
    - 파일의 값을 읽어들여서 넣어줄 때 등
    - 배열의 크기만 선언하고 값을 넣어주지 않으면 0이 들어간다.

참조형 배열

  • 배열의 타입이 기본형이 아닌 경우

  • 배열 변수가 참조하는 배열의 공간이 값을 참조한다는 의미이다.

예제

public class ItemForArray {
	private int price;
    private String name;
   	public ItemForArray(int price, String name) {
    	this.price = price;
        this.name = name;
	}
    
    public int getPrice() {
    	return price;
	}
    
    public String getName() {
    	return name;
	}
  • ItemForArray클래스는 privatepricename을 선언

  • 클래스 이름과 이름이 같은 생성자 생성ItemForArray

  • pricename을 초기화하기 위해 파라미터로 받아와서 this.price this.name과 같이 초기화
    -> 인스턴스를 생성할 때 두 변수명으로 초기화하겠다!

=> 생성할 때 값을 넣어주고 값을 바꿀 수 없는 클래스를 불변 클래스 라고 한다.

예제 2

ItemForArray[] array1;
ItemForArray array2[];

array1 = new ItemForArray[5];
array2 = new ItemForArray[5];
  • array1-> ItemForArray[]->ItemForArray[0]-> ItemForArray 인스턴스를 참조한다.
    하지만 지금 아무것도 참조하지 않으므려 null 상태

  • new라고 해서 ItemForArray가 인스턴스로 만들어진게 아니다.
    ->ItemForArray[5]배열만 만들어지는 것이다.

array1[0] = new ItemForArray(500, "양파");

-> array1[0]ItemForArray의 인스턴스를 참조할 수 있게 해야 한다.

System.out.println(array1[0].getName());
  • array1[0]가 참조하는 객체 ItemForArrayget메소드를 호출해라

ArrayIndexOutofBoundsException

double[] array = {1.5, 2.4, 3.5};

System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
  • array[3]는 범위에 벗어나므로 에러 발생

2차원 배열

타입[] [] 변수명 = new 타입[행의 수][열의 수];
변수명[행 인덱스][열 인덱스] = 값;

예제

int[][] array = new int[2][3];
array[0][0] = 0;
array[0][1] = 1;
array[0][2] = 2;

array[1][0] = 3;
array[1][1] = 4;
array[1][1] = 5;

for(int i = 0; i < array.length; i++){
	for(int j = 0; j < array[i].length; j++){
    	System.out.print(array[i][j] + "\t");
	}
    System.out.println();
}
  • array는 배열[2]을 참조하고 배열[2]는 배열[3]을 참조하는 상황이다.(배열[0]-> 배열[3], 배열[1] -> 배열[3])

2차원 배열 선언과 초기화

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

2차원 가변 배열의 선언과 초기화

타입[][] 변수명 = new 타입[행의 수][];
변수명[행의 인덱스] = new 타입[열의 수];

int[][] koreanScoreArray = new int[3][];
koreanScoreArray[0] = new int[20];
koreanScoreArray[1] = new int[19];
koreanScoreArray[2] = new int[21];

for each문

for(타입 변수명 : 배열명) {
	....   
}

예제

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

for(int i : array) {
	System.out.println(i);
}

예제 2

ItemForArray[] array = new ItemForArray[3];
array[0] = new ItemForArray(500, "사과");
array[1] = new ItemForArray(300, "바나나");
array[2] = new ItemForArray(900, "수박");

for(ItemForArray item : array) {
	System.out.println(item.getName());
    System.out.println(item.getPrice());
}

Arrays

  • 배열을 다룰 때 사용하는 유틸리티 클래스

예제

int[] copyFrom = {1,2,3};
int[] copyTo3 = copyFrom; // copyFrom이 참조하는 것을 copyTo3도 같은 것을 참조한다.
int[] copyTo = java.util.Arrays.copyOf(copyFrom, copyFrom.length); // copyFrom의 내용을 복사해서 참조한다.

for(int c : copyTo) {
	System.out.println(c);
}
System.out.println("--------------------");
int[] copyTo2 = java.util.Arrays.copyOf(copyFrom, 5);

for(int c : copyTo2) {
	System.out.println(c);
}

⭐️ 깊은 복사(Deep Copy) vs 얕은 복사(Shallow Copy)


import java.util.Arrays;
....
int[] copyTo = Arrays.copyOf(copyFrom, copyFrom.length);
...
// java.lang 패키지의 클래스는 import를 하지 않아도 사용 가능하다.

예제 2

import java.util.Arrays;
...
	int[] array1 = {1,2,3,4,5};
    




profile
우주 정복자

0개의 댓글