본문 바로가기
Java

[Java] 05. 배열과 ArrayList

by doozzuri 2020. 12. 7.
반응형

1. 배열(array)

- 자료가 연속으로 나열된 구조.

- 배열요소 : 배열을 이루는 각각의 자료. 배열 요소는 자료형(객체도 가능)이 모두같음.

- 배열을 선언하면 선언한 자료형과 배열 길이에 따라 메모리가 할당됨.

- length 속성 : 배열 길이를 나타냄. 처음에 선언한 배열의 전체 요소 개수.  

자료형[] 배열이름 = new 자료형[개수];
자료형 배열이름[] = new 자료형[개수];
int[] studentIDs = new int[10]; //int형 요소가 10개인 배열 선언
studentIDs.length	//10

 

2. 배열 초기화

- 배열의 선언과 동시에 각 요소의 값이 초기화됨.

- 정수는 0 , 실수는 0.0, 객체배열은 null 또는 특정값으로 초기화 가능.

int studentIDs = {102, 102, 103};	//선언과 동시에 특정값으로 초기화
int[] studentIDs;
studentIDs = new int[] {101, 102, 103}; //new int[] 생략 불가

 

3. 인덱스 연산자 []

- 인덱스 연산 : 배열 이름에 []를 사용하는것. 배열 요소가 저장된 메모리 위치를 찾아주는 역할.

- [i] 인덱스 연산을 하면 i번째 요소의 위치를 찾아 해당 위치의 메모리에 값을 넣거나 이미 저장되어있는 값을 가져와서 사용가능.

- 배열의 물리적 위치(메모리에 실제 저장되는 곳) 와 논리적 위치(이론상 배열 위치)는 같음

- 배열길이(배열 전체 요소 개수)가 n이면 배열 순서는 0부터 n-1번까지.

- [0]을 배열의 첫번째 요소라고함.

 

4. 배열 복사

- 사용 이유

 : 기존 배열과 자료형 및 배열 크기가 똑같은 배열을 새로 만들 때

 : 모든 요소에 자료가 꽉 차서 더 큰 배열을 만들어 기존 배열에 저장된 자료를 가져오려 할 때

- 방법 

 (1) 기존 배열과 같은길이 혹은 더 긴 배열을 만들어 for문으로 반복해서 복사.

 (2) System.arraycopy(src, srcPos, dest, destPos, length) 메서드 사용. 

  : System.arraycopy(복사할 배열, 복사할 첫 위치, 대상 배열, 붙여 넣을 첫 위치, 복사할 요소 개수)

 

- 객체 배열 복사 

 (1) 얕은 복사(shallow copy)

 : 객체 배열의 요소에 저장된 값은 인스턴스 자체가 아니고 인스턴스의 주소값이므로

  객체 배열을 복사할때 인스턴스를 따로 생성하는 게 아니라 기존 인스턴스의 주소값만 복사함.

  결국 두 배열의 서로 다른 요소가 같은 인스턴스를 가르키고 있으므로,

  복사되는 배열의 인스턴스값이 변경되면 두 배열 모두 영향을 받음.

public static voide main(String[] args){
    Book[] bookArray1 = new Book[3];
    Book[] bookArray2 = new Book[3];
    
    bookArray1[0] = new Book("태백산맥", "조정래");
    bookArray1[1] = new Book("데미안", "헤르만 헤세");
    bookArray1[2] = new Book("어떻게 살 것인가", "유시민");
    
    System.arraycopy(bookArray1, 0, bookArray2, 0, 3);
    
    /*bookArray1
    * 태백산맥, 조정래
    * 데미안, 헤르만 헤세
    * 어떻게 살 것인가, 유시민
    */
    
    /*bookArray2
    * 태백산맥, 조정래
    * 데미안, 헤르만 헤세
    * 어떻게 살 것인가, 유시민
    */
    
    bookArray1[0].setBookName("나무");
    bookArray1[0].setAutor("박완서");
    
     /*bookArray1
    * 나무, 박완서
    * 데미안, 헤르만 헤세
    * 어떻게 살 것인가, 유시민
    */
    
    /*bookArray2
    * 나무, 박완서
    * 데미안, 헤르만 헤세
    * 어떻게 살 것인가, 유시민
    */
}

 

 (2) 깊은 복사(deep copy)

 - 얕은 복사와 다르게 인스턴스를 따로 관리하고 싶다면 직접 인스턴스를 만들고 그 값을 복사해야함.

