JAVA 웹 개발 패키지 - 패스트캠퍼스/Chapter2

배열 ( array ) - 기본자료형 / 객체

giggs 2021. 12. 30. 10:55

 

자료를 순차적으로 한꺼번에 관리하는 방법 - 배열(array)

 

기본자료형 배열(int, double 등)  / 객체(Stdent, Employee 등) 배열

배열이란?

  • 동일한 자료형의 순차적 자료 구조 ( int 면 int 끼리 / 논리적 물리적으로 순차적 위치 )
  • 인덱스 연산자[ ]를 이용하여 빠른 참조가 가능 ( 0부터 시작 n-1까지 )
  • 물리적 위치와 논리적 위치가 동일 ( 순차적 구조 )
  • 배열의 순서는 0부터 시작
  • 몇 번째 위치하는 데이터 호출하는데 빠르다.
  • 자바에서는 객체 배열을 구현한 ArrayList를 많이 활용함

 

배열의 경우 데이터가 중간에 없으면 안 된다. 쭉 연결되어있어야 한다.

중간에 데이터를 뺄 거다 넣을 거다 하면 뒤에 있는 앞에 있는 요소들의 추가 작업 필요

 

 


 

 

 

기본 자료형 배열 선언과 초기화

 

  • 배열 선언하기
int[] arr1 = new int[10];
int arr2[] = new int[10];

[ ] 순서는 상관없지만 int [ ] ~~ 방식으로 주로 사용

 

  • 배열 초기화 하기

배열은 선언과 동시에 자료형에 따라 초기화됨 ( 정수는 0, 실수는 0.0, 객체는 null)

필요에 따라 초기값을 지정할 수 있음

int[] numbers = new int[] {10, 20, 30};  //개수 생략해야 함

int[] numbers = {10, 20, 30};            // new int[]  생략 가능 / 선언과 동시에 초기화 할때만 사용

int[] ids; 
ids = new int[] {10, 20, 30};            // 선언 후 배열을 생성하는 경우는 new int[] 생략할 수 없음

 

배열 사용하기

  • [ ] 인덱스 연산자 활용 - 배열 요소가 저장된 메모리의 위치를 연산하여 찾아 줌
  • 배열을 이용하여 합을 구하기
int[] arr = new int[10];
int total = 0;
		
		
for(int i=0, num=1; i< arr.length; i++, num++) {
	arr[i] = num;
}
		
for( int i =0; i<arr.length; i++) {
	total += arr[i];	
}
System.out.println(total);

 

배열의 길이와 요소의 개수는 동일하지 않습니다.

  • 배열을 선언하면 개수만큼 메모리가 할당되지만, 실제 요소(데이터)가 없는 경우도 있음
  • 배열의 length 속성은 배열의 개수를 반환해주기 때문에 요소의 개수와는 다름
  • length를 활용하여 오류가 나는 경우
  •  
double[] dArr = new double[5];
		
dArr[0] = 1.1;  
dArr[1] = 2.1; 
dArr[2] = 3.1; 
		
double mtotal = 1;
for(int i = 0; i< dArr.length; i++) {
	mtotal *= dArr[i];
}
		
System.out.println(mtotal); //0출력
  • 요소의 값이 없는 경우 디폴트 0의 값도 곱해져서 0 출력 - 배열에 할당된 개수와 요소가 맞지 않아서
  • 요소의 개수에 대한 변수(count)를 따로 유지.
double[] dArr = new double[5];
int count = 0;
dArr[0] = 1.1; count++; 
dArr[1] = 2.1; count++;
dArr[2] = 3.1; count++;
		
double mtotal = 1;
for(int i = 0; i< count; i++) {
	mtotal *= dArr[i];
}
		
System.out.println(mtotal);

 

 


 

 

문자 배열을 만들어 A-Z까지 배열에 저장하고 이를 다시 출력하기

 

향상된 for문 사용하기

배열의 n개 요소를 0부터 n-1까지 순차적으로 순회할 때 간단하게 사용할 수 있음

for( 변수 : 배열) {

}

 

 

 

 

 

 

 

char 배열 선언 [ 26 ]

 

 

배열 길이만큼 반복되도록 for문

 

 

향상된 for 문 사용

 

 

출력 확인 

글자도 결국엔 정수다.

 

