배열 메소드 (1)

 

 

배열

 

 

1차원 배열

 

같은 자료형이 여러개 연속될 때 배열로 쉽게 관리할 수 있음

인덱스는 항상 0부터 시작됨

선언 : 자료형[] 변수명 = new 자료형[개수];

배열을 선언할 때는 크기(개수)를 지정해줘야함!

크기를 지정안하고 넣는만큼 크기가 지정되는 배열을 쓰고 싶다면 ArrayList를 사용하면 된다.

 

 

여러가지 배열 선언하는 방법

 

// 배열을 선언하면 '= new 자료형[요소 개수]' 을 해줘야함
int[] arr = new int[5];

// 중괄호{} 안에 요소를 전부 작성해주면 요소 개수는 생략할 수 있다
int[] arr2 = new int[]{1, 2, 3, 4, 5};

// 바로 요소 중괄호에 넣어주면 이렇게 줄여쓸 수도 있다
int[] arr3 = {1, 2, 3, 4, 5};

// 선언하면서 초기화해도 되지만 이렇게 선언하고 나중에 new int[]라고 작성해줘도 된다
// 그런데 이때는 new int[] 생략하면 안된다
int[] arr4;
arr4 = new int[5];

// 이것도 당연히 된다
int[] arr5;
arr5 = new int[]{1, 2, 3, 4, 5};

 

 

배열은 기본타입 변수가 아니고 참조타입 변수이기 때문에

변수 안에 값을 가지고 있는것이 아니라 실제로 배열의 요소 값들이 저장되 있는 주소를 가지고 있다

왜 주소값을 갖고 있는가?

기본타입은 선언할 때 메모리를 얼마나 할당할지 정해진다.

예를 들어 int는 4byte, char는 2byte 이렇게 메모리 공간이 정해져 있어서 어떤 값을 넣든

선언한 타입의 사이즈에 맞게 메모리 크기를 정하는데

배열은 메모리를 얼마나 할당해야하는지가 매번 다르다.

이러면 선언할 때마다 할당해야하는 크기를 알 수 없기 때문에 변수에는 주소값만 가지고 있고 값은 해당하는 주소에 차례대로 넣는게 효율적이다.

 

 

인덱스 연산자

 

배열의 구조

 

배열의 인덱스는 언제나 0부터 시작

배열에서 인덱스에 접근하려면

변수명[인덱스] = 넣을 값;

여러개의 인덱스에 한 번에 값을 넣고 싶으면 for문 사용하면 됨

 

배열의 길이

배열에 기본적으로 있는 메소드 length를 사용하면 길이 정수 값으로 가질 수 있음

주의 ⚠️) String의 길이를 구할 때는 괄호()를 쓰지만 배열의 길이는 뒤에 괄호를 쓰면 오류남!

int[] arr = {2, 4, 6, 8, 10};
System.out.println(arr.lenghth);	// '5' 출력됨
System.out.println(arr.length());	// ERROR!

 

배열의 인덱스는 0부터 시작 → 마지막 인덱스에 +1 한 값이 배열의 길이 (length)

배열의 길이는 0부터 시작 (데이터 저장 못함)

// 길이 0인 배열 만들기
int[] arr = new int[0];
int[] arr = new int[]{};

 

 

배열의 요소를 toString으로 출력하기

 

Arrays 클래스가 가지고 있는 toString 메소드를 이용하면 배열의 목록을 쉽게 출력할 수 있다.

이때 Arrays로 불러오는지 배열이름으로 불러오는지에 따라 값이 다르게 나온다.

 

int[] arr = {1, 3, 5, 7, 9};

System.out.println(Arrays.toString(arr));		// [1, 3, 5, 7, 9] 출력

System.out.println(arr.toString());			// 주소값 출력

 

<출력결과>

[1, 3, 5, 7, 9]
[I@6979e8cb

 

'Arrays.toString(배열이름)' 을 사용하면 [ ] 안에 요소를 순서대로 출력할 수 있다.

'배열이름.toString()' 을 사용하면 주소 값이 문자열 형태로 출력된다.

 

 

다차원 배열

 

배열 안에 배열이 중첩되있는 모양

다차원 배열에는 2차원, 3차원 배열 등이 있음

2차원 이상 배열을 선언하는 규칙은 1차원 배열을 선언하는 규칙과 똑같음

 

 

2차원 배열

 

2차원 배열의 구조

 

 

2차원 배열을 출력하려고 Arrays.toString을 사용하게 되면

// 2차원 배열 선언
int[][] dimension = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

// Arrays.toString 으로 출력해보기
System.out.println(Arrays.toString(dimension));

 

  <출력값>

[[I@26f67b76, [I@153f5a29, [I@7f560810]

??

출력값이 주소값으로 나온다.

왜냐하면 다차원 배열은 배열안에 배열이 있는 구조이기 때문이다.

 

Solution

 

1. 반복문 사용하기

for 문으로 배열 값을 하나씩 출력해주는 방법도 있다.

이 방법은 쉽지만 for 문을 2중으로 중첩해야 해서 좀 귀찮은 방법이다.

 

2. deepToString() 메소드 이용하기

java.util.Arrays 안에 있는 deepToString()메소드를 사용하면 다차원 배열을 쉽게 출력할 수 있다.

System.out.println(Arrays.deepToString(dimension));

<출력값>

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

 

 

가변 배열

 

2차원 이상의 다차원 배열에서는 1차원 배열과는 다르게 배열의 공간을 자유롭게 만들 수 있다.

다차원 배열은 배열안에 배열이 들어가있는 형태이다.

따라서 배열의 마지막 차수의 크기를 지정하지 않고, 크기가 다 다르게 지정되게끔 만들 수 있다.

 

int[][] var = new int[10][];	// 배열의 열부분 크기 지정 안하면 가변배열

마지막 차수의 크기를 비워놓고 배열안의 배열의 크기를 각각 다르게 배열을 넣어주면

각각 크기가 다르게 생성된다.

 

 

 

배열의 복사

 

배열을 복사하는 방법 중에 가장 

배열을 복사하고자 할 떄는 System.arraycopy() 메소드를 사용 

System.arraycopy(src, srcPos, dest, destPos, length)

→ 매개변수 순서대로 복사할 배열, 복사 시작할 인덱스, 붙여넣을 배열, 붙여넣기 시작할 인덱스, 복사할 배열의 길이

 

int[] arr1 = new int[] {1, 2, 3, 4, 5};
int[] arr2 = new int[arr1.length];

// System.arraycopy를 이용한 복사
System.arraycopy(arr1, 0, arr2, 0, arr1.length);

System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.toString(arr2));

 

<출력 결과>

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

 

 

1