심심한잉여의 잡동사니

JAVA - 1차원 배열 본문

코딩일기/Java

JAVA - 1차원 배열

심심한잉여 2021. 8. 12. 23:42
반응형

1차원 배열

배열은 같은 자료형의 변수를 하나의 묶음으로 다루는 것

배열은 저장 된 값마다 인덱스 번호가 0부터 시작함.

int[] num = new int[10];

위와 같이 코딩을 하여 사용이 가능하며
배열은 자료형 앞에 [ ] 를 붙여 사용한다.
이렇게 코드를 작성하게 되면 이 배열은 10개의 방이 생겼다고 볼 수 있다.

num[0], num[1], num[2], .... , num[9]
이렇게 0~9까지의 인덱스 번호가 부여되며 0부터 시작하니 총 10개의 방이 있는 것 이다.

int num[] = new int[10];

이렇게도 사용이 가능하지만
현업에서는 앞에 두는것이 더 좋다고 하였다.


배열의 저장구조

배열은 참조형으로 Heap영역에 저장되며 인덱스번호에 따라 메모리 값이 달라진다.
위 코드와 같이 10개의 방으로 작성한다면 int가 10개인 40byte가 할당 된 것이다.
일반 참조형 변수가 단독주택이라면 1차원 배열은 오피스텔에 가까운 느낌이였다.


배열의 초기화

배열의 초기화 방법은 크게 3가지로 나뉜다.

인덱스를 이용한 초기화

// 인덱스를 이용한 초기화
int[] arr = new int[10];

arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
.
.
.
arr[9] = 10;

// for문을 이용한 초기화

int[] arr2 = new int[10];

for(int i = 0 ; i < arr2.length; i++){
	arr[i] = i+1;
}

// 선언과 동시에 초기화
int[] arr3 = new int[]{1,2,3,4,5};

위 코드와 같이 3가지 방법으로 초기화가 가능하지만 보통 for문을 이용하여 초기화를 진행한다고 한다.


배열 얕은 복사

객체의 주소값만 가져와 참조형 변수에 저장하고 하나의 객체를 두변수가 참조하는 것

int[] arr1 = new int[4];

int[] arr2 = arr1;

얕은 복사는 위 코드와 같이 사용을 하며 해당 heap영역에 선언한 arr1의 주소값을 직접 가져오는 것이다.
개인적으로 이해하기로는 arr2라는 변수가 arr1이라는 변수한테 얹혀사는 모습으로 보였다.


배열 깊은 복사

새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사하는 것을 깊은 복사라고 한다.

위 그림과 같이 얕은복사와는 다르게 직접 힙 영역에 선언하여 새로운 주소값에 데이터를 넣는 방법이 깊은 복사이다.
얕은 복사와는 다르게 복사 후 정보를 수정해도 원본 데이터에는 영향이 없기 때문에 활용성이 높다.

방법은 대표적으로 4종류가 있으나 사실상 for문을 이용한 직접 복사하는 것이 현업에서 가장 많이 쓰인다고 했다.

이유는 범위를 직접 생각하고 값을 넣는 시간보다 직접 코딩을하면서 지정해주는 것이 더 빠르기 때문이라고 했다.

int[] arr1 = new int[5];
int[] arr2;

// 직접코딩으로 하는 깊은 복사

for(int i = 0; i<arr1.length;i++){
	arr2[i]=arr1[i];
}

// System을 활용 한 복사
System.arraycopy(arr1,0,arr2,0,arr.length); // (복사 할 배열, 시작인덱스, 복사받을 배열, 시작인덱스, 몇개를 복사할지)

// Arrays를 활용 한 복사
arr2 = Arrays.copyOF(arr1, arr1.length); // (복사 할 배열, 복사할 갯수)

// 클론을 활용 한 복사

arr2 = arr1.clone();

위 코드와 같이 복사의 4가지 방법을 알아보았다.


실습 - 깃허브 : https://github.com/thyum3891/kh_java_study/commit/6fefa6b8620e5df1e4203618beca6dd612a29b33

마치며 

배열에 들어오니 슬슬 과제를 하는데 많은 시간이 걸리고 머리가 멍해지는 경우도 있다.
계속해서 열심히 하다보면 괜찮아 지지않을까 해서 최대한 많은 과제를 풀 수 있도록 노력해야겠다.

반응형

'코딩일기 > Java' 카테고리의 다른 글

JAVA - OOP 객체 지향 프로그래밍  (0) 2021.08.18
JAVA - 2차원 배열  (0) 2021.08.16
JAVA - 반복문  (0) 2021.08.12
JAVA - 조건문  (0) 2021.08.10
JAVA - 연산자의 종류와 우선순위  (0) 2021.08.04