배열
동일한 데이터가 연속적, 순차적으로 있는 자료 구조(물리적,논리적 순차적 자료 구조)
- 왜 써야할까???
- 정수 20개를 이용해서 프로그래밍한다고 치자. 그러면 20개의 정수 타입의 변수를 선언해야한다. 하지만, 배열을 사용하면 동일한 자료형의 변수를 한꺼번에 순차적으로 관리를 할 수 있기때문에 관리가 용이하다.
배열의 index는 0부터 시작!- 배열의 길이 n 이라고 하면 인덱스는 0 ~ n-1
- 배열은 쓰기 전에 먼저 몇 개를 사용할 것인지(fixed length) 선언하고 사용!(미리 메모리가 할당)
- 배열을 사용할 때 중간에 자료가 비면(empty) 안된다.
- 배열에 원소를 추가하고 싶으면 새로운 배열을 만들어서 다시 복사해야한다. 동적으로 늘어나거나 줄어들지 않기에
배열 선언하기
자료형[ ] 배열이름 = new 자료형[개수];
int[ ] arr = new int[10];
자료형 배열이름[ ] = new 자료형[개수];
int arr[ ] = new int[10];
이렇게 선언을 하면, int는 4byte를 할당하니까, 배열의 길이가 10, 그래서 40byte의 메모리가 할당된다.
배열 초기화
배열은 선언과 동시에 초기화 할 수 있음
배열을 초기화 할 때는 배열의 개수를 명시하지 않음
int[ ] studentIDs = new int[ ]{101,102,103} //개수는 생략해야함
int[ ] studentIDs = new int[3]{101,102,103} //오류 발생
int[ ] studentIDs = {101,102,103} //int형 요소가 3개인 배열 생성
만약 초기화 없이 선언한 경우, 정수는 0, 실수는 0.0, 객체배열은 null로 초기화 된다.
배열 사용하기
[ ] : 인덱스 혹은 첨자 연산자
배열의 위치를 지정하여 자료를 가져옴
모든 배열의 순서는 0부터 시작
n개 배열은 0부터 n-1 위치까지 자료가 존재
ex)int[ ] num = new int[ ]{1,2,3,4,5,6,7,8,9,10};
배열의 길이와 유효한 요소 값
배열의 길이의 속성 : length
자료가 있는 요소만 출력 하려면 크기에 대한 저장을 따로 해야 함
(아래 예제에서 전체 길이로 곱하기를 하면 값은 0.0이 되어 버림)
public class ArrayTest2{
public static void main(String[] args) {
double[] data = new double[5];
data[0] = 10.0; // 첫 번째 요소에 값 10.0 대입
data[1] = 20.0; // 두 번째 요소에 값 20.0 대입
data[2] = 30.0; // 세 번째 요소에 값 30.0 대입
for(int i=0; i < data.length; i++) {
System.out.println(data[i]);
}
}
}
double 자료형의 배열이 만들어지는데 , 0,1,2 는 데이터가 있는데 3,4 인덱스는 데이터가 없으므로 0.0으로 초기화 되어있다. 그래서 출력을하면, 10.0,20.0,30.0,0.0,0.0 이 출력이되는데, 10.0,20.0,30.0만 출력을 하려면 data.length를 for문에 쓰지말고 <3을 쓰면 된다.
이렇게 for문 반복수를 설정해주면된다.
package array;
public class ArrayTest2 {
public static void main(String[] args) {
double[] data = new double[5];
int size = 0;
data[0] = 10.0;
size++; // 첫 번째 요소에 값 10.0 대입 size는 하나씩 증가
data[1] = 20.0;
size++;// 두 번째 요소에 값 20.0 대입
data[2] = 30.0;
size++;// 세 번째 요소에 값 30.0 대입
double total = 1;
// length로 사용하면 0.0이나옴..
for (int i = 0; i < size; i++) {
System.out.println(data[i]);
total *= data[i];
}
System.out.println("total=" + total);
}
}
문자 배열 만들기
package array;
public class ArrayTest3 {
public static void main(String[] args) {
char[] alphabets = new char[26];
//길이가 26인 배열
char ch = 'A'; // 65
//i도 증가하지만 ch도 반복마다 증가시킴!
for (int i = 0; i < alphabets.length; i++, ch++) {
alphabets[i] = ch;
System.out.println(alphabets[i]);
}
}
}
이렇게 문자배열도 for문을 통해서 출력되는 것을 볼 수 있다.
객체 배열 만들기
- 참조 자료형을 선언하는 객체 배열
- 배열만 생성 한 경우 요소는 null로 초기화
- 각 요소를 new를 활용하여 생성하여 저장
public class BookArray {
public static void main(String[] args){
Book[] library = new Book[5];
for(int i=0; i<library.length; i++){
System.out.println(library[i]);
}
}
}
배열의 복사
System.arraycopy(src,srcPos,des,desPos,length);
매개변수 | 설명 |
---|---|
src | 복사할 배열 이름 |
srcPos | 복사할 배열의 첫 번째 위치 |
dest | 복사해서 붙여 넣을 대상 배열 이름 |
destPos | 복사해서 대상 배열에 붙여 넣기를 시작할 첫 번째 위치 |
length | src에서 dest로 자료를 복사할 요소 개수 |
객체 배열 복사
System.arraycopy()
를 통해서 복사를 하게되면, 객체 자체의 값을 복사하는 것이 아니라 주소 값이 복사되게 된다. 그래서 만약, 같은 주소를 가진 객체의 값이 바뀌게 되면, 같은 주소를 가진 속성들은 똑같이 변하게 된다.
https://www.inflearn.com Do it! 자바 프로그래밍 입문 with 은종쌤