STUDY/JAVA

[JAVA] 배열

aftersep 2022. 3. 16. 23:21

배열 타입

 

같은 타입의 데이터(여러 변수)를 하나의 묶음에 저장하는 자료구조.

각 데이터 저장 위치는 인덱스를 부여해 접근한다.

변수와 달리 각 저장공간이 연속적으로 배치되어 있다는 특징이 있다.

 

많은 양의 데이터를 저장하기 위해 그 데이터의 숫자만큼 변수를 선언해야 한다면

매우 번거롭기 때문에 배열을 이용하면 편리할 것이다.

 

코딩테스트에서 가장 중요한 부분

자바를 기본으로 하고 배열을 정복하기

 

 

배열의 선언과 생성

타입[ ] 변수이름;

타입 변수이름[ ];

 

배열을 선언한 다음에는 배열을 생성해야 한다. 배열을 생성하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이기 때문이다.

배열을 생성하기 위해서는 연산자 new와 함께 타입과 길이를 지정해 주어야 한다.

 

 

자바 언어에서 배열은 한 번 생성하면 두 가지를 바꿀 수가 없다.

(1) 배열 원소의 타입

(ex. int 였는데 double로 바꿀 수 없다.)

(2) 배열의 크기(길이 = 원소의 개수

 

 

배열의 길이와 인덱스

 

생성된 배열의 각 저장공간을 배열의 요소라고 하며, 배열이름[인덱스]의 형식으로 배열의 요소에 접근한다.

이를 "Indexing인덱싱"이라고 한다. 인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다.

인덱스의 범위는 0부터 배열길이-1까지이다.

 

인덱스로 상수 대신 변수나 수식을 사용할 수도 있다.

 

인덱스로 상수 대신 i를 사용하고, for문으로 변수 i의 값을 0부터 3 미만까지 증가시킨다.

빨간 줄이 쳐진 부분 : 논리 주소

 

 

배열이름.length

 

자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며

'배열이름.length'를 통해 배열의 길이에 대한 정보를 얻을 수 있다. 

배열은 한 번 생성하면 길이를 변경할 수 없기 때문에 이미 생성된 배열의 길이는 변하지 않는다.

==> 따라서 배열이름.length는 상수다. 값을 읽을 수만 있고 변경할 수 없다.

mathScores의 "길이"

 

배열의 길이 변경하는 방법

1. 더 큰 배열을 새로 생성한다.

2. 기존 배열의 내용을 새로운 배열에 복사한다.

 

 

값 목록으로 배열 생성하는 방법

변수 선언과 동시에 값 목록 대입

데이터타입[] 변수 = ( 값 0, 값 1, 값 2, ...};

 

 

변수 선언 후 목록 대입

데이터타입[] 변수;

변수 = new 타입[] { 값 0, 값 1, 값 2 ...};

 

 

ex) 길이가 5인 int배열

int [ ] scores;

score = new int [5];

 

or

 

타입 [ ] 변수이름 = new 타입 [ 길이 ];

int score = new int [5];

 

배열 구조에서 인덱스 번호는 0부터 시작한다. 0부터 하는 것이 더 효율적이다.

 

 

참조타입명.속성명 =>

참조타입의 주소에 해당하는 객체의 속성에 접근하는 방법

'.': 객체멤버참조연산자

 

 

new 연산자로 배열 설정

배열 생성시 값 목록을 가지고 있지 않음

향후 값들을 저장할 배열을 미리 생성하고 싶을 경우

 

타입[] 변수 = new 타입[길이];

타입[] 변수 = null;

변수 = new 타입[길이];

 

int[] intArray  = new int[5];

 

배열의 초기화

 

배열은 생성과 동시에 자동적으로 자신의 타입에 해당되는 기본값으로 초기화되므로 배열을 사용하기 전에 따로 초기화를 해주지 않아도 되지만, 원하는 값을 저장하려면 각 요소마다 값을 지정해주어야 한다.

값을 주지 않고 공간만 확보한 배열

왜 값은 0이 나오는가?

= 기본값으로 초기화되므로 0만 나오게 된다.

 

사용가능한 인덱스 범위 내에서 써야 한다.

 

 

 

자바 언어의 이름(식별자 identifier)을 짓는 규칙:

(1) 영문대/소문자, 숫자

(2) '_', '$'만 가능하다.

(3) 첫번째 문자가 숫자로 시작할 수 없다. 

name1(OK), 1name(X), _name1(OK), $name1(OK)

(4) 기본적으로 camel기법 적용

(5) 변수명: 소문자(특수기호)로 시작

    클래스명: 대문자로 시작

    메소드명: 소문자로 시작

 

 

배열의 차원

배열의 차원이란 배열 안의 배열을 의미 (시공간x)

* 1차원 배열: 배열의 원소가 하나의 값(스칼라 Scalar)

int[] arr1 = {1, 2, 3};

 

* 2차원 배열

int [][] arr2= { 

                   {1, 2},

                   {3, 4}

};

 

arr2[0][0] = 100;

arr2[0][1] = 200;

arr2[1][0] = 300;

arr2[1][1] = 400; 

 

행이 2개, 열도 2개

엑셀에서의 table과 유사한 형태

 

- 2차원 배열(3x2)

int[][] arr2 = {

         {1, 2},

         {3, 4},

         {5, 6},

};

 

* 3차원 배열

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

 

arr3[0][0][0] = 100;

arr3[0][0][1] = 200;

 

 

 

 

int타입의 기본값 0

 

배열 안의 배열의 길이

 

 

배열 복사

배열은 한 번 생성하면 크기 변경이 불가능하다.

더 많은 저장 공간이 필요하다면 보다큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사해야 한다.

배열의 길이는 int범위의 양의 정수(0도 포함)이어야 한다.

 

 

배열을 복사하는 방법

 

- for문을 이용

int[] arr = new int[5];
 
int [] tmp = new int[arr.length*2];
 
for(int i = 0; o < arr.length; i++)
tmp[i] = arr[i]; // arr [i]의 값을 tmp[i]에 저장
 
arr = tmp;

- System.arrayCopy() 메소드 이용

* 배열의 복사를 할 때 for문보다 이 방법이 더 효율적이다.

for 문은 배열의 요소 하나하나에 접근하여 복사하지만 arraycopy()는 지정된 범위의 값들을 한 번에 통째로 복사한다.각 요소들이 연속적으로 저장되어 있다는 배열의 특성때문에 이처럼 처리하는 것이 가능하다.

 

- Arrays 클래스 이용

 

 
 

 




 

참고문헌: 이것은 자바다, 자바의 정석

'STUDY > JAVA' 카테고리의 다른 글

[JAVA] 상속  (0) 2022.03.21
[JAVA] 이클립스 자바 파일 내보내기 Export  (0) 2022.03.20
[JAVA] 객체 지향 프로그래밍  (0) 2022.03.14
[JAVA] 제어문 - 반복문  (0) 2022.03.13
[JAVA] 제어문 - 조건문  (0) 2022.03.13