GOOD :)

 

 

 

 

 

 

 


 

 

 

 

객체 배열 선언과 구현

 

기본 자료형 배열은 선언과 동시에 배열의 크기만큼의 메모리가 할당되지만,

객체 배열의 경우엔 요소가 되는 객체의 주소가 들어갈(4바이트, 8바이트) 메모리만 할당되고(null)

각 요소 객체는 생성하여 저장해야 함

 

 

library 5개가 잡히는 것이 아니라 library 주소를 저장할 방만 5개 잡힌다.

객체가 잡히는 것이 아니라 객체는 하나하나 만들어야 된다.

 

 

 

 

 

 

 

 

 

변수 선언

 

디폴트 생성자와

생성자 하나 추가

 

 

 

 

 

 

get /set 

 

 

 

 

 

 

출력 생성자

 

 

 


 

 

 

 

 

객체 배열 선언

 

각 배열 값 확인

 

 

 

초기값 null 확인

 

배열 선언만으로는

객체가 들어간 것이 아니라

객체가 들어갈 주소만 할당된 것

들어갈 객체는 하나하나

new로 넣어주어야 함

 

 

 


 

 

 

 

 

 

 

 

객체 배열 선언 후

 

 

 

각 객체 생성

 

 

 

 

출력

 

 

 

 

각 주소 값 다르게 잘 출력됨

각 객체 값 입력되어서 잘 출력

 

확인 GOOD :)

 

 

 

 

 

 

 

 


 

객체 배열 복사하기 - 가벼운 복사와 깊은 복사

 

배열 복사시 복사할 배열이 들어갈 위치 공간이 충분한지,

몇 번째부터 몇 번째까지 복사할지 생각

 

 

가벼운 복사

System.arrayCopy(src, srcPos, dest, destPos, length) 자바에서 제공되는 배열 복사 메서드

얕은 복사 - 즉, 두 배열이 같은 객체를 가리킴

객체 주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정됨

 

 

 

 

 

 

 

copy 배열 선언

 

 

 

 

copy 메서드 사용

 

 

원래 배열 주소와 객체 값 출력

 

 

복사 배열 주소와 객체 값 출력

 

 

 

 

 

 

 

 

 

배열 복사 잘 되었음 - 확인

 

객체가 가리키는 주소 값이 같음 - 확인

 

두 배열이 같은 객체를 가리킴 - 확인

 

객체 주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정됨!

 

- 가벼운 복사 ( 얕은 복사 )

 

 

 

 

 

 

 

 

 

 

 

 

 

깊은 복사

각각의 객체를 생성하여 그 객체의 값을 복사하여 배열이 서로 다른 객체를 가리키도록 함

 

 

 

 

 

copylibrary 배열 선언

 

 

 

 

기본 상태로

copylibrary - Book 만들어준다.

 

 

주소만 복사해주는 메서드 X

직접 엘리먼트 하나하나 돌면서

그 값을 집어넣어 줘야 한다.

 

 

 

두 배열의 주소 값 다름 - 확인

 

library의

첫 번째 배열의 값 변경 시

출력 값 변화 확인

 

library의 값은 변화

copyllibrary의 값은 변화 X

 

주소 값만 복사해 온 것이 아니라

직접 엘리먼트를 복사해서

새로운 주소로 줬기 때문에

같이 변화하지 않는다!

 

확인 GOOD:)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

review

배열
기본자료형, 객체형,  length, 초기화, for(변수:배열){}, arrycopy

후후 
배열을 사용할때 초기화도 중요하고,
배열의 길이와 요소의 길이도 생각해야 했다.
모든 배열 사용할 때는 length, 아닐때나 정한 횟수만큼 사용원할땐 count++
 배열 복사는 copyarry 메서드 와 for문 사용해서 새로운 주소 값에 복사

배열을 배우기 전에 다른 예제들을 할때는
library에 title과 author를 선언해놓고, 사용할 때는 따로따로 불러와야 했었다.
배열을 배우고 보니 이제 사용할 때 library 배열 몇 번째 위치한 거 불러오면 끝!
WoW 배열을 사용하면 빠른 참조가 가능하고, 몇 번째 데이터 호출하는데 빠르다고 하였는데,
배열을 많이 활용해 본 것은 아니지만 어떤 의미인지 알 수 있었다.
GOOD :)