배열

Jaca·2021년 8월 14일
0

배열이란?

같은 타입의 여러 변수를 하나의 묶음을 다루는 것

배열의 길이

자바에서는 JVM이 모든 배열의 길이를 별도로 관리한다.

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

배열의 길이 변경하기

배열은 선언하면 길이를 변경할 수 없기때문에, 배열의 공간이 부족하다면 새로운배열을 생성하고, 새로운 배열에 복사해야한다.

얕은 복사와 깊은 복사

배열의 복사에는 얕은 복사와 깊은 복사라는 것이 있다.
C의 포인터 같은 개념인데, 복사할 때 값만 가져오느냐, 참조 변수값 까지 가져오느냐 이다.

얕은 복사 : 주소 값까지 끌어옴
깊은 복사 : 값만 끌어옴

얕은 복사

간단하게 설명했지만, 얕은 복사를 하게되면 두 객체의 참조변수가 같아서
한 쪽의 값을 변경하게되면 두개의 객체에서 모두 영향을 끼치게 된다.

a,b의 주소값이 같고, 한 쪽의 값만 변경했지만 둘 다 변하는 것을 볼 수 있다.

깊은 복사

하지만 이러한 결과를 위해 복사하는 경우는 나에게는 별로 없었다.
원본 배열의 값을 변화시키지 않고 배열의 값을 조작하고 싶을땐 깊은 복사를 해야한다.

깊은 복사는 어떻게 할 수 있을까?

for문

int[] arr = new int[5];

int[] tmp = new int[arr.length * 2];
// 기존 배열보다 길이가 2배인 배열 생성

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

arr = tmp; //참조변수 arr를 tmp 배열을 가르키게 함.

이런 작업은 비용이 꽤 많이 들어, 처음부터 배열의 크기에 신중을 기하는 것이 좋다.

마지막 줄을 통해 arr의 참조변수를 tmp로 바꿔줌으로써, arr와 tmp는 같은 배열을 가리키게 된다.

배열은 참조변수를 통해서만 접근할 수 있기 때문에, 자신을 가리키는 참조변수가 없는 배열은 사용할 수 없다. 이렇게 쓸모없게된 배열은 가비지 컬렉터에 의해 제거된다.

2. System.arraycopy()

System 클래스의 arraycopy()를 사용하면 간단하고 빠르게 배열 복사를 할 수 있다. for문 보다 성능이 좋다.

  • Params :
    • src : 원본 데이터의 배열
    • srcPos : 원본 데이터에서 복사를 시작할 위치
    • dest : 복사한 데이터를 넣을 배열
    • destPos : dest의 어느 위치부터 넣을 것인가
    • length : 복사할 길이

a와 b의 참조값이 다른 것을 볼 수있다.

clone()

아주 간단하게 쓸수 있다.

String 배열

배열의 타입이 String 이어도 기본형 타입의 배열과 크게 다르지 않다.
하지만 String 타입은 참조형 변수 이므로 기본값은 null로 초기화 된다.

char 배열과 String 배열

사실 문자열인 String 배열은 '문자를 연이어 늘어놓은 것' 이므로
char 배열과 같은 뜻이다.

그런데 String 배열을 통해 문자열을 처리하는 이유는 String 클래스가 char배열에 여러가지 기능을 추가하여 확장한 것이기 때문이다.

char 배열 <-> String

가끔 char배열과 String의 변환이 필요할 때가 있다.
그럴 때 유용하게 써먹자

char[] chArr = {'A', 'B', 'C'};
String str = new String(chArr); // char[] -> String
char[] tmp = str.toCharArray(); // String -> char[]

그런데 책에선 다른 배열과 다르게 char[]은 그냥 출력시 String처럼 출력이 된다는데 나는 그냥 참조 주소가 나온다..? 자바 버전의 차이인가 IDE의 차이인가..?

가변 배열

자바에서 2차원 이상의 배열을 '배열의 배열'의 형태로 처리한다.
이러한 특성을 이용해서 배열의 마지막 차수의 길이를 가변적으로 설정해줄수 있다.

int[][] score = new int[5][]; // 2차원의 길이는 지정하지 않는다.
score[0] = new int[4];
score[1] = new int[3];
score[2] = new int[2];
score[3] = new int[2];
score[4] = new int[3];

이런식의 활용이 가능하다.
처음보는 방식이라 신박하다..

profile
I am me

0개의 댓글