public static void main(String[] args){
    Book[] bookArray1 = new Book[3];
    Book[] bookArray2 = new Book[3];
    
    bookArray1[0] = new Book("태백산맥", "조정래");
    bookArray1[1] = new Book("데미안", "헤르만 헤세");
    bookArray1[2] = new Book("어떻게 살 것인가", "유시민");
    
    bookArray2[0] = new Book();	//디폴트 생성자로 bookArray2 배열 인스턴스 생성
    bookArray2[1] = new Book();
    bookArray2[2] = new Book();
    
    for(int i = 0; i < bookArray1.length; i++){
        bookArray2[i].setBookName(bookArray1[i].getBookName());
        bookArray2[i].setAuthor(bookArray1[i].getAuthor());
    } 
    
    /*bookArray1
    * 태백산맥, 조정래
    * 데미안, 헤르만 헤세
    * 어떻게 살 것인가, 유시민
    */
    
    /*bookArray2
    * 태백산맥, 조정래
    * 데미안, 헤르만 헤세
    * 어떻게 살 것인가, 유시민
    */
    
    bookArray1[0].setBookName("나무");
    bookArray1[0].setAutor("박완서");
    
     /*bookArray1
    * 나무, 박완서
    * 데미안, 헤르만 헤세
    * 어떻게 살 것인가, 유시민
    */
    
    /*bookArray2
    * 태백산맥, 조정래
    * 데미안, 헤르만 헤세
    * 어떻게 살 것인가, 유시민
    */
}

 

5. 향상된 for문

for(변수:배열){
    반복 실행문;
}
public static void main(String[] args){
    String[] strArray = {"Java", "Android", "C", "JavaScript", "Python"};
    
    for(String lang : strAarray){
        System.out.println(lang);
    }
}

 

6. 다차원 배열

- 이차원 이상으로 구현한 배열.

- 평면이나 공간 개념을 구현하는데 사용.

//자료형[][] 배열이름 = new 자료형[행 개수][열 개수]
int[][] arr = new int[2][3]; 

int[][] arr2 = {{1,2,3},{4,5,6}};
  arr2[x][0] arr2[x][1] arr2[x][2]
arr2[0][x] 1 2 3
arr2[1][x] 4 5 6

 

7. ArrayList 클래스

- java.util 패키지에 구현되어있는 클래스. (import java.util.ArrayList;)

- 객체 배열을 관리할 수 있는 멤버변수와 메서드를 제공.

- 배열의 길이와 상관없이 객체를 추가할 수 있음.

- 어떤 요소값이 제거되면 그 다음 요소값을 하나씩 앞으로 이동하는 코드도 이미 구현되어있음.

//ArrayList<E> 배열이름 = new ArrayList<E>();
ArrayList<Book> library = new ArrayList<Book>();

 

메서드 설명  
boolean add(E e) 요소 하나를 배열에 추가. E는 요소의 자료형 의미. library.add(new Book("A", "B"));
int size() 배열에 추가된 요소 전체 개수를 반환. 유효한값 개수. library.size();
E get(int index) 배열의 index 위치에 있는 요소 값 반환 library.get(0);
E remove(int index) 배열의 index 위치에 있는 요소값을 제거하고 그 값을 반환 library.remove(0);
boolean isEmpty() 배열이 비어있는지 확인 library.isEmpty();

 

References

 DO it! 자바 프로그래밍 입문, 이지스퍼블리싱
반응형

'Java' 카테고리의 다른 글

[Java] 07. 다형성  (0) 2020.12.13
[Java] 06. 상속  (0) 2020.12.08
[Java] 04. 클래스와 객체  (1) 2020.12.06
[Java] 03. 조건문 / 반복문  (0) 2020.12.04
[Java] 02. 자바의 연산자  (0) 2020.12.04